
- •Метод северо-западного угла
- •1)Берем самую верхнюю левую пустую ячейку.
- •2)Фигачим туда максимально возможное число так, что бы не нарушить (1*) и (2*).
- •Алгоритм «план минимума по строке»
- •3)Так же, как и в прошлом алгоритме, фигачим туда максимально возможное число так, что бы не нарушить (1*) и (2*).
- •Алгоритм «план минимума по столбцу»
- •Алгоритм «план минимального элемента»
- •Метод потенциалов
Метод потенциалов
1) Определяется начальный опорный план перевозок любым из вышеперечисленных способов.
2)
Для каждой строки и каждого столбца
вводятся и рассчитываются потенциалы
и
соответственно.
Вот как это выглядит в таблице (в качестве начального опорного плана взята итоговая таблица, полученная в ходе выполнения алгоритма «план минимального элемента»):
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
40 |
5 |
0 |
3 |
0 |
|
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
|
||||
3 |
100 |
6 |
0 |
3 |
70 |
7 |
30 |
4 |
0 |
|
||||
|
|
|
|
|
|
Для расчета коэффициента используется формула
где
- стоимость перевозки, записанная в
i-строке,
j-ом
столбце.
Расчет
потенциалов начинается с того что
элемент
предполагают равным нулю:
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
40 |
5 |
0 |
3 |
0 |
0 |
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
|
||||
3 |
100 |
6 |
0 |
3 |
70 |
7 |
30 |
4 |
0 |
|
||||
|
|
|
|
|
|
Дальше
решаются уравнения
для
тех
которые соответствуют ненулевым ячейкам:
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
40 |
5 |
0 |
3 |
0 |
0 |
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
|
||||
3 |
100 |
6 |
0 |
3 |
70 |
7 |
30 |
4 |
0 |
|
||||
|
1 |
2 |
|
|
|
Далее мы видим, что по формуле больше ничего подсчитать нельзя, так как остальные элементы первой строки = 0
Начинаем искать ненулевой элемент в таблице который можно зафигачить в одну из формул
Для другого примера эти формулы могут отличатся, так как могут быть по другому распределены перевозки. Думайте логически.
Такой
элемент всего один:
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
40 |
5 |
0 |
3 |
0 |
0 |
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
|
||||
3 |
100 |
6 |
0 |
3 |
70 |
7 |
30 |
4 |
0 |
1 |
||||
|
1 |
2 |
|
|
|
Далее ищем подходящий элемент для формулы
Вот
подходящий элемент:
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
40 |
5 |
0 |
3 |
0 |
0 |
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
|
||||
3 |
100 |
6 |
0 |
3 |
70 |
7 |
30 |
4 |
0 |
1 |
||||
|
1 |
2 |
6 |
|
|
Теперь
можем найти
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
40 |
5 |
0 |
3 |
0 |
0 |
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
-1 |
||||
3 |
100 |
6 |
0 |
3 |
70 |
7 |
30 |
4 |
0 |
1 |
||||
|
1 |
2 |
6 |
|
|
И,
наконец, находим последний потенциал
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
40 |
5 |
0 |
3 |
0 |
0 |
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
-1 |
||||
3 |
100 |
6 |
0 |
3 |
70 |
7 |
30 |
4 |
0 |
1 |
||||
|
1 |
2 |
6 |
3 |
|
Далее среди всех ячеек = 0 мы ищем плохие ячейки.
Ячейка
плоха, если
Если
таких клеток нет (для всех нулевых
выполняется
),
возрадуйся, ибо тогда план перевозок
оптимален, конец решения.
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
40 |
5 |
0 |
3 |
0 |
0 |
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
-1 |
||||
3 |
100 |
6 |
0 |
3 |
70 |
7 |
30 |
4 |
0 |
1 |
||||
|
1 |
2 |
6 |
3 |
|
Итак, проверяем на условие
1>1+(-1) – хорошо
6>1+1– хорошо
6>2+(-1) – хорошо
5<6+0 – плохо
3=3+0 – хорошо
4=3+1 – хорошо
Нашли одну плохую клетку. Значит план неоптимальным
Если их будет больше, тогда для дальнейшей обработки берем любую из них (насчет этого я не уверен до конца, уточните это в учебнике).
Как сделать неоптимальный план оптимальным?
Берем эту плохую клетку и как-нибудь помечаем ее
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
40 |
5 |
* |
3 |
0 |
0 |
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
-1 |
||||
3 |
100 |
6 |
0 |
3 |
70 |
7 |
30 |
4 |
0 |
1 |
||||
|
1 |
2 |
6 |
3 |
|
Затем надо построить замкнутый маршрут обхода элементов таблицы.
Строится он по таким правилам:
1)Цикл начинается и заканчивается в плохой клетке
2)Цикл состоит из чередующихся вертикальных и горизонтальных звеньев (т.е. в маршруте после каждого шага мы поворачиваем на 90 градусов в подходящую сторону и доходим до следующей ячейки, причем, необязательно что бы следующая клетка была соседней, можно «перепрыгивать» клетки)
3)Каждое звено начинается и заканчивается в клетке со значением > 0 (кроме начальной плохой клетки)
4)Нельзя проходить по одной и той же клетке больше одного раза.
Эти маршруты могут быть довольно сложными.
Например:
0 |
0 |
0 |
0 |
0 |
* |
89 |
4 |
0 |
0 |
0 |
0 |
96 |
0 |
0 |
3 3 |
0 |
0 |
56 |
1 0 |
0 |
0 |
76 |
0 |
0 |
0 |
0 |
0 |
0 |
89 |
0 |
0 |
4 9 |
0 |
56 |
0 |
0 |
0 |
0 |
0 |
Построив маршрут, помечаем знаками «+» и «-» те клетки, которые входят в маршрут по правилу:
Поставить «+» в плохую клетку с которой начинается цикл, и далее заносить знаки по мере движения по маршруту, чередуя их.
Например
0 |
0 |
0 |
0 |
0 |
+ * |
89 |
4 - |
0 |
0 |
0 |
0 |
96 |
0 |
0 |
- 33 |
0 |
0 |
56 |
1 0 + |
0 |
0 |
76 |
0 |
0 |
0 |
0 |
0 |
0 |
89 |
0 |
0 |
4 9 + |
0 |
56 - |
0 |
0 |
0 |
0 |
0 |
Вернемся к нашему примеру, там маршрут гораздо легче
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
4 0 - |
5 |
+ * |
3 |
0 |
0 |
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
-1 |
||||
3 |
100 |
6 |
0 |
3 |
7 0 + |
7 |
30 - |
4 |
0 |
1 |
||||
|
1 |
2 |
6 |
3 |
|
Далее ищем среди клеток, помеченных минусом, ячейку с наименьшим значением
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
4 0 - |
5 |
+ * |
3 |
0 |
0 |
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
-1 |
||||
3 |
100 |
6 |
0 |
3 |
7 0 + |
7 |
30 - |
4 |
0 |
1 |
||||
|
1 |
2 |
6 |
3 |
|
Вычитаем это значение из всех клеток, помеченных минусом, прибавляем это значение во все клетки с плюсом.
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
1 0 |
5 |
3 0 |
3 |
0 |
0 |
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
-1 |
||||
3 |
100 |
6 |
0 |
3 |
1 00 |
7 |
0 |
4 |
0 |
1 |
||||
|
1 |
2 |
6 |
3 |
|
Получаем таблицу
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
10 |
5 |
30 |
3 |
0 |
0 |
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
-1 |
||||
3 |
100 |
6 |
0 |
3 |
100 |
7 |
0 |
4 |
0 |
1 |
||||
|
1 |
2 |
6 |
3 |
|
Обязательно проверяем, что ограничения (1*) и (2*) не нарушены
Теперь стираем все потенциалы кроме
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
10 |
5 |
30 |
3 |
0 |
0 |
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
|
||||
3 |
100 |
6 |
0 |
3 |
100 |
7 |
0 |
4 |
0 |
|
||||
|
|
|
|
|
|
Рассчитывай новые потенциалы (одна клетка обнулилась, одна получила значение > 0).
Если в новой таблице будут отсутствовать плохие ячейки, то решение оптимально.
Номер склада |
Количество товара на складе |
Потребность потребителя 1 |
Потребность потребителя 2 |
Потребность потребителя 3 |
Потребность потребителя 4 |
|
||||||||
20 |
110 |
40 |
110 |
|||||||||||
1 |
60 |
1 |
20 |
2 |
10 |
5 |
30 |
3 |
0 |
0 |
||||
2 |
120 |
1 |
0 |
6 |
0 |
5 |
10 |
2 |
110 |
0 |
||||
3 |
100 |
6 |
0 |
3 |
100 |
7 |
0 |
4 |
0 |
1 |
||||
|
1 |
2 |
5 |
2 |
|
Таки оптимально.