Algorithm 什么*变体包括附加限制

Algorithm 什么*变体包括附加限制,algorithm,shortest-path,a-star,traveling-salesman,Algorithm,Shortest Path,A Star,Traveling Salesman,通常情况下,您希望以最小的成本从A转到B,但是成本旁边的每个链接都有一些您可以购买/收集的项目 不是真正的口袋妖怪玩家,但用这个主题来更好地解释,你想从家里到健身房,沿着最短的路线,在路上捡起至少一件物品 我可以用*解出最短路径。我怎样才能包括传统的限制,或者我应该使用不同的算法 我在考虑使用起始成本,所以当你找到物品时,你会降低成本,当你旅行时,你会增加成本。并尝试接近0 我考虑的另一个选择是尝试找到覆盖所有项目的路径。然后用A*表示该子集。但不确定什么算法可以解决这个问题 我会用一个。通常

通常情况下,您希望以最小的成本从A转到B,但是成本旁边的每个链接都有一些您可以购买/收集的项目

不是真正的口袋妖怪玩家,但用这个主题来更好地解释,你想从家里到健身房,沿着最短的路线,在路上捡起至少一件物品

我可以用*解出最短路径。我怎样才能包括传统的限制,或者我应该使用不同的算法

我在考虑使用起始成本,所以当你找到物品时,你会降低成本,当你旅行时,你会增加成本。并尝试接近0

我考虑的另一个选择是尝试找到覆盖所有项目的路径。然后用A*表示该子集。但不确定什么算法可以解决这个问题

我会用一个。通常将节点标记为已访问,以便每个节点只访问一次。但是对于这个问题,您需要跟踪找到的物品和行驶的距离。因此,可以使用不同的项目集多次访问每个节点

使用您的示例,让我们为项目指定标签

A for 200 poke balls
B for lure module
C for incense
D for egg
和节点

S for the start node
T for the top node
M for the middle node
L for the lowest node
Z for the end node
假设所有路径的成本相等,且成本为1

问题从
{S::0}
开始,这意味着节点S没有项目,距离为0。然后将
{T:C:1}
{M:A:1}
{L:BD:1}
排队

{T:C:1}
中,您排队
{S:C:2}
{M:BC:2}
{Z:BCD:2}

当您从队列中拉出
{S:C:2}
时,您会注意到节点T已经有了距离为1的项C,因此您不排队
{T:C:3}
。但是您将对
{M:AC:3}
{L:BCD:3}
进行排队

最后你会发现
{Z:ABCD:n}
,其中
n
是一段距离

我会用一个。通常将节点标记为已访问,以便每个节点只访问一次。但是对于这个问题,您需要跟踪找到的物品和行驶的距离。因此,可以使用不同的项目集多次访问每个节点

使用您的示例,让我们为项目指定标签

A for 200 poke balls
B for lure module
C for incense
D for egg
和节点

S for the start node
T for the top node
M for the middle node
L for the lowest node
Z for the end node
假设所有路径的成本相等,且成本为1

问题从
{S::0}
开始,这意味着节点S没有项目,距离为0。然后将
{T:C:1}
{M:A:1}
{L:BD:1}
排队

{T:C:1}
中,您排队
{S:C:2}
{M:BC:2}
{Z:BCD:2}

当您从队列中拉出
{S:C:2}
时,您会注意到节点T已经有了距离为1的项C,因此您不排队
{T:C:3}
。但是您将对
{M:AC:3}
{L:BCD:3}
进行排队


最后你会发现
{Z:ABCD:n}
,其中
n
是一段距离

@MooingDuck可以提供一些例子吗?链接或文档都可以。我的想法很傻,它的工作原理是假设你通常在几次尝试后就能找到它们,我认为a*启发法需要低估,所以添加是无效的。忽略我说的话。@MooingDuck是的,除非你能找到一个可接受的启发式方法来正确地确定优先级,否则A*甚至不适用于这个问题。事实上,如果选择了一个不好的启发式,a*就变成了一个非常慢的BFS。慢是因为它使用了优先级队列而不是简单队列,慢是因为它浪费了计算启发式的时间。@MooingDuck可以提供一些例子吗?链接或文档都可以。我的想法很傻,它的工作原理是假设你通常在几次尝试后就能找到它们,我认为a*启发法需要低估,所以添加是无效的。忽略我说的话。@MooingDuck是的,除非你能找到一个可接受的启发式方法来正确地确定优先级,否则A*甚至不适用于这个问题。事实上,如果选择了一个不好的启发式,a*就变成了一个非常慢的BFS。慢是因为它使用优先级队列而不是简单队列,慢是因为它浪费了计算启发式的时间。BFS比*慢得多。BFS比*慢得多。