[英]Undirected Graphs
我有一個嘗試使用Java進行的分配,但是我對如何設置/下圖的節點感到困惑。 基本上,它是筆式繪圖儀問題,或更普遍地稱為旅行商問題。 我的以下輸入是:
Line between 4 1 and 4 4
Line between 4 4 and 4 7
Line between 2 6 and 4 4
Line between 4 4 and 6 2
Line between 6 6 and 4 4
Line between 2 2 and 4 4
我的輸出結果為:
<n> nodes explored
cost = 24.61
Move from 0 0 to 2 2
Draw from 2 2 to 4 4
Draw from 4 4 to 6 6
Move from 6 6 to 4 7
Draw from 4 7 to 4 4
Draw from 4 4 to 4 1
Move from 4 1 to 6 2
Draw from 6 2 to 4 4
Draw from 4 4 to 2 6
假設紙的左下角是您的起點(0,0),它在坐標中上升,每個坐標是一個節點,並且我將如何確定何時移動和畫一條線。 我知道我應該使用帶有A *的無向圖,但對於哪些是節點(頂點)以及如何確定何時移動以及何時畫線,我還是很困惑,有人可以給我一些建議嗎?
編輯:請注意,是指在整個搜索過程中探索的節點數量/數量。
要使用A *,首先需要一個允許的啟發式函數 。 [說明此答案末尾附有的內容]。
問題以圖表形式出現在A:*
將G =(V,E)定義為圖,這樣:
V={all possible drawings prefixes}
[即每個可能的V={all possible drawings prefixes}
所有可能的“快照”]。 注意,您不應該將此圖保存在內存中,而要使用next()
創建它,稍后將進行說明。 [請注意,實際上,對於每種狀態,您實際上只需要存儲(1)當前筆在哪里(2)已經繪制的行]
E={all possible changes from one 'snap shot' to another}
您還需要w:E->R
[權重函數],它將簡單地是: w(point1,point2)=euclidian_distance(point1,point2)
您還應該定義next:V->P(V)
: next(v)={all snap shots you can get from v, using exactly one move/draw
最后,您還應該定義F
:所有“結束”狀態。 F={all the prefixes which all the lines are drawn}
如何運行A *:
從您的筆位於(0,0)的快照開始,並且沒有畫線[這是初始狀態],一直進行到找到最終狀態之一為止。 當您這樣做時,如果您的試探法是有效的,則可以確保您獲得了優化的解決方案,因為A *是可接受的且已優化
(*) 允許的啟發式功能:
設h*(v)=real distance to target
頂點v的h*(v)=real distance to target
。
如果h(v)<=h*(v)
中每個v的h(v)<=h*(v)
,則啟發式函數h:V-> R是允許的
您真正的挑戰
TSP的難點是找到一個允許的h
。 這很困難,因為您不知道最短的路徑是什么,並且如果不允許使用啟發式函數,則不能保證找到的解決方案將得到優化。
建議:
您可能想要使用任何時間算法 ,當我執行類似的操作時,[使用多個代理解決TSP]我也使用了A *,但是從一個無效的啟發式算法開始,然后迭代地減少它,所以如果我有足夠的時間,我找到了最佳解決方案,否則,我找到了可以找到的最佳解決方案。
由於您要解決的問題是NP Hard ,因此沒有有效的方法來解決旅行推銷員問題。 您要做的第一件事是將所有頂點對(從和到)存儲在ArrayList中,並根據需要使用它們。
您何時應該搬家:
每當您在某個點上並且ArrayList中沒有起始節點時,就必須選擇數組中的下一個元素並移至該位置。
什么時候應該繪制:
抽獎可能發生在兩種情況下。 移動到特定點后,將進行抽獎。 當線段的終點作為起點出現在ArrayList中時,也會發生繪制。
每次繪制后,都應從ArrayList中刪除該特定的線段。 當您的存儲桶中沒有其他東西時,您將停止程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.