簡體   English   中英

2D航路點尋路:WP的組合從curLocation到targetLocation

[英]2D waypoint pathfinding: combinations of WPs to go from curLocation to targetLocation

請花一點時間了解我的情況。 如果無法理解,請在評論中告訴我。

我有一個Waypoint的ArrayList。 這些路標沒有任何順序。 一個航點具有以下屬性:
{int type, float z, float y, float x, float rotation}

這適用於3維世界,但是由於我的尋路不應關注高度(因此將世界視為2維世界),因此y值將被忽略。 輪換對於這個問題並不重要。

  • 在這個二維世界中,x代表x軸,z代表y軸。
  • 如果x增加,則世界上的物體向東移動。 如果x減小,則世界上的物體向西移動。
  • 如果z增加,則世界上的物體向北移動。 如果z減小,則世界上的物體向南移動。

因此,這些“新”航路點可以簡化為: waypoint = {float x, float y}

現在,這些航路點代表對象的X軸(x)和Y軸(z)位置。 此外,還有一個當前位置: curLocation = {float x, float y}和一個目標位置: tarLocation = {float x, float y}

這就是我想要得到的:
在以下嚴格條件下,將從curLocationtarLocation所有航路點組合(aka:路徑或路線)

  1. 每個航路點之間的距離不得大於(float) maxInbetweenDistance 這包括從curLocation到第一個航點的初始距離以及從最后一個航點到tarLocation的距離。 如果不可能有這樣的航點組合,則應返回null。
  2. 如果在maxInbetweenDistance中發現一個通向目標航路點的航路點有多個航路點,則應選擇最接近的航路點(更好的做法是,如果稍微遠一點的替代航路點會導致距離更長的新路徑,回來)。
  3. 返回的航點組合(路徑)的順序應從最短路徑(最小距離)到最長路徑(最大距離)

最后,請考慮以下幾點:

  1. 這是我唯一需要明智地進行AI /尋路的事情,這就是為什么我不希望使用完整的尋路或AI框架的原因。 我相信一個功能應該能夠解決上述問題。
  2. 如果返回所有可能的航路點組合會導致過多的開銷,則可以指定最大數量的組合(但仍從最遠到最遠排序)也可以。 例如。 5條最接近的路徑。

我將如何實現? 任何反饋表示贊賞。

如果您的航路點具有連通性,則應查看Dijkstra的最短路徑算法。 Google的第一批熱門歌曲甚至列出了Java的實現。 (我不能從帖子中得知連通性是否已知,但是它確實包含“ graph-algorithm”標記,因此我假設是這樣)。 顧名思義,此方法為您提供了兩個節點之間的最短路徑。

您的約束具有挑戰性,在這些約束下需要所有可能的路徑組合。 再次-假設存在連接-您的節點鄰接矩陣可以強制執行您的maxInbetweenDistance規則。 同樣,您可以使用此矩陣獲得“次優”解決方案。 知道最佳路徑后,您可以將該路徑(或其元素)標記為不可用,然后重新運行Dijkstra的算法。 通過重復此過程,您可以獲得一組越來越次優的路徑。

按照慣例:在大多數計算幾何問題中,Z為高度,水平面由XY軸形成。

我認為您的解決方案是從Dijkstra的算法開始,首先找到最短的路徑。 您可以將航路點視為一個連接圖,如果節點在xy平面中足夠靠近,則可以在其中連接節點,然后應用Dijkstra(在線有很多示例代碼清單)。

現在,您具有了從頭到尾遍歷圖形的最短路徑,該路徑將由圖形的N條邊組成。

接下來,您需要創建N個新圖形,每個圖形都與第一個圖形相同,但最短路徑的一部分未連接。 在這些修改后的圖上查找從頭到尾的最短路徑。 現在,您可以按長度對N + 1條路線進行排序。

重復此過程,直到找到滿足您需求的足夠路徑,或者沒有剩余的未排序路徑為止。

我還沒有發現這種技術的名稱,但它被描述為一個修改的Dijkstra 這里

最容易實現的方法可能是創建路徑的ArrayList,這又將是包含所有可能路徑的路點的ArrayList,然后使用遞歸函數返回每個路徑是否有效(給定起點和終點)值和最大距離,如果路徑無效,請從列表中將其刪除。 下一步將通過剩下的每條路徑,並將它們從最短的總距離到最短的順序排序。 這將是獲取所需內容的蠻力方法,因此效率最低。 今晚回到家時,我會重新發布是否有人已經用Java進行此操作的更有效方法。

編輯:如果蠻力方法太多,則必須以某種方式對航點列表進行排序,最好的方法可能是最初根據距起點的距離對它們進行排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM