Автор: Пользователь скрыл имя, 26 Апреля 2012 в 01:27, дипломная работа
Мета. Ознайомлення з постановкою задачі комівояжера на графах та детальне вивчення різних алгоритмів розв’язання задачі комівояжера.
Об’єкт. Задача комівояжера та алгоритми її розв’язку.
Предмет. Розробка середовища та програмна реалізація деяких алгоритмів розв’язку задачі комівояжера
if not SaveDialog1.Execute then exit;
FOutput:=FileOpen(SaveDialog1.
if FOutput=-1 then
FOutput:=FileCreate(
num:=StrToInt(ComboBox1.Text);
FileWrite(FOutput,num,sizeof(
for i:=1 to num do
for j:=1 to num do
if i<>j then
begin
s:=StrToInt(ObjEdit('Edit',i,
FileWrite(FOutput,s,SizeOf(s))
end;
FileClose(FOutput);
ChangeFileExt(SaveDialog1.
end;
В результаті була створенна програма для розв’язку задачі комівояжера методом гілок та меж. Основним принципом роботи якої є зведення матриць, пошук нижніх меж, розбиття на підмножини.
Дані в програму можна ввести вручну, використовуючи вже існуючі матриці. Програма має графічне представлення дерева результатів пошуку шляхів. Для перевірки роботи програми введемо дані с прикладу, який був розглянутий у першому розділі після опису алгоритму методу гілок та меж.
Відкриємо матрицю:
Рис. 2.1
Рис. 2.2
Рис.2.3
Отримаємо
матрицю, яка зображена на рис. 2.3. Після
роботи програми ми отримаємо такі результати
Рис. 2.3 (які відповідають результатам
розглянутого прикладку раніше).
Задача комівояжера є частковим випадком гамільтоновой задачі про
мандрівника. Суть задачі комівояжера полягає в знаходженні сумарною мінімальної характеристики (відстані, вартості проїзду т.д.), при цьому комівояжер повинен пройти всі n міст по одному разу, повернувшись в те місто, з якого почав.
Існують багато методів розв’язання задачі комівояжера, в данній роботі були розглянуті методи гілок та меж (алгоритм Літтла), Мурашині алгоритми. Однак тільки метод гілок і меж дає нам в підсумку найоптимальніше рішення.
Для практичної реалізації ідеї методу гілок та меж до задачі комівояжера потрібно знайти метод визначення нижніх меж підмножини і розбиття множини гамільтонових контурів на підмножини (розгалуження). Таке визначення нижніх меж базується на твердженні, що якщо до всіх елементів i-го рядка або j-го стовпця матриці C додати або відняти число, то задача залишиться еквівалентної до поставленої, тобто оптимальність маршруту комівояжера не зміниться, а довжина будь-якого гамільтонового циклу зміниться на дану величину.
Мурашині
алгоритми можуть бути успішно застосовані
для вирішення складних задач
оптимізації. Основна ідея, що лежить
в основі алгоритмів мурашиної колонії,
полягає в використанні механізму додатнього
зворотного зв'язку, який допомагає знайти
найкраще наближене рішення в складних
задачах оптимізації. Тобто, якщо в даному
вузлі мураха повинен вибрати між різними
варіантами і якщо фактично вибрані результати
будуть хорошими, то в майбутньому такий
вибір буде більш бажаний, ніж попередній.
Цей підхід є багатообіцяючим через ефективності
у виявленні кращих рішень складних проблем.
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,
Buttons, Menus;
const
NN=10;
type
Gorod=array[1..NN,1..NN] of integer;
Dopolnit=array[1..NN] of integer;
ConPrived=array[0..NN,0..2] of integer;
Iskluch=array[1..NN] of byte;
ItogPuti=array[1..NN*2]
of integer;
type
TForm1 = class(TForm)
Image1: TImage;
Label1: TLabel;
Label4: TLabel;
Label3: TLabel;
BitBtn1: TBitBtn;
Label6: TLabel;
Label7: TLabel;
ComboBox1: TComboBox;
Label2: TLabel;
Label13: TLabel;
Label15: TLabel;
Label18: TLabel;
Label12: TLabel;
Label19: TLabel;
Label16: TLabel;
Label110: TLabel;
Label14: TLabel;
Label17: TLabel;
Label11: TLabel;
Label23: TLabel;
Label25: TLabel;
Label28: TLabel;
Label22: TLabel;
Label29: TLabel;
Label26: TLabel;
Label210: TLabel;
Label24: TLabel;
Label27: TLabel;
Label21: TLabel;
Edit11: TEdit;
Edit12: TEdit;
Edit13: TEdit;
Edit14: TEdit;
Edit15: TEdit;
Edit16: TEdit;
Edit17: TEdit;
Edit18: TEdit;
Edit19: TEdit;
Edit110: TEdit;
Edit21: TEdit;
Edit22: TEdit;
Edit23: TEdit;
Edit24: TEdit;
Edit25: TEdit;
Edit26: TEdit;
Edit27: TEdit;
Edit28: TEdit;
Edit29: TEdit;
Edit210: TEdit;
Edit31: TEdit;
Edit32: TEdit;
Edit33: TEdit;
Edit34: TEdit;
Edit35: TEdit;
Edit36: TEdit;
Edit37: TEdit;
Edit38: TEdit;
Edit39: TEdit;
Edit310: TEdit;
Edit41: TEdit;
Edit42: TEdit;
Edit43: TEdit;
Edit44: TEdit;
Edit45: TEdit;
Edit46: TEdit;
Edit47: TEdit;
Edit48: TEdit;
Edit49: TEdit;
Edit410: TEdit;
Edit51: TEdit;
Edit52: TEdit;
Edit53: TEdit;
Edit54: TEdit;
Edit55: TEdit;
Edit56: TEdit;
Edit57: TEdit;
Edit58: TEdit;
Edit59: TEdit;
Edit510: TEdit;
Edit61: TEdit;
Edit62: TEdit;
Edit63: TEdit;
Edit64: TEdit;
Edit65: TEdit;
Edit66: TEdit;
Edit67: TEdit;
Edit68: TEdit;
Edit69: TEdit;
Edit610: TEdit;
Edit71: TEdit;
Edit72: TEdit;
Edit73: TEdit;
Edit74: TEdit;
Edit75: TEdit;
Edit76: TEdit;
Edit77: TEdit;
Edit78: TEdit;
Edit79: TEdit;
Edit710: TEdit;
Edit81: TEdit;
Edit82: TEdit;
Edit83: TEdit;
Edit84: TEdit;
Edit85: TEdit;
Edit86: TEdit;
Edit87: TEdit;
Edit88: TEdit;
Edit89: TEdit;
Edit810: TEdit;
Edit91: TEdit;
Edit92: TEdit;
Edit93: TEdit;
Edit94: TEdit;
Edit95: TEdit;
Edit96: TEdit;
Edit97: TEdit;
Edit98: TEdit;
Edit99: TEdit;
Edit910: TEdit;
Edit101: TEdit;
Edit102: TEdit;
Edit103: TEdit;
Edit104: TEdit;
Edit105: TEdit;
Edit106: TEdit;
Edit107: TEdit;
Edit108: TEdit;
Edit109: TEdit;
Edit1010: TEdit;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
N9: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N9Click(Sender: TObject);
private
procedure InputMatrix;
procedure Etap(var GInd:integer);
procedure Konkurir(var r,m:byte);
procedure OpredilPuti;
procedure Sbros;
procedure
DelStrStolb(Stroka,Stolb:byte)
procedure
Tree(K,XPos,YPos,Index,RG,MG,
function ObjEdit(S: string; IndexX: byte; IndexY: byte): TEdit;
function ObjLabel(S: string; IndexX: byte): TLabel;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ParKonkur,GorodaIJ:Gorod;
Ci,Cj:Dopolnit;
GIndexKon:ConPrived;
IsklStrok:Iskluch;
IsklStolb:Iskluch;
TreeList:TEdit;
ListName:TLabel;
Puti,NewPut:ItogPuti;
N:byte;