Методы решения транспортной задачи
Изучение методов составления опорного плана и дальнейшей оптимизации перевозок. Рассмотрение примера решения транспортной задачи методом потенциалов. Создание программы, реализующей решение задачи на языке Object Pascal в среде программирования Delphi.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 19.10.2014 |
Размер файла | 223,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Содержание
Введение
Глава 1. Теоретические основы задачи
1.1 Математическая постановка задачи
1.2 Нахождение опорного плана
1.3 Транспортная задача с неправильным балансом
1.4 Метод потенциалов
1.5 Пример решения задачи
Глава 2. Программное обеспечение
2.1 Конструирование формы
2.2 Содержимое обработчиков событий
2.3 Форма с результатами работы приложения
Заключение
Список литературы
Введение
Каждый человек время от времени оказывается в ситуации, когда достижение некоторого результата может быть осуществлено не единственным способом. В таких случаях приходится отыскивать наилучший способ. Однако в различных ситуациях наилучшими могут быть совершенно разные решения. Все зависит от выбранного или заданного критерия. На практике оказывается, что в большинстве случаев понятие «наилучший» может быть выражено количественными критериями - минимум затрат, минимум времени, максимум прибыли и т.д. Поэтому возможна постановка математических задач отыскания оптимального (optimum - наилучший) результата, так как принципиальных различий в отыскании наименьшего или наибольшего значения нет. Задачи на отыскание оптимального решения называются задачами оптимизации. Оптимальный результат, как правило, находится не сразу, а в результате процесса, называемого процессом оптимизации. Применяемые в процессе оптимизации методы получили название методов оптимизации. Чтобы решить практическую задачу надо перевести ее на математический язык, то есть составить ее математическую модель.
Математическая модель представляет собой стройную и глубокую совокупность знаний о математических моделях со своими проблемами, с собственными путями развития, обусловленными внутренними и внешними причинами и задачами. Математика дает удобные и плодотворные способы описания самых разнообразных явлений реального мира и тем самым выполняет в этом смысле функцию языка.
Часто в математической модели требуется найти наибольшее или наименьшее значение некоторой функции на некотором множестве, то есть решить задачу оптимизации. Методов решения задач оптимизации достаточно много. Некоторые из них рассматривались при отыскании экстремальных значений функций одной и многих вещественных переменных. Кроме точных методов широко используются и приближенные, например, метод дихотомии и т.д.
Знание методов нахождения оптимального решения позволяет выбирать наиболее эффективные и самые экономичные способы эксплуатации и ремонта машин, находить оптимальные решения тактических задач.
В данной курсовой работе рассматривается частный случай задачи оптимизации - транспортная задача, для решения которой успешно применяются методы линейного и динамического программирования.
Целью данной курсовой работы является изучение методов решения транспортной задачи: методы составления опорного плана и дальнейшая оптимизация перевозок. Рассмотрен пример решения транспортной задачи методом потенциалов. Задача реализована на языке программирования Object Pascal в визуальной среде разработки Delphi 6.0.
Глава 1. Теоретические основы задачи
1.1 Математическая постановка задачи
транспортный потенциал оптимизация программирование
Транспортная задача ставится следующим образом: имеется n пунктов отправления А1, А2, А4 ..., An. B которых сосредоточены запасы каких-то однородных грузов в количестве соответственно a1, а2, ..., аm единиц. Имеется m пунктов назначения B1, В2, …, Вn, подавшие заявки соответственно на b1, b2, ..., bn единиц груза. Известны стоимости Сij перевозки единицы груза от каждого пункта отправления Ai до каждого пункта назначения Bj. Все числа Сij, образующие прямоугольную таблицу заданы (таблица 1). Требуется составить такой план перевозок (откуда, куда и сколько единиц поставить), чтобы все заявки были выполнены, а общая стоимость всех перевозок была минимальна.
Таблица 1
B1 |
В2 |
… |
Вm |
||
А1 |
C11 |
C12 |
C1… |
C1m |
|
А2 |
C21 |
C22 |
C2… |
C2m |
|
… |
C…1 |
C…2 |
C… |
C…m |
|
Аn |
Cn1 |
Cn2 |
Cn… |
Cnm |
Рассмотрим сначала решение закрытой транспортной задачи, т.е. когда сумма всех заявок ровна сумме всех запасов.
Т.е. ai = bj (1)
Пусть Xij - количество запасов, отправленных со склада i в магазин j, а Cij - стоимость перевозки одного груза со склада i в магазин j. Очевидно, что Xij ? 0 и Cij ? 0.
В силу ограничений на возможность поставки товара со склада и спрос в магазинах величина X ij должна удовлетворять следующим условиям:
Xij = ai ; Xij = bj (2,3)
Z= Cij Xij > min (4)
Необходимо, конечно, оценить и выгодность передвижения от каждого пункта отправления к каждому пункту назначения. Для этого мы оценим так называемые потенциалы пунктов отправления (Ui) и пунктов назначения (Vj). Так как их цель - минимизировать потери, то сумма потенциалов в каждом случае не должна превышать затрат, т.е. необходимо выполнение следующих условий:
(5).
Система (5) и будет служить в дальнейшем критерием оптимальности плана.
Решение транспортной задачи начинается с нахождения опорного плана. Для этого существуют различные способы. Рассмотрим некоторые из них.
1.2 Нахождение опорного плана
Решение транспортной задачи начинается с нахождения опорного плана. Для этого существуют различные способы. Рассмотрим некоторые из них.
Метод последовательной максимальной загрузки. Строим опорный план исходя из формулы:
Xij=min (ai, bj) (6)
т.е. выбираются те варианты, которые могут обеспечить грузом максимальное количество заявок, и эти варианты будут использоваться в соответствии с формулой (6).
Общая схема построения начального опорного плана по методу максимальной загрузки такова:
1) Выбираем коммуникацию, которую можно больше всего загрузить.
2) Максимально ее загружаем в соответствии с формулами (2).
3) Корректируем объемы производства и потребления на величину выбранной перевозки, вычисляя остатки производства и потребления:
ai= ai-Xij; bj= bj-Xij ;
4) Вычеркиваем в транспортной таблице строку или столбец с нулевым объемом производства или потребления:
если ai = 0 - вычеркиваем i-тую строку;
если bj = 0 - вычеркиваем j-тый столбец;
5) Повторяем этот процесс с пункта 1 по 4, пока не будут перечеркнуты все строки или столбцы.
Метод северо-западного угла. Данный метод очень прост - пункты 1 и 2 в методе максимальной загрузки заменяются на следующий: очередная загружаемая коммуникация выбирается в левой верхней клетке сохраненной части таблицы, т.е. в северо-западном углу таблицы. Математически это выражается следующим образом:
, I - множество номеров пунктов производства;
, J - множество номеров пунктов потребления;
Метод минимальных затрат. В этом методе в первую очередь загружаются те коммуникации, в которых затраты на перевозку минимальные. При использовании данного метода находится наиболее приближенный к оптимальному опорный план, поэтому мы возьмем его в качестве базового для решения нашей задачи.
1.3 Транспортная задача с неправильным балансом
В предыдущих случаях рассматривалась только такая задачу о перевозках, в которой сумма запасов равна сумме заявок:
ai=bj;
Это классическая транспортная задача, иначе называемая, транспортной задачей с правильным балансом. Встречаются такие варианты транспортной задачи, где условие (3) нарушено. В этих случаях говорят о транспортной задаче с неправильным балансом.
Баланс транспортной задачи может нарушаться в 2-х направлениях:
1. Сумма запасов в пунктах отправлении превышает сумму поданных заявок
ai>bj;
2. Сумма поданных заявок превышает наличные запасы
ai<bj;
Условимся первый случай называть "Транспортной задачей с избытком запасов", а второй -- "Транспортной задачей с избытком заявок".
Рассмотрим последовательно эти два случая:
Транспортная задача с избытком запасов. В пунктах А1 A2, ..., An имеются запасы груза a1, а2, ..., аn, пункты B1, В2, ..., Вm подали заявки b1, b2, ..., bm, причём
ai>bj;
Требуется найти такой план перевозок (X), при котором все заявки будут выполнены, а общая стоимость перевозок минимальна. Очевидно при этой постановке задачи некоторые условия-равенства транспортной задачи превращаются в условия-неравенства, а некоторые -- остаются равенствами.
Xi,j ai (i=1 …, n ).
Xi,j = bj (j=1 …, m ).
Мы умеем решать задачу линейного программирования, в какой бы форме -- равенств или неравенств ни были бы заданы её условия. Поставленная задача может быть решена, например, обычным симплекс-методом. Однако задачу можно решить проще, если искусственным приемом свести её к ранее рассмотренной транспортной задаче с правильным балансом. Для этого, сверх имеющихся m пунктов назначения B1, В2, ..., Вm, введём ещё один, фиктивный, пункт назначения Вm+1 которому припишем фиктивную заявку, равную избытку запасов над заявками,
Bm+1 = ai - bj;
а стоимость перевозок из всех пунктов отправления в фиктивный пункт назначения bm+1 будем считать равным нулю. Введением фиктивного пункта назначения Вm+1 с его заявкой bm+1 мы сравняли баланс транспортной задачи и теперь его можно решать как обычную транспортную задачу с правильным балансом.
Транспортная задача с избытком заявок. Эту задачу можно свести к обычной транспортной задаче с правильным балансом, если ввести фиктивный пункт отправления An+1 с запасов an+1 равным недостающему запасу и стоимость перевозок из фиктивного пункта отправления во все пункты назначения принять равным нулю.
1.4 Метод потенциалов
Если план действительно оптимален, то система (5) будет выполняться, т.е.:
1) для каждой занятой клетки транспортной таблицы сумма потенциалов должна быть равна Сij для этой клетки;
2) для каждой незанятой клетки сумма потенциалов не больше (меньше или равно) Cij.
Число r=m+n-1, равное рангу системы (1) , называется рангом транспортной задачи. Если число заполненных клеток (Xij ? 0) в таблице равно r, то план называется невырожденным, а если это число меньше r, то план вырожденный - в этом случае в некоторые клетки вписывается столько нулей (условно заполненные клетки), чтобы общее число заполненных клеток было равно r.
Построим для каждой свободной переменной плана числа («невязки» или «косвенные тарифы») и они должны быть положительны. Так как число потенциалов равно 9, а система состоит из 8 уравнений, то для нахождения какого-либо решения этой системы необходимо первому из потенциалов придать произвольное значение (например: ). Далее последовательно находим значения всех потенциалов.
Если какое-нибудь из значений меньше нуля, значит существующий опорный план можно улучшить. Необходимо построить цикл пересчета. Циклом пересчета таблицы называется последовательность клеток, удовлетворяющая условиям:
1) одна клетка пустая, все остальные занятые;
2) любые две соседние клетки находятся в одной строке или в одном столбце;
3) никакие 3 соседние клетки не могут быть в одной строке или в одном столбце.
Что характерно, для этой точки (впрочем как и для других) мы можем построить только один цикл. Каждой клетке цикла приписываем определенный знак: поочередно «+» и «-» с начала цикла. В клетках с “+” - увеличиваем загрузку, а в клетках с “-” - уменьшаем. Величина, на которую увеличиваем или уменьшаем всегда одна и она определяется из условия:
, где - содержимое клеток со знаком “-”.
1.5 Пример решения задачи
Даны 4 поставщика с запасами груза А=(15, 20, 10, 25) и 5 потребителей с объемами заявок В=(5, 18, 17, 22, 8). Стоимости перевозки от поставщиков к потребителям указаны в таблице 2.
Таблица 2.
B1 |
В2 |
В3 |
В4 |
В5 |
|||
5 |
18 |
17 |
22 |
8 |
|||
А1 |
15 |
25 |
30 |
40 |
15 |
10 |
|
А2 |
20 |
20 |
18 |
5 |
27 |
35 |
|
А3 |
10 |
15 |
25 |
33 |
16 |
3 |
|
А4 |
25 |
10 |
7 |
28 |
12 |
38 |
Целевая функция в данной задаче выглядит следующим образом: Z=25•X11+30•X12+40•X13+15•X14+10•X15+20•X21+18•X22+5•X23+27•X24+35•X25+15•X31+25•X32+33•X33+16•X34+3•X35+10•X41+7•X42+28•X43+12•X44+8•X45
Найдем опорный план при помощи метода минимальных затрат
Таблица 4.
B1 |
В2 |
В3 |
В4 |
В5 |
|||
|
|
|
|
|
|||
А1 |
|
V 15 |
|||||
А2 |
|
II 17 |
VIII 3 |
||||
А3 |
|
VI 2 |
I 8 |
||||
А4 |
|
IV 5 |
III 18 |
VII 2 |
Римскими цифрами указан порядок итераций:
I. ; ; ; - 5 столбец исключен.
II. ; ; ; - 3 столбец исключен.
III. ; ; ; - 2 столбец исключен.
IV. ; ; ; - 1 столбец исключен.
V. ; ; ; - 1 строка исключена.
VI. ; ; ; - 3 строка исключена.
VII. ; ; ; - 4 строка исключена.
VIII. ; ; ; - 2 строка и 4 столбец исключены.
В результате получили следующий опорный план:
Целевая функция при данном плане поставок
Определяем значения всех потенциалов, предположив, что U1=0
После того, как все потенциалы найдены, можно искать :
Видно, что и меньше нуля, значит существующий опорный план можно улучшить. Поскольку , нужно ввести в базис вектор, соответствующий клетке (2; 1), для чего загрузить ее некоторым количеством единиц груза. Но, так как мы, увеличивая загрузку (2; 1), нарушаем баланс строк и столбцов распределительной таблицы, то следует изменить объемы поставок в ряде других занятых клеток. А чтобы число базисных переменных осталось прежним, необходимо вывести из базиса одну переменную. Выводится обычно та переменная, у которой загрузка в цикле минимальна.
(2; 1) - начальная точка цикла;
Каждой клетке цикла приписываем определенный знак: (2;1)-“+”, (4;1)-“-”, (4;4)-“+” (2;4)-“-”.
Таблица 5.
B1 |
В2 |
В3 |
В4 |
В5 |
|||
5 |
18 |
17 |
22 |
8 |
|||
А1 |
15 |
15 |
|||||
А2 |
20 |
+ |
17 |
- 3 |
|||
А3 |
10 |
2 |
8 |
||||
А4 |
25 |
5 - |
18 |
2 + |
, а значит из базиса будет выведена (2; 4), где в процессе реализации цикла загрузка уменьшится до 0.
Перейдем к новому опорному плану.
Таблица 6.
B1 |
В2 |
В3 |
В4 |
В5 |
|||
5 |
18 |
17 |
22 |
8 |
|||
А1 |
15 |
15 |
|||||
А2 |
20 |
17 |
3 |
||||
А3 |
10 |
2 |
8 |
||||
А4 |
25 |
5 |
18 |
2 |
Находим значения каждого потенциала для этого плана:
Определяем
Все больше 0, следовательно выполнено условие оптимальности (5).
.
Целевая функция при этом плане:
Задача решена.
Глава 2. Программное обеспечение
2.1 Конструирование формы
Рис. 1.
Таблица 7. Описание формы (Form1)
Объект |
Свойство |
Значение |
|
TForm |
Caption |
`Транспортная задача' |
|
Height |
412 |
||
Name |
Form1 |
||
Width |
648 |
||
TLabel |
Caption |
Введите количество поставщиков |
|
Left |
5 |
||
Top |
2 |
||
Height |
13 |
||
Name |
Label1 |
||
Width |
175 |
||
TLabel |
Caption |
Введите количество потребителей |
|
Left |
5 |
||
Top |
32 |
||
Height |
13 |
||
Name |
Label2 |
||
Width |
177 |
||
TEdit |
Name |
edA |
|
Height |
21 |
||
Left |
184 |
||
Top |
1 |
||
Width |
57 |
||
TEdit |
Name |
edB |
|
Height |
21 |
||
Left |
184 |
||
Top |
22 |
||
Width |
57 |
||
TLabel |
Name |
Label3 |
|
Caption |
Предложение |
||
Left |
5 |
||
Top |
95 |
||
Height |
13 |
||
Width |
70 |
||
TLabel |
Name |
Label4 |
|
Caption |
Спрос |
||
Left |
40 |
||
Top |
135 |
||
Height |
13 |
||
Width |
30 |
||
TStringGrid |
Name |
sgA |
|
ColCount |
1 |
||
DefaultColWidth |
64 |
||
DefaultRowHeigth |
24 |
||
FixedCols |
0 |
||
FixedRows |
0 |
||
Height |
33 |
||
Left |
80 |
||
Options |
goEditihg, goTabs |
||
RowCount |
1 |
||
Top |
87 |
||
Width |
328 |
||
Объект |
Свойство |
Значение |
|
TStringGrid |
Name |
sgB |
|
ColCount |
1 |
||
DefaultColWidth |
64 |
||
DefaultRowHeigth |
24 |
||
FixedCols |
0 |
||
FixedRows |
0 |
||
Height |
33 |
||
Left |
80 |
||
Options |
goEditihg, goTabs |
||
RowCount |
1 |
||
Top |
128 |
||
Width |
328 |
||
TStringGrid |
Name |
sgC |
|
Left |
8 |
||
Top |
175 |
||
Width |
425 |
||
Height |
161 |
||
DefaultColWidth |
50 |
||
DefaultRowHeigth |
24 |
||
FixedCols |
1 |
||
FixedRows |
1 |
||
TButton |
Name |
Button1 |
|
Left |
85 |
||
Top |
352 |
||
Width |
75 |
||
Height |
25 |
||
Caption |
Вычислить |
||
TButton |
Name |
Button2 |
|
Left |
285 |
||
Top |
16 |
||
Width |
75 |
||
Height |
25 |
||
Caption |
Принять |
||
TButton |
Name |
Button3 |
|
Left |
565 |
||
Top |
144 |
||
Width |
75 |
||
Height |
25 |
||
Caption |
Принять |
Рис. 2.
Таблица 8. Конструирование формы (fmRezult)
Объект |
Свойство |
Значение |
|
TForm |
Name |
fmRezult |
|
Left |
287 |
||
Top |
161 |
||
Width |
514 |
||
Height |
300 |
||
TLabel |
Name |
Label1 |
|
Left |
16 |
||
Top |
200 |
||
Width |
32 |
||
Height |
13 |
||
Caption |
Label1 |
||
TLabel |
Name |
Label2 |
|
Left |
8 |
||
Top |
8 |
||
Width |
130 |
||
Height |
13 |
||
Caption |
Опорный план перевозок |
||
TStringGrid |
Name |
sgRezult |
|
ColCount |
1 |
||
DefaultColWidth |
64 |
||
DefaultRowHeigth |
24 |
||
FixedCols |
0 |
||
FixedRows |
0 |
||
Height |
169 |
||
Left |
8 |
||
Options |
goEditihg, goTabs |
||
RowCount |
1 |
||
Top |
26 |
||
Width |
489 |
||
TButton |
Name |
Button1 |
|
Left |
11 |
||
Top |
232 |
||
Width |
75 |
||
Height |
25 |
||
Caption |
Вычислить |
2.2 Содержимое обработчиков событий
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
Matrix=array [1..10] of array [1..10] of integer;
TForm1 = class(TForm)
sgC: TStringGrid;
Button1: TButton;
Label1: TLabel;
edA: TEdit;
Label2: TLabel;
edB: TEdit;
sgA: TStringGrid;
sgB: TStringGrid;
Label3: TLabel;
Label4: TLabel;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function SummRow(a:Matrix; r:integer):integer;
function SummCol(a:Matrix; r:integer):integer;
var
Form1: TForm1;
a,b:array[1..10] of integer;
c,x: matrix;
m,n:integer;
implementation
uses Unit2;
{$R *.dfm}
function SummRow(a:Matrix; r:integer):integer;
var
i,k:Integer;
begin
k:=0;
for i:=1 to 10 do
k:=k+a[r,i];
Result:=k
end;
function SummCol(a:Matrix; r:integer):integer;
var
i,k:Integer;
begin
k:=0;
for i:=1 to 10 do
k:=k+a[i,r];
Result:=k
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
try
n:=StrToInt(edA.Text);
m:=StrToInt(edB.Text);
except
ShowMessage('Введите числа от 1 до 10');
Exit;
end;
sgA.Visible:=true;
sgA.Width:=sgA.DefaultColWidth*n+20;
sgA.ColCount:=n;
sgB.Width:=sgB.DefaultColWidth*m+20;
sgB.Visible:=true;
sgB.ColCount:=m;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
i,j:integer;
begin
sgC.Visible:=true;
sgC.Width:=sgC.DefaultColWidth*(m+1)+20;
sgC.Height:=sgC.DefaultRowHeight*(n+1)+20;
sgC.ColCount:=m+1;
sgC.RowCount:=n+1;
for i:=1 to n do
begin
try
a[i]:=StrToInt(sgA.Cells[i-1,0]);
except
on EConvertError do
begin
ShowMessage('Введите числа без пробелов');
Exit
end
end;
sgC.Cells[0,i]:=IntToStr(a[i]);
end;
for j:=1 to m do
begin
b[j]:=StrToInt(sgB.Cells[j-1,0]);
sgC.Cells[j,0]:=IntToStr(b[j])
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,Xn,Xm,
k,t,Row,Col,min,
p,q:integer;
Z,SSS:longint;
Cx:matrix;//флаг заполнения
U,V:array [1..10] of integer; //потенциалы
Uf,Vf:array [1..10] of Boolean;//флаг нахождения потенциалов
label EndPoisk,EndPoisk1,EndCikl,Opti;
begin
sss:=0;
for i:=1 to n do
for j:=1 to m do
c[i,j]:=StrToInt(sgC.Cells[j,i]) ;
{проверка на открытую модель}
Xm:=0;Xn:=0;
for i:=1 to n do
Xn:=Xn+a[i];
for j:=1 to m do
Xm:=Xm+b[j];
if Xm<>Xn then
begin
if Xm>Xn then
begin
inc(n);
a[n]:=Xm-Xn;
for i:=1 to m do
c[n,i]:=0;
end;
if Xm<Xn then
begin
inc(m);
b[m]:=Xn-Xm;
for j:=1 to n do
c[j,m]:=0;
end;
end;
{заполнение методом минимальных затрат}
for i:=1 to n do
for j:=1 to m do
Cx[i,j]:=0;
for i:=1 to n do
Uf[i]:=false;
for j:=1 to m do
Vf[j]:=false;
Z:=0;
for i:=1 to n do
for j:=1 to m do
if c[i,j]>Z then Z:=c[i,j];
repeat
for i:=1 to n do
if a[i]-SummRow(x,i)=0 then Uf[i]:=true;
for j:=1 to m do
if b[j]-SummCol(x,j)=0 then Vf[j]:=true;
min:=Z;
for i:=1 to n do
for j:=1 to m do
if (c[i,j]<min) and (Cx[i,j]<>1) and (a[i]-SummRow(x,i)>0)
and (b[j]-SummCol(x,j)>0) then
begin
min:=c[i,j];
Row:=i;
Col:=j;
end;
if a[Row]-SummRow(x,Row)<b[Col]-SummCol(x,Col) then
begin
x[Row,Col]:=a[Row]-SummRow(x,Row);
end
else
x[Row,Col]:=b[Col]-SummCol(x,Col);
sss:=0;
for i:=1 to n do
for j:=1 to m do
if x[i,j]>0 then
begin
sss:=sss+x[i,j];
Cx[i,j]:=1;
end;
until sss>=Xn;
{вывод опорного плана}
fmResult.Show;
with fmResult do
begin
sgResult.ColCount:=m+1;
sgResult.RowCount:=n+1;
for i:=1 to n do
begin
sgResult.Cells[0,i]:=IntToStr(a[i]);
for j:=1 to m do
begin
sgResult.Cells[j,0]:=IntToStr(b[j]);
sgResult.Cells[j,i]:=IntToStr(x[i,j])
end;
end;
end;
Opti:
{метод потенциалов}
{проверка на вырожденность}
k:=0;
for i:=1 to n do
for j:=1 to m do
begin
Cx[i,j]:=0; //Считаем заполненые ячейки
if x[i,j]>0 then
begin
Cx[i,j]:=1;
inc(k);
end;
end;
if k<m+n-1 then //если план вырожденный
for t:=1 to m+n-1-k do
begin
for i:=1 to n do
for j:=1 to m do
if (Cx[i,j]=1) and (SummRow(Cx,i)+SummCol(Cx,j)<=2) then
begin
for Row:=1 to n do
if Cx[Row,j]=0 then
begin
Cx[Row,j]:=1;
goto EndPoisk1;
end;
end;
EndPoisk1:;
end;
{нахождение потенциалов}
for i:=1 to n do
Uf[i]:=false; //обнуляем флаги потенциалов
for j:=1 to m do
Vf[j]:=false;
U[1]:=0;
Uf[1]:=true;
repeat
for i:=1 to n do
for j:=1 to m do
begin
if (Uf[i])and (not Vf[j]) and (Cx[i,j]=1) then
begin
V[j]:=C[i,j]-U[i];
Vf[j]:=true;
end;
if (Vf[j]) and (not Uf[i]) and (Cx[i,j]=1) then
begin
U[i]:=C[i,j]-V[j];
Uf[i]:=true;
end;
end;
k:=0;
for i:=1 to n do //подсчет
if Uf[i] then inc(k); //найденных
for j:=1 to m do //потенциалов
if Vf[j] then inc(k);
until k=m+n;
{определяем косвенные тарифы}
k:=0;
for i:=1 to n do
for j:=1 to m do
if (Cx[i,j]=0) and (U[i]+V[j]>C[i,j]) then
begin //строим цикл пересчета
for q:=1 to m do
if (Cx[i,q]=1) and (q<>j) then
for p:=1 to n do
if (Cx[p,q]=1) and (p<>i) then
if (Cx[p,j]=1) and (c[p,j]<>0) then
begin
if x[i,q]<=x[p,j] then Min:=x[i,q]
else Min:=x[p,j];
x[i,j]:=x[i,j]+Min;
x[p,j]:=x[p,j]-min;
x[p,q]:=x[p,q]+min;
x[i,q]:=x[i,q]-min;
k:=1;
Cx[i,j]:=1;
if x[p,j]=0 then Cx[p,j]:=0;
if x[i,q]=0 then Cx[i,q]:=0;
goto EndCikl;
end;
end;
EndCikl:if k=1 then
begin
//k:=0;
inc(sss);
if sss>1000 then Exit;
goto Opti;
end
else
begin
z:=0;
for i:=1 to n do
for j:=1 to m do
Z:=Z+C[i,j]*StrToInt(fmResult.sgResult.Cells[j,i]);
fmResult.Label1.Caption:='Целевая функция: '+IntToStr(Z);
end;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TfmResult = class(TForm)
sgResult: TStringGrid;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmResult: TfmResult;
i,j:integer;
implementation
uses Unit1;
{$R *.dfm}
procedure TfmResult.Button1Click(Sender: TObject);
var
z:integer;
begin
with fmResult do
begin
sgResult.ColCount:=m+1;
sgResult.RowCount:=n+1;
for i:=1 to n do
begin
sgResult.Cells[0,i]:=IntToStr(a[i]);
for j:=1 to m do
begin
sgResult.Cells[j,0]:=IntToStr(b[j]);
sgResult.Cells[j,i]:=IntToStr(x[i,j])
end;
end;
end;
Label2.Caption:='Оптимальный план перевозок';
z:=0;
for i:=1 to n do
for j:=1 to m do
Z:=Z+C[i,j]*x[i,j];
fmResult.Label1.Caption:='Целевая функция: '+IntToStr(Z);
end;
end.
2.3 Форма с результатами работы приложения
Заключение
Мы изучили методы решения транспортной задачи, рассмотрели случаи открытой модели, был приведен пример решения. В результате выполнения курсовой работы была создана программа, реализующая алгоритм решения транспортной задачи на языке Object Pascal в среде программирования Delphi. Цели данной курсовой работы достигнуты, задача решена.
Область применения данной программы - мелкие предприятия, занимающиеся перевозкой различных грузов и др.
Список литературы
1. Боборыкин В.А. Математические методы решения транспортных задач. Л.: СЗПИ, 2003
Гласс Р. Руководство по надежному программированию. М.: Финансы и статистика, 2000.
Касьянов В.Н. Методы оптимизации программ: Учеб. пособие. Новосибирск. Изд. НГТУ, 2001.
Кузнецов Ю. Н., Кузубов В. И., Волощеноко А. В. Математическое программирование. М., Высшая школа, 2002.
Размещено на Allbest.ru
Подобные документы
Особенности решения транспортной задачи распределительным методом и анализ результатов. Построение математической модели, алгоритма. Создание программы для решения транспортной задачи распределительным методом в программной среде Borland Delphi 7.
курсовая работа [1000,7 K], добавлен 23.06.2012Математическая постановка транспортной задачи открытой модели методом потенциалов при известных показателях запаса груза поставщика и потребности потребителя; ее решение ручным способом и с помощью компьютерной программы, написанной в среде Delphi.
курсовая работа [167,2 K], добавлен 16.01.2011Программа для решения транспортной задачи. Метод потенциалов, его математический смысл и порядок действий по его применению. Математические методы решения транспортных задач. Вычисление стоимости перевозок, расхода топлива, общей прибыли и окупаемости.
курсовая работа [33,7 K], добавлен 20.11.2008Решение задачи линейного программирования симплекс-методом: постановка задачи, построение экономико-математической модели. Решение транспортной задачи методом потенциалов: построение исходного опорного плана, определение его оптимального значения.
контрольная работа [118,5 K], добавлен 11.04.2012Описание алгоритма решения транспортной задачи по планированию перевозки зерна. Ход решения задачи вручную, в программе TORA методом наименьшего элемента, с помощью MS Excel. Разработка программы для решения задачи в общем виде средствами Delphi.
курсовая работа [2,5 M], добавлен 22.11.2012Создание и реализация алгоритма решения транспортной задачи методом наименьших стоимостей. Схема алгоритма основной программы. Основные шаги алгоритма решения транспортной задачи. Инструкция по эксплуатации программы и обзор результатов ее выполнения.
курсовая работа [2,0 M], добавлен 12.02.2013Применение методов линейного программирования для решения оптимизационных задач. Основные понятия линейного программирования, свойства транспортной задачи и теоремы, применяемые для ее решения. Построение первичного опорного плана и системы потенциалов.
курсовая работа [280,8 K], добавлен 17.11.2011Составление программы для расчета начального базиса сбалансированной транспортной задачи, где суммарные запасы поставщиков равны суммарным запросам потребителей. Алгоритм метода потенциалов. Пример решения транспортной задачи методом наименьшей стоимости.
отчет по практике [991,3 K], добавлен 06.12.2013Основные этапы решения транспортной задачи, использование метода потенциалов. Алгоритм решения методом аппроксимации Фогеля. Процедура построения цикла. Планирование перевозок из конечного числа пунктов отправления в конечное число пунктов назначения.
контрольная работа [32,6 K], добавлен 26.04.2011Общее понятие и характеристика задачи линейного программирования. Решение транспортной задачи с помощью программы MS Excel. Рекомендации по решению задач оптимизации с помощью надстройки "Поиск решения". Двойственная задача линейного программирования.
дипломная работа [2,4 M], добавлен 20.11.2010