A *検索で訪問したノードを再検討する

ムハンマド

オリエンテーリングにA *検索を適用して、最適なルートを取得しようとしています。入力は2つのファイルです。1つは地形を説明する画像ファイルで、もう1つは標高を定義するテキストファイルです。事前に設定された値に基づいて地形の難易度を計算し、地形を移動できる速度を定義します。また、傾斜に基づいて高度の難易度を定義しました(傾斜が下がると速度が速くなり、その逆も同様です)。

地形と標高のデータは、マトリックス(リストのリスト)に保存されます。したがって、入力はマップ上のポイントと同じインデックスです。2つの入力が提供されます-例:

start = [230,327]
end = [241,347]

問題は、私のコードが、訪問したキューにすでに存在するノードを再訪問し続けることです。ノードは次のように定義されます。

class Node:
    def __init__(self,value,parent,start=[],goal=[]):
        self.children = []
        self.parent = parent
        self.value = value
        self.timeToGoal = 0.0000
        self.timeTravelled = 0.0000

        if parent:
            timeToParent = self.parent.timeTravelled
            [parentX, parentY] = parent.value
            [currentX, currentY] = self.value
            xDiff = abs(currentX - parentX)
            yDiff = abs(currentX - parentX)
            distance = 12.7627
            if xDiff == 0 and yDiff != 0:
                distance = 10.29
            elif xDiff != 0 and yDiff == 0:
                distance = 7.55
            # distanceFromParent = math.sqrt(((currentX - parentX) ** 2) - (currentY - parentY) ** 2)
            speedFromParent = 1.388 * calculateTerrainDifficulty( terrainMap[currentX][currentY]) * calculateElevationDifficulty(elevationMap[parentX][parentY], elevationMap[currentX][currentY], distance)
            timeTravelledFromParent = 0
            if speedFromParent != 0:
                timeTravelledFromParent = distance / speedFromParent
            else:
                "Error: Speed from Parent Cannot Be Zero"
            self.timeTravelled = timeToParent + timeTravelledFromParent
            self.path = parent.path[:]
            self.path.append(value)
            self.start = parent.start
            self.goal = parent.goal

        else:
            self.path = [value]
            self.start = start
            self.goal = goal

    def GetTime(self):
        pass

    def CreateChildren(self):
        pass

また、関数を定義するためにSubNodeクラスを使用しました。時間は、自己到達までの時間+ゴールまでのピタゴラス斜辺距離として定義されています。

class SubNode(Node):
    def __init__(self, value, parent, start=[], goal=[]):
        super(SubNode, self).__init__(value, parent, start, goal)
        self.timeToGoal = self.GetTime()

    def GetTime(self):
        if self.value == self.goal:
            return 0
        [currentX, currentY] = self.value
        [targetX, targetY] = self.goal
        parentTime = 0
        if self.parent:
            parentTime = self.timeTravelled
        heuristicTime = 99999.99
        # Pythagorean Hypotenuse - Straight-line Distance
        distance = math.sqrt(((int(currentX) - int(targetX)) ** 2) + (int(currentY)- int(targetY)) ** 2)
        speed = 1.38 * calculateTerrainDifficulty(terrainMap[currentX][currentY])
        if speed != 0:
            heuristicTime = distance / speed
        heuristicTime=heuristicTime+parentTime
        return heuristicTime


    def CreateChildren(self):
        if not self.children:
            dirs = [-1, 0, 1]
            [xVal, yVal] = self.value
            for xDir in dirs:
                newXVal = xVal + xDir
                if newXVal < 0 or newXVal > 394: continue
                for yDir in dirs:
                    newYVal = yVal + yDir
                    if ((xVal == newXVal) and (yVal == newYVal)) or (newYVal < 0 or newYVal > 499) or (
                        calculateTerrainDifficulty(terrainMap[newXVal][newYVal]) == 0):
                        continue
                    child = SubNode([newXVal, newYVal], self)
                    self.children.append(child)

A *検索クラスは次のように定義されました。ノードが再訪されないように条件をそこに入れたことがわかります。そこに印刷を入れると、条件が複数回満たされていることがわかります。

class AStarSearch:
    def __init__(self, start, goal):
        self.path = []
        self.visitedQueue = []
        self.priorityQueue = PriorityQueue()
        self.start = start
        self.goal = goal

    def Search(self):
        startNode = SubNode(self.start, 0, self.start, self.goal)
        count = 0
        self.priorityQueue.put((0, count, startNode))
        while (not self.path and self.priorityQueue.qsize()):
            closestChild = self.priorityQueue.get()[2]e
            closestChild.CreateChildren()
            self.visitedQueue.append(closestChild.value)
            for child in closestChild.children:
                if child.value not in self.visitedQueue:
                    count += 1
                    if not child.timeToGoal:
                        self.path = child.path
                        break
                    self.priorityQueue.put((child.timeToGoal, child.value, child))
        if not self.path:
            print("Not possible to reach goal")
        return self.path

何らかの理由で、私のプログラムはいくつかのノードを再訪問し続けます(訪問したキューを印刷したときに出力からわかるように。これを回避するにはどうすればよいですか?

[230、327]、[231、326]、[229、326]、[231、325]、[231、328]、[229、328]、[231、327]、[229、327]、[ 231、327]、[229、327]、[229、325]、[231、324]、[230、323]、[231、329]、[229、329]、[231、327]、[229、 327]、[229、324]、[231、330]、[231、323]、[229、330]、[229、331]]

私が直面している別の問題はこれです:

TypeError: unorderable types: SubNode() < SubNode()

Pythonの優先度付きキューの使用を変更せずにこれを克服する方法はありますか?

gdelab

子の代わりにclosestChildにテストを追加する必要があります。

closestChild = self.priorityQueue.get()[2]e
if closesChild.value not in self.visitedQueue:
    closestChild.CreateChildren()
    self.visitedQueue.append(closestChild.value)

それ以外の場合n1n2、両方ともノードにリンクしている言うことができますn3n3に2回追加されるためpriorityqueue、2回ポップされてから、に2回追加されvisitedQueueます。

この条件if child.value not in self.visitedQueue:は、(優先度キューを小さくすることで)処理を高速化するのに役立ちますが、必須ではありません(不要なオブジェクトは、priorityQueueそれらをアンパイルするときに破棄されるため)。

発生するエラーについて:PriorityQueue優先度付きキューに必要なカスタム順序付けをサポートしていないため、カスタム順序付けを作成する必要があります。ここに例があります明らかに、_get_priority関数はtimeTravelled代わりに戻る必要がありますitem[1]

編集3:私たち(tobias_kと私)は最初に、Pythonがそれらの2つが等しいことを認識するように__eq__関数を実装する必要があると言いSubNodeましたが、self.visitedQueueに値のみを格納しているため、実際にはそうではありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ページを再訪するたびにjqgridフィルターの検索をトリガーします

分類Dev

ノード-依存関係を再帰的に検索します

分類Dev

ノードリストでノードを検索する

分類Dev

LocalStorageを使用して再訪問者を検出する

分類Dev

クラス属性または渡されたパラメーターなしで再帰的トラバーサルで訪問されたノードの再訪問/追跡を回避する方法はありますか?

分類Dev

DOMツリーである種のノード番号を使用した要素検索

分類Dev

ctsを使用した配列の検索が、ノードAPIを使用した配列の検索と異なるのはなぜですか?

分類Dev

Cypherで接続されたノードのグループを検索する

分類Dev

Mongooseを使用したノードJSでの全文検索

分類Dev

Mongooseを使用したノードJSでの全文検索

分類Dev

Oracleで重複する子ノードを検索する

分類Dev

ノードを検索するLINQxmlはnullを返します

分類Dev

最近追加されたノードを検索します

分類Dev

JqueryMobileを使用してXMLノードでテキストを検索する

分類Dev

jQueryを使用してAjax結果でノードを検索する

分類Dev

グリーンフィールドプロジェクトで軸索を検討する

分類Dev

nltkを使用して祖父母ノードを検索する

分類Dev

二重リンクリストで指定された位置にあるノードを検索します

分類Dev

htmlテーブルのtdノードの下でテキストを再帰的に検索します

分類Dev

ノードの「_id」でMongoDBエントリを検索する正しい方法

分類Dev

neo4j cypher、ノードを検索し、IDによる関係です

分類Dev

再帰を使用して、バイナリツリーで特定の文字列を保持するノードを検索します

分類Dev

Alfresco REST CoreAPIはパスでノードを検索します

分類Dev

WinformTreeviewはタグでノードを検索します

分類Dev

xslt - 特定のノードでのみ xml を検索します

分類Dev

IDのchildren / childrenノードで特定の値を検索する

分類Dev

JavaScript再帰検索ノードがnullを返す

分類Dev

訪問したセクションに従って検索バーを表示します(React.js)編集

分類Dev

複数の訪問者にわたってセッションを検索することは可能ですか?

Related 関連記事

  1. 1

    ページを再訪するたびにjqgridフィルターの検索をトリガーします

  2. 2

    ノード-依存関係を再帰的に検索します

  3. 3

    ノードリストでノードを検索する

  4. 4

    LocalStorageを使用して再訪問者を検出する

  5. 5

    クラス属性または渡されたパラメーターなしで再帰的トラバーサルで訪問されたノードの再訪問/追跡を回避する方法はありますか?

  6. 6

    DOMツリーである種のノード番号を使用した要素検索

  7. 7

    ctsを使用した配列の検索が、ノードAPIを使用した配列の検索と異なるのはなぜですか?

  8. 8

    Cypherで接続されたノードのグループを検索する

  9. 9

    Mongooseを使用したノードJSでの全文検索

  10. 10

    Mongooseを使用したノードJSでの全文検索

  11. 11

    Oracleで重複する子ノードを検索する

  12. 12

    ノードを検索するLINQxmlはnullを返します

  13. 13

    最近追加されたノードを検索します

  14. 14

    JqueryMobileを使用してXMLノードでテキストを検索する

  15. 15

    jQueryを使用してAjax結果でノードを検索する

  16. 16

    グリーンフィールドプロジェクトで軸索を検討する

  17. 17

    nltkを使用して祖父母ノードを検索する

  18. 18

    二重リンクリストで指定された位置にあるノードを検索します

  19. 19

    htmlテーブルのtdノードの下でテキストを再帰的に検索します

  20. 20

    ノードの「_id」でMongoDBエントリを検索する正しい方法

  21. 21

    neo4j cypher、ノードを検索し、IDによる関係です

  22. 22

    再帰を使用して、バイナリツリーで特定の文字列を保持するノードを検索します

  23. 23

    Alfresco REST CoreAPIはパスでノードを検索します

  24. 24

    WinformTreeviewはタグでノードを検索します

  25. 25

    xslt - 特定のノードでのみ xml を検索します

  26. 26

    IDのchildren / childrenノードで特定の値を検索する

  27. 27

    JavaScript再帰検索ノードがnullを返す

  28. 28

    訪問したセクションに従って検索バーを表示します(React.js)編集

  29. 29

    複数の訪問者にわたってセッションを検索することは可能ですか?

ホットタグ

アーカイブ