Вот псевдокод алгоритма поиска единой стоимости:
function uniformCostSearch(problem):
frontier = Priority Queue()
explored = Set()
frontier.push(Node(problem.initialState), 0)
while not frontier.isEmpty():
node = frontier.pop()
if problem.isGoalState(node.state):
return node.solution
explored.add(node.state)
for action in problem.getActions(node.state):
childState = problem.getResult(node.state, action)
childCost = node.pathCost + problem.getCost(node.state, action)
if childState not in explored and not frontier.contains(childState):
childNode = Node(childState, node, action, childCost)
frontier.push(childNode, childCost)
elif frontier.contains(childState):
existingNode = frontier.getNode(childState)
if childCost < existingNode.pathCost:
existingNode.parent = node
existingNode.action = action
existingNode.pathCost = childCost
return null
Вот несколько методов, которые можно использовать при реализации поиска по единой стоимости:
frontier: структура данных приоритетной очереди, которая отслеживает узлы, подлежащие исследованию. Приоритет каждого узла определяется стоимостью его пути.исследовано: набор, в котором отслеживаются уже исследованные состояния.Узел: структура данных, представляющая узел в дереве поиска. Он включает состояние, родительский узел, действие и стоимость пути от начального состояния до текущего узла.problem.initialState: возвращает исходное состояние проблемы.problem.isGoalState(state): возвращает true, если данное состояние является целевым, что указывает на то, что поиск достиг желаемого решения.problem.getActions(state): возвращает список допустимых действий, которые можно выполнить в данном состоянии.problem.getResult(state, action): возвращает результирующее состояние, когда данное действие применяется к текущему состоянию.problem.getCost(state, action): возвращает стоимость, связанную с выполнением данного действия в текущем состоянии.