Автор работы: Пользователь скрыл имя, 26 Ноября 2013 в 21:33, курсовая работа
Целью данного проекта является реализация программы решения задачи маршрутизации. Данная система предназначена для предприятий, которые работают с большим количеством заказчиков, расположенных относительно друг друга в совершенном различном порядке. Данный программный продукт предназначен прежде всего для компаний, которые хотят оптимизировать маршрут и порядок обработки заказов.
ВВЕДЕНИЕ …………………………………………………………..………......3
1.ПОСТАНОВКА ЗАДАЧИ……….…………………………………………….4
2.ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ……………………………………………...5
2.1 Изучение математических методов решения задач...…...…………….5
2.2 Метод ветвей и границ ………………………………………………… 6
2.3 Метод динамического программирования…………………………….12
3.ПРОЕКТИРОВАНИЕ АРХИТЕКТУРЫ РАЗРАБАТЫВАЕМЫХ ПРОГРАММНЫХ СРЕДСТВ…………………………………………………..14
3.1 Схема взаимодействия программ……………………………………..14
3.2 Формат исходных данных и результаты решения задачи…………..15
3.3 Требования к программному изделию………………………….........16
3.4 Требования к программной документации…..……………………....16
4. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ………………………………………...17
ЭКСПЕРИМЕНТАЛЬНЫЕ РАСЧЕТЫ……………………………………..20
5.1 Контрольные примеры для решения на ЭВМ………………………..20
5.2 Экспериментальные расчеты………………………………………….28
ЗАКЛЮЧЕНИЕ………………………………………………………………….30
ЛИТЕРАТУРА…………………………………………………………………...31
ПРИЛОЖЕНИЕ………………………………………………………………….32
Для приведения надо вычесть
минимум по первому столбцу: h1=1. При этом нижняя граница станет
равной 47+1 = 48. Сравнивая нижние границы
φ (
) = 67 и φ (
) = 48 < 67 выделяем подмножество маршрутов
, которое с большей вероятностью содержит
маршрут минимальной длины.
Рис. 1 Ветвление на первом шаге
Приведенная платежная матрица для
1 |
2 |
3 |
5 |
6 | |
2 |
0 |
∞ |
15 |
29 |
24 |
3 |
14 |
13 |
∞ |
5 |
0 |
4 |
∞ |
0 |
9 |
2 |
2 |
5 |
1 |
41 |
22 |
∞ |
0 |
6 |
12 |
0 |
0 |
0 |
∞ |
Далее продолжаем процесс ветвления. Найдем степени Θij нулевых элементов этой матрицы Θ21 =16, Θ36 = 5, Θ42 = 2, Θ56 = 2, Θ62 = 0, Θ63 =9, Θ65 = 2. Наибольшая степень Θ21. Затем множество разбивается дуге (2, 1) на два новых и .
В матрице для вычеркиваем строку 2 и столбец 1. дуги (1, 4) и (2, 1) образуют связный путь (2, 1, 4), положим c42= ∞, чтобы предотвратить появления цикла 2→1→ 4 → 2.
2 |
3 |
5 |
6 | |
3 |
13 |
∞ |
5 |
0 |
4 |
∞ |
9 |
2 |
2 |
5 |
41 |
22 |
∞ |
0 |
6 |
0 |
0 |
0 |
∞ |
Для приведения надо вычесть минимум по строке 4: r4=2. При этом нижняя граница станет равной 48+2 = 50.
Нижняя граница для , полученная как на предыдущем шаге ветвления, равна 48 + 16 = 64. Сравнивая нижние границы φ ( ) = 64 и φ ( ) = 50 < 64 выбираем для дальнейшего разбиения подмножество маршрутов .
Рис. 2 Ветвление на втором шаге
Приведенная платежная матрица для :
2 |
3 |
5 |
6 | |
3 |
13 |
∞ |
5 |
0 |
4 |
∞ |
7 |
0 |
0 |
5 |
41 |
22 |
∞ |
0 |
6 |
0 |
0 |
0 |
∞ |
Степени Θij нулевых элементов этой матрицы Θ36 = 5, Θ45 = 0, Θ56 = 22, Θ62 = 13, Θ63 =7, Θ65 = 0. Наибольшая степень Θ56. Затем множество разбивается дуге (2, 1) на два новых и .
Нижняя граница для равна 50 + 22 = 72. В матрице для вычеркиваем строку 5 и столбец 6 и полагаем c65= ∞. Получим матрицу:
2 |
3 |
5 | |
3 |
13 |
∞ |
5 |
4 |
∞ |
7 |
0 |
6 |
0 |
0 |
∞ |
Для приведения надо вычесть минимум по строке 3: r3=5. При этом нижняя граница станет равной 50+5 = 55. Выбираем для дальнейшего разбиения подмножество маршрутов .
Рис. 3 Ветвление на третьем шаге
Приведенная платежная матрица для
2 |
3 |
5 | |
3 |
8 |
∞ |
0 |
4 |
∞ |
7 |
0 |
6 |
0 |
0 |
∞ |
Степени Θij нулевых элементов этой матрицы Θ35 = 8, Θ45 = 7, Θ62 = 8, Θ63 =7. Выбираем Θ35 = 8. Разбиваем на и .
Нижняя граница для равна 55 + 8 = 64. В матрице для вычеркиваем строку 3 и столбец 5 и полагаем c63= ∞. Получим
2 |
3 | |
4 |
∞ |
7 |
6 |
0 |
∞ |
Для приведения надо вычесть минимум по строке 4: r4=7. При этом нижняя граница станет равной 55+7 = 62. После приведения получим
2 |
3 | |
4 |
∞ |
0 |
6 |
0 |
∞ |
Из матрицы 2´2 получаем два перехода с нулевой длинной: (4, 3) и (6, 2).
Рис. 4 Ветвление на четвертом шаге
Рис. 5 Дерево ветвления с оценками
Оптимальный маршрут: 1 – 4 – 3 – 5 – 6 – 2 – 1
5.2 Экспериментальные расчеты
Контрольный пример №1
Контрольный пример №2
ЗАКЛЮЧЕНИЕ
В ходе выполнения данной работы были изучены эвристический, приближенный и точный алгоритмы решения ЗК. Точные алгоритмы решения ЗК – это полный перебор или усовершенствованный перебор. Оба они, особенно первый, не эффективны при большом числе вершин графа.
Проведён анализ наиболее рациональных методов решения ЗК и определены области их эффективного действия: для малого числа вершин можно использовать метод динамического программирования; для большого числа вершин рациональнее применять метод ветвей и границ.
Изучены практические применения ЗК и задачи сводимые к ЗК.
Проведена реализация программы, позволяющей решить ЗК различными методами.
ЛИТЕРАТУРА
ПРИЛОЖЕНИЕ
ЛИСТИНГИ ПРОГРАММЫ
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, XPMan, Grids, Spin;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
SpinEdit1: TSpinEdit;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
C : array [0..100, 0..100] of integer;
Form1: TForm1;
h,b,f,x1,x2: real;
i,j: integer;
t: boolean;
implementation
{$R *.dfm}
// Save a TStringGrid to a file
procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
f: TextFile;
i, k: Integer;
begin
AssignFile(f, FileName);
Rewrite(f);
with StringGrid do
begin
// Write number of Columns/Rows
Writeln(f, ColCount);
Writeln(f, RowCount);
// loop through cells
for i := 0 to ColCount - 1 do
for k := 0 to RowCount - 1 do
Writeln(F, Cells[i, k]);
end;
CloseFile(F);
end;
// Load a TStringGrid from a file
procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
f: TextFile;
iTmp, i, k: Integer;
strTemp: String;
begin
AssignFile(f, FileName);
Reset(f);
with StringGrid do
begin
// Get number of columns
Readln(f, iTmp);
ColCount := iTmp;
// Get number of rows
Readln(f, iTmp);
RowCount := iTmp;
// loop through cells & fill in values
for i := 0 to ColCount - 1 do
for k := 0 to RowCount - 1 do
begin
Readln(f, strTemp);
Cells[i, k] := strTemp;
end;
end;
CloseFile(f);
end;
// Save StringGrid1 to 'c:\temp.txt':
procedure TForm1.Button1Click(Sender: TObject);
begin
SaveStringGrid(StringGrid1, 'temp.txt');
spinedit1.Value:=Stringgrid1.
end;
// Load StringGrid1 from 'c:\temp.txt':
procedure TForm1.Button2Click(Sender: TObject);
begin
LoadStringGrid(StringGrid1, 'temp.txt');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
LoadStringGrid(StringGrid1, 'temp.txt');
spinedit1.Value:=Stringgrid1.
for i:=0 to spinedit1.Value-1 do
stringgrid1.Cells[0,i]:=
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
Stringgrid1.RowCount:=
Stringgrid1.colCount:=spinedit
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TForm2 = class(TForm)
StringGrid1: TStringGrid;
Edit1: TEdit;
StringGrid2: TStringGrid;
Edit2: TEdit;
Label1: TLabel;
StringGrid3: TStringGrid;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
f: TextFile;
iTmp, i, k: Integer;
strTemp: String;
begin
AssignFile(f, FileName);
Reset(f);
with StringGrid do
begin
// Get number of columns
Readln(f, iTmp);
ColCount := iTmp;
// Get number of rows
Readln(f, iTmp);
RowCount := iTmp;
// loop through cells & fill in values
for i := 0 to ColCount - 1 do
for k := 0 to RowCount - 1 do
begin
Readln(f, strTemp);
Cells[i, k] := strTemp;
end;
end;
CloseFile(f);
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
LoadStringGrid(StringGrid1, 'temp.txt');
end;
end.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, Buttons;
type
TForm3 = class(TForm)
MainMenu1: TMainMenu;
Exit1: TMenuItem;
ChangeData1: TMenuItem;
Label1: TLabel;
ComboBox1: TComboBox;
ListBox1: TListBox;
Label2: TLabel;
BitBtn1: TBitBtn;
Edit1: TEdit;
Label3: TLabel;
Label4: TLabel;
procedure Exit1Click(Sender: TObject);
procedure ChangeData1Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure ComboBox1Select(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
uses Unit1, Unit2, Unit4;
{$R *.dfm}
procedure TForm3.Exit1Click(Sender: TObject);
begin
close;
end;
procedure TForm3.ChangeData1Click(
begin
form1.Visible:=true;
end;
procedure TForm3.FormActivate(Sender: TObject);
var i: integer;
begin
for i:=1 to form1.SpinEdit1.Value-1 do
combobox1.Items.Add(form1.
end;
procedure TForm3.ComboBox1Select(Sender: TObject);
begin
listbox1.Items.Add(combobox1.
edit1.Text:=inttostr(listbox1.
if listbox1.Items.Count=form1.
begin
combobox1.Enabled:=false;
label4.Visible:=true;
end;end;
function B(i: integer; j: integer) : integer;
begin
Result:=strtoint(form2.stringg
end;
function C(i:integer; j:integer; k:integer) :integer;
begin
if (strtoint(form2.stringgrid1.
Result:=strtoint(form2.
else Result:=strtoint(form2.
end;
function min3:integer;
begin if ((strtoint(form2.stringgrid1.
if ((strtoint(form2.stringgrid1.