我正在尝试使用搜索算法,我正在尝试使用A *算法来解决问题。
我正在使用字典列表来保留内部节点结构。 每个节点的特征在于某个状态和相关的成本。 选择函数应返回成本最低的节点。 为了能够做到这一点,我每次都过滤列表。 如果问题非常小,我发现这很快 但是在列表非常大的情况下,此函数使用算法总时间的84%。
我的问题是,是否有更有效的方法。
def select(self, frontier):
frontier.sort(key = lambda x: x['f_cost'])
#select the node with the lowest f_cost
return frontier.pop(0)
答案 0 :(得分:2)
是的,从一开始就不要.pop
!那是线性时间。最后的.pop
是不变的,所以就这样做:
def select(self, frontier):
frontier.sort(key = lambda x: x['f_cost'], reverse=True)
#select the node with the lowest f_cost
return frontier.pop()
如果您尝试维护已排序的序列,则可能需要考虑其他数据结构。您可以查看heapq
,它是标准库的一部分,尽管它非常简单。您可能还会考虑sortedcontainers
库,显然,非常高效。
答案 1 :(得分:0)
您应该使用attrgetter
或itemgetter
等函数作为键而不是lambda函数,因为它被认为更快。
文档: https://docs.python.org/3/howto/sorting.html
有关详细信息,请查看此答案。 operator.itemgetter or lambda