Реализация программного модуля, на встроенном языке программирования Visual Basic for Application (VBA), страница 2

Если план неоптимален.

Для улучшения плана надо "загрузить" то ребро без стрелки, которому соответствует отрицательная характеристика. Если таких ребер несколько, то выбирается ребро с наибольшей по абсолютной величине отрицательной характеристикой и к нему подрисовывается новая стрелка. При этом образуется замкнутый контур из стрелок. Новая стрелка направляется от вершины с меньшим потенциалом к вершине с большим потенциалом.

При определении величины поставки для "загружаемого " ребра рассматриваются все стрелки образовавшегося контура (если на сети — опорный план, то такой контур всегда существует, причем только один!), имеющие направление, противоположное направлению новой стрелки, и среди них находится стрелка с наименьшей поставкой - А. Выбранная таким образом величина прибавляется ко всем поставкам со стрелками, имеющими то же направление, что и новая стрелка, и вычитается из поставок в стрелках, имеющих противоположное направление. Поставки в стрелках, не входящих в контур, сохраняются неизменными. Стрелка, по которой выбрано число А, ликвидируется, и общее число стрелок остается прежним.

Новый опорный план исследуется на оптимальность подобно предыдущему. Практически удобнее вести расчеты с положительными числами, поэтому значение первого (выбираемого произвольно) потенциала лучше брать равным не нулю, а какому-либо положительному числу.

Вырождение плана транспортной задачи в сетевой постановке внешне проявляется в том, что при полном использовании запасов и полном удовлетворении потребностей количество стрелок оказывается меньше, чем n - 1, где n - общее число вершин (включая и нулевые).

Способ преодоления вырождения весьма прост: дополнительно вводится нужное количество стрелок с нулевыми поставками. Направления стрелок выбираются произвольно, однако они не должны образовывать замкнутый контур.

В случае открытой модели вводят фиктивного потребителя (поставщика) со спросом, равным небалансу. Фиктивный потребитель (поставщик) соединяется ребрами непосредственно со всеми поставщиками (потребителями). При этом показатели Cij ребер, соединяющих фиктивного потребителя (поставщика) с поставщиками (потребителями), следует брать одинаковыми и сравнительно большими. Делается это для того, чтобы исключить возможность использования фиктивной вершины в качестве промежуточного пункта.

1.2 Входные данные

К входным данным относятся:

·  количество поставщиков (от 1 до 6);

·  количество потребителей (от 1 до 6);

·  тарифы дорог;

·  количество груза, имеющийся у каждого поставщика;

·  потребность потребителей.

Количество поставщиков, потребителей  и тарифы дорог должны быть целочисленным значением и неотрицательные.

1.3 Выходные данные

Выходным данными является.

·  путь движения груза от поставщика к потребителю;

·  затраты на перевозку.

1.4 Обработка ошибок

При выполнении программного модуля необходимо предусмотреть обработку следующих ошибок: неправильный ввод исходных данных. В этом случае следует подсветить место ошибки цветом и повторить ввод данных, а также пользователь имеет возможность получить информацию об ошибке. Для получения описания ошибки, пользователь должен в меню “Опции” установить в соответствующем поле флажок.

Сообщения об ошибках будут выдаваться пользователю до тех пор, пока он не введёт правильное значение.

Основные ошибки и реакция программы на них указаны в таблице 1.

Таблица 1 – Основные ошибки и реакция программы на них