program a_osn;               (* OSN mit Startpunktwahl, Thomas Klein  1999 *)
uses graph,tsp;
var anfang:stadtnr;

procedure osn(anfang:stadtnr;var w:weg);
 (* zuerst von anfang zum naechsten Punkt, dann Start-Nachbar *)
 var n,i,j:stadtnr;
     m,l:real;
 begin
  n:=anfang; w:=chr(n);
  while length(w)<stadtanzahl do begin
   m:=maxentfernung;
   for i:=1 to stadtanzahl do
    if pos(chr(i),w)=0 then begin
     if length(w)=1 then
      l:=entftab[n,i]
     else
      l:=entftab[n,i]/entftab[i,anfang];
     if l<m then begin j:=i; m:=l; end;
    end;
   n:=j; w:=w+chr(n);
  end;
  w:=w+chr(anfang);
 end;

function auto_osn(var mweg:weg):stadtnr;
 (* automatische Bestimmung des besten Startpunktes *)
 var i,anfang:stadtnr;
     m,l:entfernung;
     w:weg;
 begin
  m:=maxentfernung;
  for i:=1 to stadtanzahl do begin
   osn(i,w); l:=weglaenge(w);
   if l<m then begin m:=l; mweg:=w; anfang:=i; end;
  end;
  auto_osn:=anfang;
 end;

begin
 if tspinit('TSP: OSN mit Startpunktwahl','Berechnen') then
  while tspmenue([0..255]) do begin
   start; anfang:=auto_osn(aktuell); stop;
   wegkarte(aktuell,true,brown,yellow); farbstadt(anfang,white);
   laenge_aus(aktuell); zeit_aus(true);
  end;
 closegraph;
end.
