Задача коммивояжера и её реализация

Автор: Пользователь скрыл имя, 26 Апреля 2012 в 01:27, дипломная работа

Описание работы

Мета. Ознайомлення з постановкою задачі комівояжера на графах та детальне вивчення різних алгоритмів розв’язання задачі комівояжера.
Об’єкт. Задача комівояжера та алгоритми її розв’язку.
Предмет. Розробка середовища та програмна реалізація деяких алгоритмів розв’язку задачі комівояжера

Работа содержит 1 файл

Задача комівояжера та її варіації.doc

— 1.85 Мб (Скачать)

  for i:= 1 to NN*2 do

  begin

    Puti[i]:=0;

    NewPut[i]:=0;

  end;

  Label3.Caption:='';

  Image1.Picture.Bitmap.canvas.fillrect(canvas.cliprect) ; 

  if N>6 then

  begin

    Image1.Width:=250+(N-6)*30;

   Image1.Height:=310+(N-6)*50;

    Image1.Picture.Bitmap.Width := Image1.Width;

    Image1.Picture.Bitmap.Height := Image1.Height;

    Form1.Height:=395+(N-6)*50;

    Form1.Width:=640+(N-6)*30;

  end

  else

  begin

    Image1.Width:=250;

    Image1.Height:=310;

    Form1.Height:=445;

    Form1.Width:=640;

  end;

end; 

{****************************************************}

{Процедура нажатия  кнопки начала}

procedure TForm1.BitBtn1Click(Sender: TObject);

var

  i,RGor,MGor:byte;

  Flag:boolean;

begin

K:=-1;

{Получения количества городов}

  N:=StrToInt(ComboBox1.Text);

{Сброс всех  значений на 0}

  Sbros;

  Flag:=true;

{Ввод матрицы  длин путей между городами}

  InputMatrix;

{Предварительный  этап. Определения исходного множества  G0}

  Etap(GIndexKon[0,1]);

  GIndexKon[0,2]:=GIndexKon[0,1];

{Вывод G0 на  экран в виде вершины дерева}

  Tree(0,0,0,0,0,0,0,GIndexKon[0,1]);

{Определение  множества конкурирующих пар  и выбор перспективной пары}

  Konkurir(RGor,MGor);

  Puti[1]:=RGor;

  Puti[2]:=MGor;

  GorodaIJ[RGor,MGor]:=-1;

{i-ые итерации.}

  for i:=1 to N-1 do

    if Flag then

    begin

{Определение  множества G(i,2)}

      Etap(GIndexKon[i,2]);

      if GIndexKon[i-1,1]<GIndexKon[i-1,2] then

        GIndexKon[i,2]:=GIndexKon[i,2]+GIndexKon[i-1,1]

      else begin GIndexKon[i,2]:=GIndexKon[i,2]+GIndexKon[i-1,2];

        K:=K+1;

      End;

{Вывод подмножества G(i,2) на экран в виде листа  дерева}

      Tree(K,2,i,i-1,RGor,MGor,1,GIndexKon[i,2]);

{Удаление RGor'ой  строки и MGor'ого столбца}

      DelStrStolb(RGor,MGor);

      IsklStrok[RGor]:=1;

      IsklStolb[MGor]:=1;

{Вызов процедуры  предотвращения образования коротких  и длинных подциклов}

      ProverkaIskl;

{Определение  множества G(i,1)}

      Etap(GIndexKon[i,1]);

      if GIndexKon[i-1,1]<GIndexKon[i-1,2] then

        GIndexKon[i,1]:=GIndexKon[i,1]+GIndexKon[i-1,1]

      else GIndexKon[i,1]:=GIndexKon[i,1]+GIndexKon[i-1,2];

      Label6.Caption:='Довжина туру:  '+IntToStr(GIndexKon[i,1]);

{Вывод подмножества G(i,1) на экран в виде листа  дерева}

      Tree(K,1,i,i-1,RGor,MGor,0,GIndexKon[i,1]);

{Определение  множества конкурирующих пар  и выбор перспективной пары}

      Konkurir(RGor,MGor);

      if ParKonkur[RGor,MGor]>=0 then

      begin

        Puti[i*2+1]:=RGor;

        Puti[i*2+2]:=MGor;

      end;

      if ParKonkur[RGor,MGor]<0 then Flag:=false;

      IsklStrok[RGor]:=1;

      IsklStolb[MGor]:=1;

      GorodaIJ[RGor,MGor]:=-1;

    end;

{Определение  оптимального маршрута}

  OpredilPuti;

end; 

procedure TForm1.ComboBox1Change(Sender: TObject);

var

  i,j:byte;

begin

  for i:=1 to NN do

  begin

    ObjLabel('Label1',i).Visible:=False;

    ObjLabel('Label2',i).Visible:=False;

    for j:=1 to NN do

      ObjEdit('Edit',i,j).Visible:=False;

  end;

  N:=StrToInt(ComboBox1.Text);

  for i:=1 to N do

  begin

    ObjLabel('Label1',i).Visible:=True;

    ObjLabel('Label2',i).Visible:=True;

    for j:=1 to N do

      ObjEdit('Edit',i,j).Visible:=True;

  end;

end; 

procedure TForm1.N2Click(Sender: TObject);

var

  FInput:Integer;

  i,j:byte;

  s,num:integer;

begin

  Sbros;

  OpenDialog1.InitialDir:=Application.ExeName;

  OpenDialog1.Filter:='Файл  Коммивояжера (*.kom)|*.kom';

  if not OpenDialog1.Execute then exit;

  FInput:=FileOpen(OpenDialog1.FileName,fmOpenRead);

  FileRead(FInput,num,sizeof(num));

  for i:=1 to num do

    for j:=1 to num do

    if i<>j then

    begin

      FileRead(FInput,s,sizeof(s));

      ObjEdit('Edit',i,j).Text:=IntToStr(s);

    end;

  ComboBox1.ItemIndex:=num-2;

  ComboBox1Change(ComboBox1);

  FileClose(FInput);

end; 

procedure TForm1.N3Click(Sender: TObject);

var

  FOutput:Integer;

  i,j:byte;

  s,num:integer;

begin

  SaveDialog1.InitialDir:=Application.ExeName;

  SaveDialog1.Filter:='Файл  Коммивояжера(*.kom)|*.kom';

  if not SaveDialog1.Execute then exit;

  FOutput:=FileOpen(SaveDialog1.FileName,fmOpenWrite);

  if FOutput=-1 then

    FOutput:=FileCreate(ChangeFileExt(SaveDialog1.FileName,'.kom'));

  num:=StrToInt(ComboBox1.Text);

  FileWrite(FOutput,num,sizeof(num));

  for i:=1 to num do

    for j:=1 to num do

    if i<>j then

    begin

      s:=StrToInt(ObjEdit('Edit',i,j).Text);

      FileWrite(FOutput,s,SizeOf(s));

    end;

  FileClose(FOutput);

  ChangeFileExt(SaveDialog1.FileName,'.kom');

end; 

procedure TForm1.N4Click(Sender: TObject);

begin

  Close;

end; 

procedure TForm1.N9Click(Sender: TObject);

var

FInput:Integer;

  i,j:byte;

  s,num:integer;

begin

Form1.Sbros;

FInput:=FileOpen('zero.kom',fmOpenRead);

  FileRead(FInput,num,sizeof(num));

  for i:=1 to num do

    for j:=1 to num do

    if i<>j then

    begin

      FileRead(FInput,s,sizeof(s));

      ObjEdit('Edit',i,j).Text:=IntToStr(s);

    end;

  ComboBox1.ItemIndex:=num-2;

  ComboBox1Change(ComboBox1);

  FileClose(FInput);

end; 

end.


Информация о работе Задача коммивояжера и её реализация