全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:687
推到 Plurk!
推到 Facebook!

類似樹狀結構問題,想做從節點出發 在時間距離內計算延伸的範圍...

尚未結案
bearlin
一般會員


發表:3
回覆:3
積分:1
註冊:2004-07-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-07 06:42:13 IP:59.113.xxx.xxx 未訂閱
var stepback,stepforward:string; rout:array [0..10000] of string; lastdis:array [0..10000] of double; core1,core2:integer; ssfile_1,ssfile_2:Tstringlist; ssdata_1:Tstringlist; 資料結構 'nodeTonode.txt' Exe. 0,1,2,3 意思是 節點0 與節點 1 2 3連接 1,0,2 意思是 節點1 與節點 0 2 連接 2,0,1,3 3,0,1 類似上述 Node[0].nodetoroaddis[i-1]; 已經有暫存 節點0和他相連節點之間的距離 procedure TForm1.covering; var i,j,vehtime:integer; str1,str2:string; dis:double; begin routcount:=0; //車程時間 vehtime:=strtoint(form1.SpinEdit1.text); core1:=strtoint(form1.Edit1.text); //區位出發點 // ssData_1.Delimiter:=','; //分隔字元 ssFile_1.LoadFromFile('nodeTonode.txt'); ssData_1.DelimitedText:=ssFile_1.Strings[core1]; str1:=ssdata_1.Strings[0]; //從區位出發 //路徑紀錄 rout[0]:=''; rout[0]:='-' inttostr(core1); //注意 暫定先取第一個 for i:=1 to ssdata_1.Count-1 do begin str2:=ssdata_1.Strings[i]; //不能刪 必用 stepforward:=str2; //跟出發點 str1 相連結點 str2 之間的距離 dis:=Node[strtoint(str1)].nodetoroaddis[i-1]; //起點出發 總共可用的時間距離為vehtime 扣除經過節點的距離dis lastdis[0]:=vehtime-dis; stepback:=inttostr(core1); treefunction(0); end; //for i:=1 to ssdata5.Count-1 do end; function TForm1.treefunction(num:integer):integer; var j:integer; dis:double; ssData:TStringList; str1,str2:string; begin // 判斷呼叫Treefunction 是從自己呼叫 還是 covering呼叫 if num=0 then begin routcount:=0; end; // routcount:=routcount 1; core2:=strtoint(stepforward); //到下一個節點 core1:=strtoint(stepback); ssData:=TStringList.Create; ssData.Delimiter:=','; //分隔字元 ssFile_2.LoadFromFile('nodeTonode.txt'); ssData.DelimitedText:=ssFile_2.Strings[core2]; for j:=1 to ssdata.Count-1 do begin str1:=ssdata.Strings[0]; //從區位出發 str2:=ssdata.Strings[j]; //不走回頭路 if (strtoint(str2)<>core1) then begin rout[routcount]:='-' str1; dis:=Node[strtoint(str1)].nodetoroaddis[j-1]; //更新延伸時間 上一次剩下的減掉這次行走的距離或時間 lastdis[routcount]:=lastdis[routcount-1]-dis; //延伸路徑時間或距離 還沒用完 if lastdis[routcount]>0 then begin stepforward:=str2; stepback:=str1; //呼叫自己 先再往深一層計算 treefunction(1); end; //if lastdis[routcount]>0 then //延伸路徑時間或距離 已用完 繼續for j:=1 to // ssdata.Count-1 do if lastdis[routcount]<=0 then begin //先沒有動作 end; //回到之前上一層 繼續未完的for j:=1 to ssdata.Count-1 do if j=ssdata.Count-1 then begin if routcount>1 then begin routcount:=routcount-1; //回上一層的 stepback 和 stepforward core2:=-1*strtoint(rout[routcount]); core1:=-1*strtoint(rout[routcount-1]); end; //if routcount>1 then end; //if j=ssdata.Count-1 then end; //for j:=1 to ssdata.Count-1 do //釋放Tstringlist ssdata.Free; end; 對不起 想請教各位前輩高手,因為我已經弄了很久,根據上述的程式利用呼叫自己,找出再給的 vehtime 時間內,所能走道最遠的 Node範圍。程式可以跑,但計算的很慢,我也找不出原因,我的 'nodeTonode.txt'大概總比數有10000筆, 不過主要延伸樹狀結構是 vehtime 的值,但 vehtime 很小,僅延伸幾個深度就要跑很久了,想請各位高手 幫小弟看看,小弟還是初學者中,幫我看看到底是什麼問題?有沒有幫法解決.....感激不盡..... 因為還要把路線範圍給畫出來,所以希望能有較快的效率,小弟大概跑過深度10層時就要花上好幾分鐘,至少五分鐘吧!連繪圖動作都沒寫到程式碼就已經這樣了,所以希望高手們 幫我看一看.............真的非常感謝
bearlin
一般會員


發表:3
回覆:3
積分:1
註冊:2004-07-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-09 02:55:47 IP:59.113.xxx.xxx 未訂閱
我已經想到新方法了,改用 dijkstra 改良 應該就能解決了 謝謝大家......
系統時間:2024-11-24 23:39:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!