Как реализовать генетический алгоритм на сеточной плате для поиска оптимального пути
Привет
Я готовлю алгоритмы поиска оптимального пути на местности с препятствиями. До сих пор я реализовывал алгоритмы Dijsktra и A*. Теперь мне нужно реализовать генетический алгоритм, и у меня есть проблема. Во-первых, я покажу вам, как выглядит мое представление карты. Есть 7 различных видов местности (0 - начало, 7 - конец, 1-4 нормальных, которые можно пройти, 5-6 не пройти). Вот код для этого в Python (самая важная часть кода, на мой взгляд, для понимания проблемы-это соседи функций:
class Graph(): def __init__(self, x=10, y=10): self.width = x self.height = y self.board = ((1, 1, 1, 5, 1, 1, 1, 1, 1, 7), (1, 1, 1, 5, 1, 1, 1, 1, 1, 1), (1, 1, 1, 5, 1, 5, 1, 1, 1, 1), (0, 1, 1, 1, 1, 5, 1, 1, 1, 1), (1, 1, 1, 1, 1, 5, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1, 1, 1, 1)) self.time = {0: None, 1: 1, 2: 4, 3: 7, 4: 4, 7: 1} def cost(self, id): (x, y)= id return self.time.get(self.board[y][x]) def canPass(self, id): (x, y) = id return self.board[y][x] != 5 and self.board[y][x] != 6 and self.board[y][x] != 0 def inBounds(self, id): (x, y) = id return 0 <= x < self.width and 0 <= y < self.height def neighbors(self, id): (x, y) = id nodes = [(x-1, y), (x, y-1), (x+1, y), (x, y+1)] nodes = filter(self.inBounds, nodes) nodes = filter(self.canPass, nodes) return nodes
Я понятия не имею, как реализовать генетический алгоритм с теоретической точки зрения из-за моей карты и представления соседей, и я не могу их изменить.
Что я уже пробовал:
Я подготовил начальную популяцию, используя модификацию моего A*, которая находит почти самое простое соединение от начала до конца, не проверяя стоимость этого. Вот код
def heuristic(a, b): (x1, y1) = a (x2, y2) = b return abs(x1 - x2) + abs(y1 - y2) def StartingPopulation(graph, start, goal): (x, y) = start frontier = PriorityQueue() frontier.put(start, 0) came_from = {} cost_so_far = [[0 for i in xrange(10)] for j in xrange(10)] came_from[start] = None cost_so_far[y][x] = 0 while not frontier.empty(): current = frontier.get() (y1, x1) = current if (y1, x1) == goal: break for next in graph.neighbors(current): new_cost = cost_so_far[x1][y1] + graph.cost(next) (y2, x2) = next if cost_so_far[x2][y2] == 0 or new_cost < cost_so_far[x2][y2]: cost_so_far[x2][y2] = new_cost priority = new_cost + heuristic(goal, next) frontier.put(next, priority) came_from[next] = current return came_from, cost_so_far
Это все, что я придумываю. Я понятия не имею, как сделать другие шаги для генетического алгоритма, такие как отбор, скрещивание и Мутация на данных, которые у меня есть. Я надеюсь, что вы можете направлять меня и давать некоторые подсказки (если есть полный код для того, что мне нужно, было бы также хорошо проверить и узнать из него)