problem komiwojażera

0

w programie mam algorytm dokladny i kilka heurystyk program zczytuje ilosc wierzcholkow i wsp wierzcholkow problem polega na tym ze sie wykrzacza przy 10 wierzcholkach i wiecej :-/ oto fragment kodu

2: //  {---------------- Algorytm dokladny ----------------}
  begin
   begincount;
 index:=-1;             //wykorzystywany przy wpisywaniu do tablicy cykli
 n:=s-1;                //ilosc liczb w permutacji jest o 1 mniejsza od wierzcholkow
                        //poniewaz pierwszy wierzcholek nigdy nie zmienia swojego miejsca
 rozmiar_tab:=1;
 for p:=1 to n do      //obliczanie ilosci wystepujacych cykli hamiltona
  rozmiar_tab:=rozmiar_tab*p;

 SetLength(cykle,rozmiar_tab,n);
 SetLength (e,n);  /// Tu sie wykrzacza
 perm(1);
 SetLength (dlugosc_cyklu,rozmiar_tab);
  SetLength (all_cyk,rozmiar_tab);
 writeln;

gdzie w SetLength (e,n); sie psuje

tak mam zaimplementowane zmienne

uses
  SysUtils,
  Windows;

type
 wierzcholek = record
   nr:integer;
   x:integer;
   y:integer;
   end;

type
 odcinek = record
   a:integer;
   b:integer;
   dlugosc:Extended;
   end;


var
  ver:array of wierzcholek;
  odc:array of odcinek;
  idzDo,e:array of integer;
  aktualnie_najlepszy_cykl:integer;
  cykle:array of array of integer;
  dlugosc_cyklu:array of Extended;
  algorytm,s,q,rozmiar_tab:integer;
  minDl,localDl:Extended;
 i,j,k,p,o,koniec,index,n:integer;
 all_cyk:array of Extended;
  ran:integer;
  T: Extended;
  TS: string;

  Counter   : Int64;
  Freq      : Int64;
  ExCounter : Int64;
  ExTime    : Extended;

błąd: raised exception class ERangeError withj message Range error

// komiwojażera! przez "ż"! - K

0

dotego mam kolejny problem

{---------------- Tworzenie listy krawedzi i obliczanie dlugosci docinkow ----------------}
Procedure ListaKraw ();
var
i,j:integer;
begin
q:=0;
writeln(s);
    SetLength (odc,q);
for i:=1 to s do
begin
  for j:=i+1 to s do
  begin
    q:=q+1;
    SetLength (odc,q+1);
    odc[q].a:=i;
    odc[q].b:=j;
    odc[q].dlugosc:=sqrt((ver[i].x - ver[j].x)*(ver[i].x - ver[j].x)+(ver[i].y - ver[j].y)*(ver[i].y - ver[j].y)) ;  /// tutaj program poprostu sie wylacza
  end;
end;
  {wypisywanie listy i dlugosci}
  for i:=1 to q do
  writeln('[',odc[i].a,' - ',odc[i].b,']= ',odc[i].dlugosc);

end;

w odc[q].dlugosc:=sqrt((ver[i].x - ver[j].x)(ver[i].x - ver[j].x)+(ver[i].y - ver[j].y)(ver[i].y - ver[j].y)) ; program po prostu sie wylacza jesli ktorys z wierzcholkow bedzie mial wsp zedu 1231334,35565

1 użytkowników online, w tym zalogowanych: 0, gości: 1