簡體   English   中英

將廣度優先搜索移植到Javascript

[英]Porting breadth-first search to Javascript

我在Python中為蛇創建了AI。 游戲很好用。 我最近開始學習Javascript,我嘗試寫Javascript等同於游戲。

游戲在x * y網格上播放(例如30 * 20)。 在Python中,我使用(x,y)元組作為游戲位置。 在JS中,我使用了我映射的整數:

function map(x, y) {
    return x + y * size.width;
}
function unmap(pos) {
    return {x: pos % size.width, y: Math.floor(pos/size.width)};
}

我的問題是搜索不起作用。 當我嘗試從它創建路徑時進入無限循環。 搜索功能是:

function search(start, goal) {
    var frontier = new PriorityQueue({
        comparator: function(a, b) {
            return a.score - b.score;
        }
    });
    frontier.queue({value: start, score: 0});
    var cameFrom = {};
    cameFrom[start] = null;

    while (frontier.length !== 0) {
        var current = frontier.dequeue().value;
        if (current === goal) {
            break;
        }

        var nbs = neighbors(current);
        for(var i = 0; i < nbs.length; i++) {
            var next = nbs[i];
            if (Object.keys(cameFrom).indexOf(next) === -1) {
                var priority = heuristic(goal, next);
                frontier.queue({value: next, score: priority});
                cameFrom[next] = current;
            }
        }
    }
    return cameFrom;
}

我使用這個優先級隊列

Python中的搜索更多是OOP,但我不想包含更多代碼 - 問題已經很長了。 但我會包括搜索:

def search(self, grid, start, goal):
    frontier = PriorityQueue()
    frontier.put(start, 0)
    came_from = {}
    came_from[start] = None

    while not frontier.empty():
        current = frontier.get()

        if current == goal:
            break

        for next in grid.neighbors(current):
            if next not in came_from:
                priority = self.heuristic(goal, next)
                frontier.put(next, priority)
                came_from[next] = current

    return came_from

如果需要更多,請詢問。 我不擅長JS。

這條線存在問題:

if (Object.keys(cameFrom).indexOf(next) === -1) {

我正在搜索整數,但鍵總是字符串。 您可以清楚此示例中的行為:

var foo = {0: "fooBar", 1: "bar"};
console.log("keys", Object.keys(foo));
console.log("int", Object.keys(foo).indexOf(0)); // -1
console.log("string", Object.keys(foo).indexOf("0")); // 0

這更具可讀性,更短,更有效:

if (cameFrom[next] === undefined) {

感謝IVlad指出了不好的路線。

暫無
暫無

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

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