I'm looking for advices to speed up my implementation of Dijkstra Shortest Path Search on a weighted graph which is a square matrix N x N. The weight on horizontal vertice is called H (resp. V on vertical ones).
A picture is worth a thousand words:
A picture is worth a thousand words! http://lionelgermain.free.fr/img/graphe.png
Of course, this is part of a bigger application, but I've extracted the relevant bit here:
unit Unit1;  interface  uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls;  const  N = 200; //Working on a grid of N x N, here for a quick test, in practice, it's more 10000  type   TForm1 = class(TForm)     Button1: TButton;     procedure FormCreate(Sender: TObject);     procedure Button1Click(Sender: TObject);   end;    TNode = class   public     ID, //Number of the Node     origin, //From which Node did I came?     weight : integer; //The total weight of the path to Node ID     done : boolean; //Is the Node already explored?     constructor Create(myID, myOrigin, myweight: integer);   end;  var   Form1: TForm1;  implementation  var   H, V : array of integer; {$R *.dfm}  constructor TNode.Create(myID, myOrigin, myweight: integer); begin   ID:=MyID;   origin:=MyOrigin;   weight:=MyWeight; end;  {------------------------------------------------------------------------------}  Function GetNodeFromID(ID: integer; NodeList: TList) : TNode; overload; var   I: Integer;   Node: TNode; begin   result:=nil;   for I := 0 to NodeList.count-1 do   begin     Node := NodeList[i];     if Node.ID=ID then     begin       result:=Node;       break;     end;   end; end;  {------------------------------------------------------------------------------}  Function GetNodeOfMiniWeight(NodeList: TList) : TNode; overload; var   I, min: Integer;   Node: TNode; begin   result:=nil;   min :=maxint;   for I := 0 to NodeList.count-1 do   begin     Node := NodeList[i];     if Node.done then continue;     if Node.weight < min then     begin       result:=Node;       min := Node.weight;     end;   end; end;  {------------------------------------------------------------------------------}  procedure SearchShortestPath(origin,arrival: integer); var   NewWeight: integer;   NodeList : Tlist;   NodeFrom, //The Node currently being examined   NodeTo :TNode; //The Node where it is intented to go   s : string; begin   NodeList := Tlist.Create;   NodeFrom := TNode.Create(origin,MaxInt,0);   NodeList.Add(NodeFrom);    while not (NodeFrom.ID = arrival) do //Arrived?   begin     //Path toward the top     if (NodeFrom.ID > N-1) //Already at the top of the grid     and not(NodeFrom.origin-NodeFrom.ID = N) then //Coming from the top     begin       NewWeight:=NodeFrom.weight + H[NodeFrom.ID-N];       NodeTo := GetNodeFromID(NodeFrom.ID-N, NodeList);       if NodeTo <> nil then       begin         if NodeTo.weight > NewWeight then         begin           NodeTo.Origin:=NodeFrom.ID;           NodeTo.weight:=NewWeight;         end;       end       else       begin         NodeTo := TNode.Create(NodeFrom.ID-N,NodeFrom.ID,NewWeight);         NodeList.Add(NodeTo);       end;     end;      //Path toward the bottom     if (NodeFrom.ID < N*N-N) //Already at the bottom of the grid     and not(NodeFrom.Origin- NodeFrom.ID = N) then //Coming from the bottom     begin       NewWeight:=NodeFrom.weight + H[NodeFrom.ID];       NodeTo := GetNodeFromID(NodeFrom.ID+N, NodeList);       if NodeTo <> nil then       begin         if NodeTo.weight > NewWeight then         begin           NodeTo.Origin:=NodeFrom.ID;           NodeTo.weight:=NewWeight;         end;       end       else       begin         NodeTo := TNode.Create(NodeFrom.ID+N,NodeFrom.ID,NewWeight);         NodeList.Add(NodeTo);       end;     end;      //Path toward the right     if not(NodeFrom.ID mod N = N-1) //Already at the extrem right of the grid     and not(NodeFrom.Origin - NodeFrom.ID = 1) then  //Coming from the right     begin       NewWeight:=NodeFrom.weight + V[NodeFrom.ID];       NodeTo := GetNodeFromID(NodeFrom.ID+1, NodeList);       if NodeTo <> nil then       begin         if NodeTo.weight > NewWeight then         begin           NodeTo.Origin:=NodeFrom.ID;           NodeTo.weight:=NewWeight;         end;       end       else       begin         NodeTo := TNode.Create(NodeFrom.ID+1,NodeFrom.ID,NewWeight);         NodeList.Add(NodeTo);       end;     end;      //Path toward the left     if not (NodeFrom.ID mod N = 0) //Already at the extrem right of the grid     and not(NodeFrom.Origin - NodeFrom.ID = -1) then //Coming from the left     begin       NewWeight:=NodeFrom.weight + V[NodeFrom.ID-1];       NodeTo := GetNodeFromID(NodeFrom.ID-1, NodeList);       if NodeTo <> nil then       begin         if NodeTo.weight > NewWeight then         begin           NodeTo.Origin:=NodeFrom.ID;           NodeTo.weight:=NewWeight;         end;       end       else       begin         NodeTo := TNode.Create(NodeFrom.ID-1,NodeFrom.ID,NewWeight);         NodeList.Add(NodeTo);       end;     end;     NodeFrom.done :=true;     NodeFrom:=GetNodeOfMiniWeight(NodeList);   end;    s:='The shortest path from '     + inttostr(arrival) + ' to '     + inttostr(origin) + ' is : ';   //Get the path   while (NodeFrom.ID <> origin) do   begin     s:= s + inttostr(NodeFrom.ID) + ', ';     NodeFrom:=GetNodeFromID(NodeFrom.Origin, NodeList);   end;   s:= s + inttostr(NodeFrom.ID);   ShowMessage(s); end;  procedure TForm1.Button1Click(Sender: TObject); begin   SearchShortestPath(Random(N*N),Random(N*N)); end;  procedure TForm1.FormCreate(Sender: TObject); var   I: Integer; begin   //Initialisation   randomize;   SetLength(V,N*N);   SetLength(H,N*N);   for I := 0 to N*N-1 do   begin     V[I]:=random(100);     H[I]:=random(100);   end; end;  end. The code spend most of the time in the routines: GetNodeFromID and GetNodeOfMiniWeight, and a substantial time to create nodes.
I thought that I could use a binary search, but since it requires the list to be sorted, I think that I'll loose the time in sorting the list. Any advice is welcome.