Решение транспортной задачи методом потенциалов Решение транспортной задачи методом потенциалов
Решение транспортной задачи методом потенциалов РЕФЕРАТЫ РЕКОМЕНДУЕМ  
 
Тема
 • Главная
 • Авиация
 • Астрономия
 • Безопасность жизнедеятельности
 • Биографии
 • Бухгалтерия и аудит
 • География
 • Геология
 • Животные
 • Иностранный язык
 • Искусство
 • История
 • Кулинария
 • Культурология
 • Лингвистика
 • Литература
 • Логистика
 • Математика
 • Машиностроение
 • Медицина
 • Менеджмент
 • Металлургия
 • Музыка
 • Педагогика
 • Политология
 • Право
 • Программирование
 • Психология
 • Реклама
 • Социология
 • Страноведение
 • Транспорт
 • Физика
 • Философия
 • Химия
 • Ценные бумаги
 • Экономика
 • Естествознание




Решение транспортной задачи методом потенциалов


П Л А Н
1. Общая  характеристика  распределительной  задачи.
2.
Транспортная  задача  как 
частный  случай  общей 
распределительной  задачи:
   а) Составление 
опорного  плана.
   б) Распределительный 
метод  достижения  оптимального плана.
3. Решение  транспортной  задачи 
методом  потенциалов:
а) Транспортная задача  с правильным балансом.
б) Транспортная задача  с неправильным балансом..
4. Решение  транспортной  задачи с помощью ЭВМ:
а) Постановка задачи.
б) Программа на языке
Pascal.
в) Выполнение программы.
1. Общая  характеристика  распределительной  задачи.
Распределительные   задачи 
связаны  с  распределением  ресурсов  по  работам, которые  необходимо  выполнить.
Задачи   этого  класса  возникают  тогда, когда  имеющихся  в  наличии 
ресурсов  не  хватает 
для  выполнения   каждой 
работы  наиболее   эффективным  образом. Поэтому 
целью  решения  задачи, является  отыскания  такого  распределения  ресурсов  по  работам, при  котором  либо  минимизируются  общие  затраты,
связанные  с  выполнением  работ,
либо  максимизируется  получаемый 
в  результате  общий 
доход.
Типичная  распределительная   задача.
Таблица №1 Работы, которые нужно выполнить Объём Ресурсы J1 J2 ... Jj ... Jn имеющихся ресурсов R1 R2 ... Ri ... Rm C1,1 C2,1 ... Ci,1 ... Cm,1 C1,2 C2,2 ... Ci,2 ... Cm,2 ... ... ... ... ... ... C1,j C2,j ... Ci,j ... Cm,j ... ... ... ... ... ... C1,n C2,n ... Ci,n ... Cm,n b1 b2 ... bi ... bm Объём  требуемых ресурсов a1 a2 ... aj ... an
Большинство  распределительных  задач  можно  представить 
в  виде  матриц, приведённых 
в  таблице №1.
Элементы  Сi,j, стоящие в клетках  матрицы, 
соответствуют  затратам  или 
доходу, отвечающим  выделению,
одной  единицы  ресурса  Ri   на работу Jj .  Величины  Сi,j  могут  быть 
независимыми   или  зависимыми. Так, например, затраты,
обусловленные  назначением  одной 
автомашины  на  некоторый 
маршрут  доставки  грузов, не 
зависят  от  того 
какие  машины  назначены 
на  обслуживание  других 
маршрутов. В  то  же 
время  при  распределение  средств  между  подразделениями  фирмы  доход  от 
затрат   определённого  количества 
денег  одним  её 
подразделением (скажем 
производством)  обычно  зависит 
от  того, какие  средства 
будут  затрачены  другими 
подразделениями  (скажем  отделом 
сбыта). В  теории  распределения  рассматриваются 
преимущественно  задачи  с  независимыми  затратами 
и  доходами. Это  объясняется 
не  тем, что  такие 
задачи  более  важны, 
а  лишь  тем,  что  для 
них  значительно  легче 
строить  модели    и 
получать  решения.
Если  затраты 
(или  доход), определяемые  объёмом  Xi,j   ресурса  i, выделенного  на 
выполнение  работы  Jj, ровны  Xi,j * Ci,j , то  имеем линейную  распределительную  задачу. Распределительные 
задачи  с независимыми  линейными 
функциями  затрат (или  дохода) стали  объектом, наиболее 
интенсивных  исследований, в  виду 
того  что  для 
их  решения  были 
развиты  эффективные,
итеративные  методы  линейного 
программирования. Однако 
имеются  также  методы 
решения  некоторых  нелинейных 
распределительных  задач, в  том 
числе  методы  основанные 
на  линейной  аппроксимации.
Распределение  ресурсов 
для  одного  периода 
времени  может  влиять 
на  распределения  ресурсов 
для  последующих  периодов, а 
может  не  оказывать 
на  них  никакого  влияния. Если  каждое 
из  последовательности  распределений  не зависит  от  всех остальных, то  такая  задача  называется 
статистической, в 
противном  случае  имеем  динамическую 
распределительную  задачу.
Статистические  задачи  исследованы 
в  большей  степени, чем  динамические, но  для  решения 
некоторых  типов  динамических  задач  успешно  применяются 
методы  линейного  динамического  и  динамического  программирования. Для  решения 
некоторых  динамических  задач 
применяют  методы  стохастического  программирования. В 
таких  задачах  принятие 
решений  основано  на 
вероятностных  оценках  будущих 
значений  параметров,
имеющих  фиксированное  распределение   вероятностей.
Основные методы решения  распределительных  задач, в  частности  линейного 
программирования, построены 
на  допущении, что  объёмы, имеющихся  в  наличии ресурсов (bi), требуемые  объёмы (aj )  и  затраты  (Ci,j ) точно 
известны.
Если общий объём наличных
ресурсов Sbi (i=1...m) равен общей  потребности в них Saj
(j=1...n), то
имеет место сбалансированная 
(зак-рытая) распределительная задача. Если  же  Saj
¹ Sbi , то задача называется несбалансированной (открытой). Если
ресурсы можно разделить между работами, то некоторые работы можно выполнять с
помощью различных комбинаций ресурсов. Если работы и ресурсы измеряются  в 
единицах  одной и той же шкалы,
то такие задачи обычно  называют  транспортными  или задачами разложения. Если же работы  и ресурсы выражаются в различных единицах
измерениях, то задача  называется общей
распределительной задачей.  Таким
образом транспортная задача является частным случаем общей
распределительной  задачи.
 2. Транспортная задача как частный случай
общей 
распределительной задачи
Транспортная  задача 
ставится  следующим  образом: имеется  m 
пунктов  отправления   А1, А2 , ..., Аm ,   в  которых 
сосредоточены  запасы  каких-то 
однородных  грузов  в 
количестве  соответственно  а1, а2,
... , аm  единиц.
Имеется   n  пунктов  назначения  В1 , В2
, ... , Вn  подавшие  заявки 
соответственно  на  b1 , b2
, ... , bn единиц  груза. Известны  стоимости 
Сi,j  
перевозки  единицы   груза   
от  каждого  пункта 
отправления  Аi   до 
каждого   пункта  назначения 
Вj . Все 
числа  Сi,j,
образующие   прямоугольную  таблицу 
заданы. Требуется  составить  такой 
план  перевозок   (откуда, куда  и  сколько  единиц 
поставить), чтобы  все  заявки 
были  выполнены, а  общая 
стоимость  всех  перевозок 
была  минимальна.
Рассмотрим  сначала 
решение  закрытой  транспортной  задачи, 
т.е. когда  сумма  всех 
заявок  ровна  сумме 
всех  запасов .
Составление опорного плана.
Решение  транспортной  задачи   начинается  с 
нахождения  опорного  плана. Для 
этого  существуют  различные 
способы. Например, способ “северо-западного  угла”, способ  минимальной  стоимости 
по  строке, способ  минимальной  стоимости  по  столбцу 
и  способ  минимальной 
стоимости  таблицы.  Рассмотрим 
простейший, так  называемый  способ 
северо-западного  угла.
Пояснить  его  проще  всего  будет 
на  конкретном  примере:
Условия  транспортной  задачи  заданы
транспортной  таблицей.
Таблица №2        ПН   ПО В1   В2 В3 В4 В5 Запасы аi      А1 10 8 5 6 9 48      А2 6 7 8 6 5 30      А3 8 7 10 8 7 27      А4 7 5 4 6 8 20  Заявки           bj 18 27 42 12 26 125
Будем  заполнять 
таблицу  перевозками  постепенно 
начиная  с  левой 
верхней ячейки (“северо-западного угла“ 
таблицы). Будем  рассуждать  при 
этом  следующим  образом. Пункт  В1   подал  заявку   
на  18 единиц груза. Удовлетворим
эту заявку за счёт запаса 48, имею-щегося 
в  пункте  А1 , и  запишем 
перевозку  18 в  клетке (1,1). После  этого 
заявка  пункта  В1  удовлетворена , а  в  пункте 
А1 
осталось  ещё  30 
единиц  груза. Удовлетворим  за  счёт  них 
заявку  пункта  В2 (27  единиц), запишем  27  в  клетке (1,2); оставшиеся  3 
единицы  пункта  А1  назначим  пункту  В3. В составе  заявки 
пункта  В3  остались 
неудовлетворёнными  39  единиц. 
Из  них  30  покроем  за 
счёт  пункта  А2, чем  его 
запас  будет  исчерпан, и   ещё  9  возьмём 
из  пункта  А3. Из  оставшихся 
18  единиц  пункта 
А3  12  выделим 
пункту  В4;  оставшиеся 
6  единиц  назначим 
пункту  В5,  что 
вместе  со  всеми 
20  единицами  пункта 
А4 
покроет  его  заявку. 
На  этом  распределение  запасов  закончено;  каждый 
пункт  назначения   получил 
груз  согласно  своей 
заявки. Это  выражается  в 
том, что  сумма  перевозок 
в  каждой  строке 
равна   соответствующему   запасу, а 
в  столбце — заявке. Таким  образом, нами  сразу  же  составлен 
план  перевозок,  удовлетворяющий  балансовым  условиям.
Полученное  решение  является 
опорным  решением  транспортной  задачи:  
     
Òàáëèöà
¹3        ПН   ПО В1   В2 В3 В4 В5 Запасы аi      А1 10       18 8      27 5      3 6 9 48      А2 6 7 8     30 6 5 30      А3 8 7 10       9 8     12 7       6 27      А4 7 5 4 6 8      20 20  Заявки           bj 18 27 42 12 26 125
Составленный нами план
перевозок, не является оптимальным по 
стоимости, так  как  при 
его   построении  мы 
совсем  не  учитывали 
стоимость   перевозок  Сi,j .
Другой способ — способ
минимальной стоимости по строке — основан на том, что мы распределяем продукцию
от пункта Ai не в любой из пунктов Bj, а в тот, к
которому стоимость перевозки минимальна. Если в этом пункте заявка полностью
удовлетворена, то мы убираем его из расчетов и находим минимальную стоимость
перевозки из оставшихся пунктов Bj. Во всем остальном этот метод
схож с методом “северо-западного угла”. В результате, опорный план,
составленный способом минимальной стоимости по строке выглядит как показано в таблице
4.
При этом методе может
получиться, что стоимости перевозок Ci,j  и Ci,k от пункта Ai к пунктам Bj
и Bk равны. В этом случае, с экономической точки зрения, выгоднее
распределить продукцию в тот пункт, в котором заявка больше. Так, например, в
строке 2:  C2,1 = C2,4,
но заявка b1 больше заявки b4, поэтому 4 единицы
продукции мы распределим в клетку (2,1).
Òàáëèöà
¹4        ПН   ПО В1   В2 В3 В4 В5 Запасы аi      А1 10 8 5      42 6 6 9 48      А2 6 4 7 8 6 5 26 30      А3 8 7 27 10 8 7 0 27      А4 7 14 5 4 6 6 8 20  Заявки           bj 18 27 42 12 26 125
Способ минимальной стоимости
по столбцу аналогичен преды-дущему способу. Их отличие состоит в том, что во
втором способе мы распределяем продукцию от пунктов Bi к пунктам Aj  по минимальной стоимости Cj,i.
Опорный план, составленный способами минимальных стоимостей, обычно более
близок к оптимальному решению. Так в нашем примере общие затраты на
транспортировку по плану, составленному первым способом F0 = 1039, а
по второму — F0 = 723.
Клетки  таблицы, в 
которых  стоят  ненулевые 
перевозки,  являются  базисными.
Их  число  должно  равняться   m + n - 1.  Необходимо отметить 
также, что встречаются 
такие  ситуации, когда
количество  базисных    клеток 
меньше  чем  m + n - 1. В этом   случае распределительная  задача   
называется  вырожденной.  И следует 
в  одной  из 
свободных  клеток поставить  количество 
перевозок  равное нулю. Так,
например, в таблице №4:
m + n - 1 = 4 + 5 - 1 = 8,
а базисных клеток 7, поэтому нужно в одну из клеток
строки 3 или столбца 2 поставить значение “0”. Например в клетку (3,5).
Составляя план по способам
минимальных стоимостей в отличии от плана по способу “северо-западного угла” мы
учитываем стоимости перевозок Ci,j, но все же не можем утверждать,
что составленный нами план является оптимальным.
Распределительный  метод 
достижения
 оптимального плана
 
 Теперь  попробуем  улучшить план, составленный способом
северо-западного угла”. Перенесем, например, 18  единиц  из  клетки 
(1,1)  в  клетку 
(2,1)  и  чтобы 
не  нарушить  баланса 
перенесём   те  же 
18  единиц  из 
клетки  (2,3)  в 
клетку  (1,3). Получим  новый 
план. Подсчитав  стоимость  опорного 
плана (она  ровняется 1039)  и 
стоимость  нового  плана (она 
ровняется  913) нетрудно  убедиться 
что  стоимость  нового 
плана  на 126  единиц 
меньше. Таким  образом  за 
счёт  циклической  перестановки  18  единиц  груза 
из  одних  клеток 
в  другие   нам 
удалось  понизить  стоимость 
плана:
Таблица №5        ПН   ПО В1   В2 В3 В4 В5 Запасы аi      А1 10       8      27 5      21 6 9 48      А2 6      18 7 8     12 6 5 30      А3 8 7 10       9 8     12 7       6 27      А4 7 5 4 6 8      20 20  Заявки           bj 18 27 42 12 26 125
  На  этом   способе 
уменьшения  стоимости   в 
дальнейшем  и  будет основан алгоритм оптимизации плана
перевозок. Циклом  в 
транспортной  задаче  мы 
будем  называть  несколько занятых  клеток,  соединённых  замкнутой 
ломанной  линией, которая  в 
каждой  клетке  совершает 
поворот  на  90°.
Существует  несколько 
вариантов цикла : 
                            
1.)                        2.)                                 3.)
Нетрудно  убедиться, что  каждый цикл имеет чётное число 
вершин   и  значит , чётное  число  звеньев (стрелок).
Условимся  отмечать  знаком 
+”  те  вершины  цикла, в  которых 
перевозки необходимо  увеличить,  а 
знаком “-“  те  вершины , в 
которых  перевозки  необходимо уменьшить. Цикл с отмеченными
вершинами будем называть “означенным”. Перенести  какое-то  количество  единиц груза по  означенному  циклу —  это 
значит  увеличить  перевозки, стоящие в положительных  вершинах цикла, на  это  количество  единиц, а 
перевозки, стоящие  в  отрицательных  вершинах  уменьшить  на 
то  же  количество. Очевидно, при 
переносе  любого  числа 
единиц  по  циклу 
равновесие  между  запасами 
и заявками не  меняется: по  прежнему 
сумма  перевозок  в 
каждой  строке  равна 
запасам  этой  строки, а 
сумма  перевозок  в 
каждом  столбце — заявке  этого 
столбца. Таким  образом при любом
циклическом переносе, оставляющем перевозки неотрицательными  допустимый 
план  остаётся  допустимым. Стоимость  же 
плана  при  этом 
может  меняться:
увеличиваться  или  уменьшатся. Назовём  ценой 
цикла  увеличение  стоимости 
перевозок  при  перемещении 
одной  единицы  груза 
по  означенному  циклу. Очевидно цена  цикла 
ровна  алгебраической  сумме 
стоимостей, стоящих  в  вершинах 
цикла, причём  стоящие  в 
положительных  вершинах  берутся 
со  знаком “+”, а  в 
отрицательных со  знаком  “-“. Обозначим  цену  цикла  через g. При  перемещении 
одной  единицы  груза 
по  циклу  стоимость 
перевозок  увеличивается  на 
величину  g. При 
перемещении  по  нему 
k единиц  груза  стоимость 
перевозок  увеличиться  на  kg. Очевидно, для  улучшения 
плана  имеет  смысл 
перемещать  перевозки  только по тем циклам, цена  которых отрицательна. Каждый  раз, когда 
нам удаётся совершить такое перемещение стоимость плана уменьшается  на 
соответствующую  величину  kg. Так 
как перевозки не могут  быть  отрицательными,  мы  будем  пользоваться  только  такими  циклами, 
отрицательные  вершины   которых 
лежат  в  базисных 
клетках  таблицы, где  стоят 
положительные  перевозки.
Если  циклов  с  отрицательной  ценой 
в  таблице  больше 
не  осталось, это  означает, что  дальнейшее улучшение плана невозможно, то есть оптимальный
план  достигнут.
Метод  последовательного  улучшения  плана  перевозок 
и  состоит  в 
том,  что  в 
таблице  отыскиваются  циклы 
с  отрицательной  ценой, по 
ним  перемещаются  перевозки, и план улучшается  до 
тех пор  пока  циклов 
с  отрицательной  ценой 
уже  не  останется. При  улучшении  плана циклическими переносами, как правило,
пользуются приёмом, заимствованным из 
симплекс-метода:  при  каждом 
шаге (цикле) заменяют  одну  свободную 
переменную  на  базисную, то  есть  заполняют  одну 
свободную  клетку  и 
взамен  того  освобождают 
одну  из  базисных 
клеток. При  этом  общее 
число  базисных   клеток 
остаётся   неизменным  и равным 
m + n - 1 . Этот  метод  удобен 
тем, что  для  него 
легче  находить  подходящие 
циклы.
Можно  доказать, что  для  любой  свободной 
клетке  транспортной  таблице 
всегда  существует  цикл 
и  притом  единственный, одна  из  вершин  которого 
лежит  в  этой 
свободной  клетке, а  все 
остальные  в  базисных 
клетках. Если  цена  такого 
цикла, с  плюсом  в  свободной  клетке, отрицательна, то  план 
можно  улучшить  перемещением  перевозок  по  данному 
циклу. Количество  единиц  груза 
k, которое  можно переместить,
определяется минимальным значением перевозок, стоящих в отрицательных вершинах
цикла (если переместить  большее  число 
единиц  груза, возникнут  отрицательные  перевозки).
Применённый выше метод
отыскания оптимального решения 
транспортной  задачи  называется 
распределённым; он 
состоит  в  непосредственном  отыскании  свободных  клеток 
с  отрицательной  ценой 
цикла  и  в 
перемещении  перевозок  по 
этому  циклу.
Распределительный  метод 
решения  транспортной  задачи, с 
которым мы познакомились обладает одним недостатком: нужно  отыскивать 
циклы  для   всех 
свободных  клеток  и 
находить  их  цены. От 
этой  трудоёмкой  работы 
нас  избавляет  специальный 
метод  решения  транспортной  задачи, который 
называется  методом  потенциалов.
Решение  транспортной  задачи 
методом  потенциалов.
 Транспортная задача  с
правильным балансом.
 
Этот  метод 
позволяет  автоматически  выделять 
циклы  с  отрицательной  ценой  и определять  их 
цены.
Пусть  имеется 
транспортная  задача  с 
балансовыми  условиями    
å xi,j  = ai  ( i=1..m ; j=1..n );   
å xi,j =bj 
( j=1..n ; 1..m ),
причём  å ai
= å bj  — òî
åñòü çàêðûòàÿ
çàäà÷à.
Стоимость  перевозки 
единицы  груза  из  Ai   в  Bj  равна  C i,j ; таблица  стоимостей 
задана. Требуется  найти  план 
перевозок (xi,j ), который  удовлетворял  бы   балансовым  условиям 
и  при  этом  стоимость  всех 
перевозок  бала  минимальна.
Идея  метода 
потенциалов  для  решения 
транспортной задачи 
сводиться  к  следующему. Представим  себе что 
каждый  из пунктов  отправления 
Ai  вносит 
за  перевозку  единицы 
груза (всё  ровно  куда) 
какую-то  сумму  ai ;  в 
свою  очередь  каждый 
из  пунктов  назначения 
Bj   также  вносит  за 
перевозку  груза  (куда 
угодно)  сумму  bj .
Эти платежи передаются некоторому третьему лицу (“перевозчику“). Обозначим   ai  + bj  =  či,j  (
i=1..m ;j=1..n)  и  будем  называть  величину či,j  “псевдостоимостью” перевозки
единицы груза из Ai  в Bj . Заметим, что  платежи  
ai   и  bj   не  обязательно  должны 
быть  положительными; не  исключено, что  “перевозчик”  сам  платит 
тому  или  другому 
пункту  какую-то  премию 
за  перевозку. Также  надо 
отметить, что  суммарная  псевдостоимость  любого допустимого плана перевозок  при  заданных  платежах 
(ai   и  bj  )  одна  и  та 
же  и  от  плана  к  плану  не 
меняется.
До сих пор  мы никак не связывали  платежи (ai  и bj ) и псевдостоимости či,j  с истинными стоимостями
перевозок C i,j.
Теперь мы  установим  между ними связь. Предположим, что план (xi,j) невырожденный (число базисных клеток в таблице перевозок ровно (m + n -1).
Для всех  этих  клеток  xi,j  >0.
Определим
платежи (ai   и bj ) так, чтобы во всех базисных
клетках псевдостоимости были ровны стоимостям:
či,j = ai  + bj  = сi,j ,  при   xi,j  >0.
Что касается свободных  клеток  (где xi,j  = 0), то  в 
них  соотношение  между 
псевдостоимостями  и  стоимостями 
может  быть  какое 
угодно.
Оказывается соотношение
между псевдостоимостями и стоимостями в свободных клетках показывает, является
ли план оптимальным  или  же 
он  может  быть 
улучшен. Существует 
специальная  теорема:  Если 
для  всех  базисных 
клеток   плана  (xi,j  > 0) 
ai  + bj  = či,j=
сi,j ,
а  для  всех 
свободных  клеток  ( xi,j =0) 
ai  + bj  = či,j≤ сi,j ,
то  план
является оптимальным  и никакими способами улучшен быть не  может. 
Нетрудно  показать, что  это 
теорема  справедлива  также 
для  вырожденного  плана, и 
некоторые из базисных переменных 
ровны  нулю. План  обладающий 
свойством : 
                       či,j=
сi,j (для  всех 
базисных  клеток ) (1)
                       či,j≤ сi,j ( для 
всех  свободных  клеток ) (2) 
называется  потенциальным  планом, а 
соответствующие  ему  платежи 
( ai  и bj  ) — потенциалами  пунктов  Ai   и Bj  ( i=1,...,m ; j=1,...,n ). Пользуясь  этой 
терминологией 
вышеупомянутую  теорему  можно 
сформулировать  так: Всякий  потенциальный  план  является  оптимальным. Итак, для  решения 
транспортной  задачи  нам 
нужно  одно — построить  потенциальный   план. Оказывается 
его  можно  построить 
методом  последовательных  приближений, задаваясь  сначала 
какой-то  произвольной  системой 
платежей, удовлетворяющей 
условию (1). При  этом  в 
каждой  базисной  клетке 
получиться  сумма  платежей, равная  стоимости  перевозок  в 
данной  клетке;  затем, улучшая  план  следует  одновременно  менять  систему  платежей. Так, что  они  приближаются  к 
потенциалам. При  улучшении  плана 
нам  помогает  следующее 
свойство  платежей  и 
псевдостоимостей: Какова  бы ни 
была  система  платежей 
(ai  и bj )  удовлетворяющая  условию
(1), для  каждой  свободной 
клетки  цена  цикла 
пересчёта  равна  разности 
между стоимостью и псевдостоимостью в данной клетке : gi,j=  сi,j - či,j.
Таким образом при пользовании
методом потенциалов для решения транспортной задачи отпадает наиболее  трудоёмкий 
элемент распределительного 
метода: поиски 
циклов  с  отрицательной  ценой.
Процедура  построения 
потенциального 
(оптимального)  плана  состоит 
в  следующем.
В  качестве  первого  приближения 
к  оптимальному  плану   
берётся  любой  допустимый 
план (например,  построенный  способом 
минимальной стоимости по строке). В этом плане  m + n - 1 базисных клеток, где m —  число  строк, n — число
столбцов  транспортной  таблицы. Для  этого  плана  можно 
определить  платежи  (ai  и bj ),  так, чтобы  в  каждой 
базисной  клетке  выполнялось 
условие :
ai  + bj  = сi,j   (3)
Уравнений (3)  всего 
m + n - 1, а 
число  неизвестных  равно m +
n.  Следовательно, одну  из 
этих  неизвестных  можно 
задать  произвольно  (например, равной  нулю). После  этого  из  m + n -
1 уравнений  (3)  можно 
найти  остальные  платежи  
ai  , bj , а  по 
ним  вычислить  псевдостоимости:  či,j= ai  + bj   для  каждой  свободной 
клетки.
Òàáëèöà
¹6        ПН   ПО В1   В2 В3 В4 В5 ai      А1 10 č = 7 8 č = 6 5      42 6 6 9 č = 6 0      А2 6 4 7 č = 5 8 č = 4 6 č = 5 5 26 -1      А3 8 č = 8 7 27 10 č = 6 8 č = 7 7 0 1      А4 7 14 5 č = 6 4 č = 5 6 6 8 č = 6 0 bj 7 6 5 6 6
Если  оказалось, что все  эти псевдостоимости 
не  превосходят  стоимостей
či,j £ сi,j
,                            £
³
то  план  потенциален 
и, значит, оптимален. Если 
же  хотя  бы в одной 
свободной  клетке  псевдостоимость  больше  стоимости (как в
нашем примере), то  план не  является 
оптимальным  и  может 
быть  улучшен  переносом 
перевозок  по  циклу, соответствующему  данной 
свободной  клетке. Цена   этого 
цикла ровна разности между стоимостью и псевдостоимостью в этой  свободной 
клетке.
В таблице №6 мы
получили в двух клетках či,j ³ сi,j
, теперь можно построить цикл в любой из этих двух клеток. Выгоднее всего
строить цикл в той клетке, в которой разность či,j - сi,j  ìàêñèìàëüíà.
 íàøåì
ñëó÷àå â
îáîèõ êëåòêàõ
ðàçíîñòü
îäèíàêîâà (ðàâíà
1), ïîýòîìó, äëÿ
ïîñòðîåíèÿöèêëà
âûáåðåì,
íàïðèìåð,
êëåòêó (4,2):
Òàáëèöà
¹7        ПН   ПО В1   В2 В3 В4 В5 ai      А1 10 8 5      42 6 6 9 0      А2 6        + 4 7 8 6 5        - 26 -1      А3 8 7        - 27 10 8 7         + 0 1      А4 7        - 14 5        + û 4 6 6 8 0 bj 7 6 5 6 6
Теперь будем перемещать по
циклу число 14, так как оно является минимальным из чисел, стоящих в клетках,
помеченных знаком  - . Приперемещении мы
будем вычитать 14 из клеток со знаком 
-  и прибавлять к клеткам со
знаком  + .
После этого необходимо
подсчитать потенциалы ai  и bj è öèêë ðàñ÷åòîâ
ïîâòîðÿåòñÿ.
Итак, мы  приходим 
к следующему алгоритму 
решения  транспортной  задачи 
методом  потенциалов.
1.
Взять  любой  опорный  план  перевозок, в  котором  отмечены   m + n - 1  базисных 
клеток  (остальные  клетки 
свободные).
2.
Определить для  этого  плана 
платежи  (ai  и bj )  исходя 
из  условия,  чтобы 
в  любой  базисной 
клетке  псевдостоимости  были 
равны  стоимостям. Один  из 
платежей  можно  назначить 
произвольно, например, положить 
равным  нулю.
3.
Подсчитать  псевдостоимости   či,j =  ai  + bj   для  всех 
свободных  клеток. Если  окажется, что  все они не превышают стоимостей, то план  оптимален.
4.
Если хотя бы в одной свободной клетке псевдостоимость превышает  стоимость, следует  приступить к улучшению плана путём  переброски  перевозок  по 
циклу, соответствующему 
любой  свободной  клетке 
с  отрицательной  ценой (для 
которой  псевдостоимость  больше 
стоимости).
5.
После  этого  заново 
подсчитываются  платежи  и 
псевдостоимости, и, если 
план  ещё  не 
оптимален, процедура улучшения продолжается  до  тех  пор, пока 
не  будет  найден 
оптимальный  план.
Так в нашем примере после 2
циклов расчетов получим оптимальный план вида:
При этом стоимость всей
перевозки изменялась следующим образом:    F0
= 723,
                                       F1 = 709,
                             F2 = Fmin = 703.
Следует отметить так же, что
оптимальный план может иметь и другой вид, но его стоимость останется такой же
Fmin = 703.
Транспортная задача  с неправильным балансом.
В  предыдущих  случаях  мы 
рассматривали  только  такую 
задачу  о  перевозках, в  которой  сумма  запасов 
ровна  сумме  заявок:
            å аi = å bj ( где i=1,...,m ; j=1,...,n )   (4)
Это 
класическая  транспортная  задача, иначе  называемая, транспортной 
задачей  с  правильным 
балансом. Встречаются  такие   варианты 
транспортной  задачи  где 
условие  (4)  нарушено. В 
этих  случаях  говорят 
о  транспортной  задаче   
с  неправильным  балансом.
Баланс  транспортной  задачи  может  нарушаться 
в  2-ух  направлениях:
          1. Сумма  запасов  в 
пунктах  отправления  превышает 
сумму  поданных  заявок
            å аi > å bj  ( где i=1,...,m
; j=1,...,n );
          2. Сумма  поданных  заявок  превышает 
наличные  запасы
                   å аi < å bj  ( где i=1,...,m
; j=1,...,n );
Условимся  первый 
случай  называть
Транспортной  задачей  с 
избытком  запасов“, а  второй — “Транспортной  задачей 
с  избытком  заявок”.
Рассмотрим  последовательно  эти  два  случая:
Транспортная  задача  
с  избытком  запасов.
В 
пунктах  A1,
A2, ... , Am  имеются  запасы груза  a1, a2, ... , am;  пункты  B1, B2, ... , Bn   подали 
заявки  b1,
b2, ... , bn, причём
 å аi > å bj ( где i=1..m ; j=1..n ).
Требуется  найти 
такой  план  перевозок (X), при  котором 
все  заявки  будут 
выполнены, а  общая  стоимость 
перевозок  минимальна.
Очевидно  при  этой  постановке  задачи некоторые условия-равенства
транспортной задачи превращаются  в  условия-неравенства, а  некоторые — 
остаются  равенствами.
 n
å Xi,j
≤ ai  (i=1,
... , m);  
        j=1
            m
å Xi,j
= bj  (j=1,
... , n). 
        i=1
Мы  умеем  решать  задачу 
линейного  программирования, в  какой 
бы  форме — равенств  или 
неравенств  ни  были 
бы  заданы  её 
условия. Поставленная 
задача   может  бать 
решена, например, обычным 
симплекс-методом. Однако, задачу 
можно  решить  проще, если 
искусственным  приёмом  свести 
её  к  ранее  рассмотренной  транспортной  задаче  с  правильным 
балансом.  Для  этого, сверх  имеющихся  n  пунктов 
назначения  В1, B2, ... , Bn, 
введём  ещё  
один, фиктивный, пункт 
назначения   Bn+1, которому   припишем  фиктивную 
заявку, равную  избытку  запасов 
над  заявками  
            bn+1 = å аi - å bj   ( где i=1,...,m
; j=1,...,n ) ,
а  стоимость  перевозок  из 
всех  пунктов  отправления 
в  фиктивный  пункт 
назначения  bn+1  будем  считать 
равным  нулю. Введением  фиктивного 
пункта  назначения  B n+1  с  его  заявкой 
b n+1  мы  сравняли 
баланс транспортной задачи и теперь его можно решать как обычную  транспортную  задачу  с  правильным 
балансом.
Транспортная  задача 
с  избытком  заявок .
Эту задачу можно свести к
обычной транспортной задаче с правильным 
балансом,  если  ввести 
фиктивный пункт отправления Am+1 с  запасом am+1 равным недостающему запасу и
стоимость перевозок из  фиктивного  пункта 
отправления  во  все 
пункты  назначения  принять 
равным  нулю.  
4. Решение  транспортной  задачи с помощью ЭВМ:
Постановка задачи.
Имеется  m 
пунктов  отправления   А1, А2 , ..., Аm ,   в  которых  сосредоточены  запасы 
каких-то  однородных  грузов 
в  количестве  соответственно  а1, а2, ... , аm  единиц. Имеется   n 
пунктов  назначения  В1 , В2
, ... , Вn 
подавшие  заявки  соответственно  на  b1 , b2 , ... , bn единиц  груза. Известны  стоимости  Сi,j   перевозки 
единицы   груза    от 
каждого  пункта  отправления 
Аi   до  каждого  
пункта  назначения  Вj . Все  числа 
Сi,j, образующие  
прямоугольную  таблицу  заданы.
Требуется составить такой план
перевозок  (откуда, куда и  сколько 
единиц  поставить), чтобы  все 
заявки  были  выполнены, а  общая  стоимость  всех 
перевозок  была  минимальна.
Составить программу, которая
бы вычисляла оптимальный план перевозки (потенциальный план).
Программа на языке Pascal:
Program
transportnaj_zadatsha;
Uses Crt;
Label l1;
Const N=6;
      n1=7; n2=7;
      Sa:longint=0;
      Sb:longint=0;
Type
predpr=Array [1..N] of longint;
     rasp=Array [1..N,1..N] of longint;
Var
A,B,alfa,betta,B_d,x:predpr;
    c,p:rasp;
    f,f0,x_min,Sp:longint;
    Nt,x_p,r,r_min,ki,kj,Na,Nb,h,l,i,j:byte;
    d:char;
    u:Array[1..N*N] of byte;
Procedure Nul
(var a:predpr);  {обнуляет массив}
var i:byte;
Begin
     for i:=1 to N do a[i]:=0;
End;
Procedure
PrintS (x,y:byte; s:string; c:byte);
Begin                    {вывод строки s}
     TextColor(c);
     GotoXY(x,y);
     Write(s);
End;
Procedure
Print (x,y:byte; n:byte; a:longint; c:byte);
Begin                    {вывод числа a}
     TextColor(c);
     GotoXY(x,y); Write(' ':n);
     GotoXY(x,y); Write(a);
End;
Procedure Rid
(var x:longint; y:byte); {проседура ввода числа x}
var
i:integer;
    s:string;
    c:char;
    j,k:byte;
Begin
     s:=''; i:=1;
     TextColor(11);
     Repeat
           c:=ReadKey;
           Case ord(c) of
48..57:         begin s:=s+c;
                      Write(c);
                      inc(i);
                end;
8:              if i>1 then begin dec(i);
                      Delete(s,i,1);
                      Write(chr(8),'
',chr(8));
                end;
           end;
           j:=WhereX;
           GotoXY(60,1); ClrEOL;
           if i>y then begin
              TextColor(4);
              Write('Не более ');
              for k:=1 to y-1 do Write('9');
              TextColor(11);
           end;
           GotoXY(j,1);
     Until (ord(c)=13) and (i<y+1);
     val(s,x,i);
End;
Procedure
goriz (a,b,c,d,e:char);       
{Процедуры goriz, wertic}
var
i,j:byte;                            {и
Tabl выводят таблицу}
Begin
     Write(a);
     for i:=1 to n2 do Write(b);
     Write(c);
     for i:=1 to Nb do begin
         for j:=1 to n1 do Write(b);
         if i<>Nb then Write(d) else
Write(c);
     end;
     for i:=1 to 4 do Write(b);
     Write(e);
End;
Procedure
wertic;
var i:byte;
Begin
     Write('¦',' ':n2,'¦');
     for i:=1 to Nb-1 do Write(' ':n1,'¦');
     WriteLn(' ':n1,'¦',' ' :4,'¦');
End;
Procedure
Tabl;
Begin
    ClrScr;
    TextColor(1);
    h:=6+Na*3;
    l:=14+Nb*7;
    GotoXY(1,3);
    for i:=3 to h do wertic;
    GotoXY(1,2);
    goriz('+','-','-','-','+');
    for i:=1 to Na+1 do begin
        GotoXY(1,i*3+2);
        if (i=1) or (i=Na+1)
           then goriz('¦','-','+','+','¦')
           else goriz('+','-','+','+','¦');
    end;
    GotoXY(1,h+1);
    goriz('+','-','-','-','+');
    TextColor(9);
    for i:=1 to Na do begin
        GotoXY(5,i*3+3);
        Write('A',i);
    end;
    for i:=1 to Nb do begin
        GotoXY(i*(n1+1)+n2-2,3);
        Write('B',i);
    end;
    l:=Nb*(n1+1)+n2+3;
    h:=Na*3+6;
    PrintS(4,3,'\Bj',9);
    PrintS(4,4,'Ai\',9);
    PrintS(1,1,'Таблица N1',14);
    PrintS(l,4,'alfa',9);
    PrintS(3,h,'betta',9);
End;
Procedure W_W
(var a:predpr; b:byte; c:char); {Ввод в таблицу}
var
i,l,m:byte;                              
{кол-ва продукции}
Begin                                        
{поставщ. и потреб.}
     for i:=1 to b do begin
         TextColor(3);
         GotoXY(32,1);
         ClrEOL;
         Write(c,i,'=  ');
         Rid(a[i],n1);
         TextColor(14);
         Case c of
'A':     GotoXY(n2-trunc(ln(a[i])/ln(10)),i*3+4);
'B':     GotoXY(n2+i*(n1+1)-trunc(ln(a[i])/ln(10)),4);
         end;
         Write(a[i]);
     end;
End;
Function
FF:longint;        {Вычисление стоимости
плана}
var i,j:byte;
    f:longint;
Begin
     f:=0;
     for i:=1 to Na do
         for j:=1 to Nb do
             if p[i,j]>0 then
inc(f,c[i,j]*p[i,j]);
     GotoXY(65,Nt+2);
     TextColor(10);
     Write('F',Nt,'=',f);
     FF:=f;
End;
Function
a_b:boolean;      {Расчет потенциалов}
var
k,i,j:byte;            {alfa и betta}
    Z_a,Z_b:predpr;
    d:boolean;
Begin
     Nul(Z_a); Nul(Z_b);
     alfa[1]:=0; Z_a[1]:=1; k:=1;
     Repeat
           d:=1=1;
           for i:=1 to Na do
               if Z_a[i]=1 then
                  for j:=1 to Nb do
                      if (p[i,j]>-1) and
(Z_b[j]=0) then begin
                         Z_b[j]:=1;
                        
betta[j]:=c[i,j]-alfa[i];
                         inc(k);
                         d:=1=2;
                      end;
           for i:=1 to Nb do
               if Z_b[i]=1 then
                  for j:=1 to Na do
                      if (p[j,i]>-1) and
(Z_a[j]=0) then begin
                         Z_a[j]:=1;
                        
alfa[j]:=c[j,i]-betta[i];
                         inc(k);
                         d:=1=2;
                      end;
     Until (k=Na+Nb) or d;
     if d then begin
        i:=1;
        While Z_a[i]=1 do inc(i);
        j:=1;
        While Z_b[j]=0 do inc(j);
        p[i,j]:=0;
       
Print((j+1)*(n1+1)+n2-8,i*3+4,1,p[i,j],7);
     end;
     a_b:=d;
End;
Procedure
W_p;         {Вывод плана распределения}
var
i,j,h,l,k:byte;
    c_max:longint;
Begin
     k:=0;
     for i:=1 to Na do begin
         h:=i*3+4;
         for j:=1 to Nb do begin
             l:=j*(n1+1)+n2-5;
             GotoXY(l,h);
             Write(' ':n1);
             if p[i,j]>0 then begin
                inc(k);
               
Print(l-trunc(ln(p[i,j])/ln(10))+5,h,1,p[i,j],14);
             end
             else if p[i,j]=0 then begin
                    
Print(l+n1-2,h,1,p[i,j],14);
                     inc(k);
             end;
         end;
     end;
     While a_b do inc(k);
     if k>Na+Nb-1 then PrintS(40,1,'k >
n+m-1',12);
End;
Function
kkk(var ki,kj:byte):integer; {Расчет коэф. k}
var
i,j:byte;                         {в
свободных клетках}
    k,k_min:integer;
    b:boolean;
Begin
     b:=1=1;
     for i:=1 to Na do
         for j:=1 to Nb do
             if p[i,j]=-1 then begin
                k:=c[i,j]-alfa[i]-betta[j];
                if b then begin
                   b:=1=2;
                   ki:=i; kj:=j; k_min:=k;
                end else
                    if k<k_min then begin
                       k_min:=k;
                       ki:=i; kj:=j;
                    end;
                TextColor(6);
                GotoXY(j*(n1+1)+n2-5,i*3+4);
                Write('(',k,')');
             end;
     if k_min<0 then
PrintS(kj*(n1+1)+n2,ki*3+4,'X',12);
     kkk:=k_min;
End;
Procedure
div_mod(c:byte; var a,b:byte);  
{Перевод}
Begin                                      {одномерного
массива}
     b:=c mod Nb; a:=c div Nb +1;          {в двумерный}
     if b=0 then begin
        b:=Nb; dec(a);
     end;
End;
Procedure
Rek(Xi,Yi:byte; var z:boolean; var c:byte);
var i,j:byte;
Begin                    {Рекурсивная процедура.}
   z:=1=2;               {Определяет контур перемещения}
   Case c of
1:   for i:=1 to Na do
         if i<>Xi then
            if p[i,Yi]>-1 then begin
               if u[(i-1)*Nb+Yi]=0 then begin
                 
u[(Xi-1)*Nb+Yi]:=(i-1)*Nb+Yi;
                  c:=2;
                  Rek(i,Yi,z,c);
                  if z then exit;
               end;
            end
            else if (i=ki) and (Yi=kj) then
begin
                   
u[(Xi-1)*Nb+Yi]:=(ki-1)*Nb+kj;
                    z:=not z;
                    exit;
            end;
2:   for i:=1 to Nb do
         if i<>Yi then
            if p[Xi,i]>-1 then begin
               if u[(Xi-1)*Nb+i]=0 then begin
                 
u[(Xi-1)*Nb+Yi]:=(Xi-1)*Nb+i;
                  c:=1;
                  Rek(Xi,i,z,c);
                  if z then exit;
               end;
            end
            else if (Xi=ki) and (i=kj) then
begin
                   
u[(Xi-1)*Nb+Yi]:=(ki-1)*Nb+kj;
                    z:=not z;
                    exit;
            end;
   end;
   u[(Xi-1)*Nb+Yi]:=0;
   c:=c mod 2 +1;
End;
Procedure
kontur;       {Определяет контур
перемещения}
var
i,j,k,mi,mj,l:byte;
    z:boolean;
    p_m:longint;
Begin
     for i:=1 to N*N do u[i]:=0;
     l:=1;
     Rek(ki,kj,z,l);
     i:=ki; j:=kj;
     k:=u[(i-1)*Nb+j];
     div_mod(k,i,j);
     mi:=i; mj:=j; l:=1;
     Repeat
           inc(l);
           k:=u[(i-1)*Nb+j];
           div_mod(k,i,j);
           if l mod 2=1 then
              if p[i,j]<p[mi,mj] then begin
                 mi:=i; mj:=j;
              end;
     Until (i=ki) and (j=kj);
     i:=ki; j:=kj; l:=0;
     p_m:=p[mi,mj];
     Repeat
           if l mod 2=0 then begin
              inc(p[i,j],p_m);
             
PrintS((n1+1)*j+n2-1,i*3+3,'(+)',12);
           end else begin
               dec(p[i,j],p_m);
              
PrintS((n1+1)*j+n2-1,i*3+3,'(-)',12);
           end;
           if l=0 then inc(p[i,j]);
           k:=u[(i-1)*Nb+j];
           div_mod(k,i,j);
           inc(l);
     Until (i=ki) and (j=kj);
     p[mi,mj]:=-1;
End;
Procedure
Pauza;
var d:char;
Begin
     TextColor(6);
     GotoXY(40,1);
     Write('Нажмите любую клавишу');
     d:=ReadKey;
     GotoXY(40,1);
     ClrEOL;
End;
BEGIN
    Nul(alfa); Nul(betta);
    Nt:=1;
    ClrScr;
    TextColor(10);
    Repeat
       Write('Введите количество поставщиков
(2<=Na<=',N-1,')   ');
       ReadLn(Na);
       Write('Введите количество потребителей
(2<=Nb<=',N-1,')   ');
       ReadLn(Nb);
    Until (Na>1) and (Na<=N-1) and
(Nb>1) and (Nb<=N-1);
    Tabl;
(*******************
ввод начальных данных ******************)
    PrintS(1,1,'Введите количество
продукции:',3);
    W_W(A,Na,'A');
    W_W(B,Nb,'B');
    TextColor(3);
    GotoXY(1,1); ClrEOL;
    Write('Введите стоимость перевозки');
    for i:=1 to Na do
        for j:=1 to Nb do begin
            TextColor(3);
            GotoXY(29,1); ClrEOL;
            Write('A',i,' - B',j,'  ');
            Rid(c[i,j],5);
           
Print((n1+1)*j+n2-4,i*3+3,1,c[i,j],11);
        end;
(**********************************************************)
    GotoXY(1,1);
    ClrEOL;
    TextColor(14);
    Write('Таблица N1');
    for i:=1 to Na do Sa:=Sa+A[i];
    for i:=1 to Nb do Sb:=Sb+B[i];
    if Sa<>Sb then begin     {если задача является открытой}
       PrintS(20,1,'Открытая задача (Нажмите
любую клавишу)',7);
       d:=ReadKey;
       if Sa>Sb then begin
          inc(Nb);
          B[Nb]:=Sa-Sb;
          for i:=1 to Na do c[i,Nb]:=0;
       end else begin
           inc(Na);
           A[Na]:=Sb-Sa;
           for i:=1 to Nb do c[Na,i]:=0;
       end;
       Tabl;
       for i:=1 to Na do
           for j:=1 to Nb do
Print((n1+1)*j+n2-4,i*3+3,1,c[i,j],11);
       for i:=1 to Na do
          
Print(n2-trunc(ln(A[i])/ln(10)),i*3+4,1,A[i],14);
       for i:=1 to Nb do
           Print(n2+i*(n1+1)-trunc(ln(B[i])/ln(10)),4,1,B[i],14);
       PrintS(20,1,'Открытая задача',7);
    end
       else PrintS(20,1,'Закрытая задача',7);
(**************
cоставление опорного плана ****************)
    for i:=1 to Nb do B_d[i]:=B[i];
    for i:=1 to Na do begin
        for j:=1 to Nb do x[j]:=j;
        for j:=1 to Nb-1 do begin
            x_min:=c[i,x[j]];
            r_min:=j;
            for r:= j+1 to Nb do
                if (x_min>c[i,x[r]]) or
                 ((x_min=c[i,x[r]]) and
(B[x[r]]>b[x[r_min]])) then
                begin
                   x_min :=c[i,x[r]];
                   r_min:=r;
                end;
            x_p:=x[r_min];
            x[r_min]:=x[j];
            x[j]:=x_p;
        end;
        Sp:=0;
        for j:=1 to Nb do begin
            p[i,x[j]]:=B_d[x[j]];
            if p[i,x[j]]>A[i]-Sp then
p[i,x[j]]:=A[i]-Sp;
            inc(Sp,p[i,x[j]]);
            dec(B_d[x[j]],p[i,x[j]]);
        end;
    end;
(***********************************************************)
    for i:=1 to Na do
        for j:=1 to Nb do if p[i,j]=0 then
p[i,j]:=-1;
    W_p;
    f:=FF; f0:=F;
    While a_b do;
    for i:=1 to Na do
Print(l+1,i*3+3,3,alfa[i],14);
    for i:=1 to Nb do
Print(i*(n1+1)+n2-4,h,6,betta[i],14);
    Pauza;
(*******
постепенное приближение плана к оптимальному ******)
    While kkk(ki,kj)<0 do begin
          kontur;
          pauza;
          for i:=1 to Na do
             for j:=1 to Nb do
PrintS((n1+1)*j+n2-1,i*3+3,'   ',14);
          inc(Nt);
          GotoXY(1,1);
          Write('Таблица N',Nt);
          W_p;
          f0:=f; f:=FF;
          if a_b then Goto l1;
          for i:=1 to Na do
Print(l+1,i*3+3,3,alfa[i],14);
          for i:=1 to Nb do
Print(i*(n1+1)+n2-4,h,6,betta[i],14);
          Pauza;
    end;
(***********************************************************)
    PrintS(40,1,'Решение оптимально',12);
    PrintS(60,1,'(any key)',6);
    for i:=1 to Na do
        for j:=1 to Nb do if p[i,j]=-1 then
begin
            h:=i*3+4;
            l:=j*(n1+1)+n2-5;
            GotoXY(l,h);
            Write(' ':n1);
        end;
    GotoXY(40,1);
l1:
d:=ReadKey;
END.
Программа написана и
отлажена в среде Turbo Pascal 7.0.
Выполнение программы:
Первоначальное базисное решение транспортной задачи можно методом Москва Россия Москве. Решение транспортных задач по математике в экономике план перевозок с матрицей онлай. Работы по запросу решить транспортную задачу условия которой задаются таблицей. Решите транспортную задачу методом потенциалов Красноярск Россия Красноярске. Как определить по симплекс таблице что поставленная задача не имеет решений. Транспортная задача с правильным балансом по критерию стоимости перевозок. Пример решения транспортная задача метод потенциалов Москва Россия Москве. Решение транспортной задачи методом потенциалов Гагарина Россия Гагарина. Пример решения транспортной задачи открытого типа методом потенциалов. Каковы отличия между открытой и закрытой моделью транспортной задачи. Решить транспортную задачу условия которой задаются таблицей В В В. Последовательность решения транспортной задачи методом потенциалов. Транспортная задача метод северо западного угла метод потенциалов. Составление таблицы перевоки единицы товара в транспортной задаче. Метод потенциалов для решения транспортной задачи пример решения.

      ©2010