Как реализовать шаблон стратегии для различных алгоритмов поиска пути в Python?Python

Программы на Python
Anonymous
Как реализовать шаблон стратегии для различных алгоритмов поиска пути в Python?

Сообщение Anonymous »

Я создаю простую игру на основе сетки и хочу реализовать разные способы поиска пути для разных типов NPC. Например, некоторые должны двигаться, используя A* (для эффективности), в то время как другие могут использовать Дийкстру или даже простой BFS.
Я пытаюсь использовать Шаблон стратегии, чтобы мой класс NPC был отделен от конкретной реализации алгоритма. Однако я пытаюсь передать в стратегию данные сетки и начальные/конечные точки, не делая классы слишком тесно связанными.
Что я пробовал:
  • Я исследовал шаблон стратегии и понимаю, что мне нужен общий интерфейс.
  • Я изучил abc.abstractmethod, чтобы определить контракт.
  • Я проверял подобные вопросы по SO, но в большинстве примеров используются очень простые математические вычисления (например, сложение и вычитание), а не передача сложных объектов, таких как 2D-сетка.
мой код

Код: Выделить всё

from abc import ABC, abstractmethod

# The Strategy Interface
class PathfindingStrategy(ABC):
@abstractmethod
def find_path(self, grid, start, end):
pass

# Concrete Strategy 1: BFS (Simplified)
class BFSStrategy(PathfindingStrategy):
def find_path(self, grid, start, end):
print("Executing BFS logic...")
# Imagine BFS logic here
return [(0,0), (0,1), (0,2)]

# Concrete Strategy 2: A* (Placeholder)
class AStarStrategy(PathfindingStrategy):
def find_path(self, grid, start, end):
print("Executing A* logic...")
# Imagine A* logic here
return [(0,0), (1,1), (0,2)]

# Context class
class NPC:
def __init__(self, name, strategy: PathfindingStrategy):
self.name = name
self.strategy = strategy
self.grid = [[0] * 5 for _ in range(5)] # Sample 5x5 grid

def move(self, destination):
start = (0, 0)
# Is this the right way to pass the grid and coordinates?
path = self.strategy.find_path(self.grid, start, destination)
print(f"{self.name} moves along: {path}")

# Usage
fast_npc = NPC("Runner", AStarStrategy())
fast_npc.move((0, 2))
Проблема:
Пока этот код работает, меня беспокоит, что сетка каждый раз передается в метод find_path.
  • Разумно ли с архитектурной точки зрения передавать всю среду (сетку) в метод стратегии?
  • Если моя сетка становится очень большой (например, $1000 \times 1000$), вызовет ли этот подход проблемы с производительностью из-за обработки аргументов метода в Python, или это просто передача ссылки?
  • Должен ли NPC владеть стратегией или контроллер Grid должен заниматься вычислением пути?
Я ищу лучшие практики по применению этого шаблона специально для алгоритмических задач на Python.

Вернуться в «Python»