【问题标题】:Is there a way to make a priority queue sort by the priority value in a tuple only, ignoring the other value in a pair?有没有办法使优先级队列仅按元组中的优先级值排序,而忽略一对中的另一个值?
【发布时间】:2021-06-01 12:56:47
【问题描述】:

我正在使用 Python 的 Queue.PriorityQueue(在 A* 算法的实现中,虽然我不确定这是否相关)。我用它来保存不可比较的对象(由教授提供的我无法修改的对象类),当 Python 尝试添加优先级对象元组(例如pq.put(1, object))时会抛出错误它已经持有一个具有相同优先级的元组。

这是错误的相关部分:

File "pathfinding.py", line 192, in astar
  frontier.put((priority, neighbor))
File "/usr/lib/python3.7/queue.py", line 149, in put
  self._put(item)
File "/usr/lib/python3.7/queue.py", line 233, in _put
  heappush(self.queue, item)
TypeError: '<' not supported between instances of 'InfNode' and 'InfNode'

基本上,我正在寻找一种绕过 PriorityQueue 尝试比较这两个对象的方法。相同优先级的对象排序的确切顺序对我来说完全不重要。

我确实找到了this solution,但它不使用 PriorityQueue,所以我不确定我是否可以做类似的事情,或者这是否完全不可能(在这种情况下我将不得不修改我的算法是这样的,这是不可取的。)。

【问题讨论】:

  • queue.PriorityQueue 是一个糟糕的选择,顺便说一下 - 它被设计为线程间消息传递系统,而不是通用堆。此外,它不支持减少键,这对于良好的 A* 实现很重要。
  • 另外,“我确实找到了这个解决方案,但它不使用 PriorityQueue” - 确实如此!你在说什么?
  • 以“如果数据元素不可比较”开头的文档建议有什么问题?
  • @user2357112supportsMonica 啊,如果是这种情况,你认为我应该改用什么数据结构?就像我之前说的,我真的对python一无所知。
  • @user2357112supportsMonica 哦哦哦我链接了错误的答案!对于那个很抱歉。我会解决的

标签: python priority-queue


【解决方案1】:

好的,以防万一有人在这里结束,我最终考虑了精湛的 rain 的评论,因为我正在寻找一个更简单的解决方案,我真的没有时间彻底检查我的解决方案以使其更高效或更好.我只是需要一些工作。

解决方案基本上只是执行建议here。如果有人在看这个但真的不明白 Python 是如何工作的(比如我!),把这个放在最上面。

from dataclasses import dataclass, field
from typing import Any

@dataclass(order=True)
class PrioritizedItem:
    priority: int
    item: Any=field(compare=False)

然后,不要将 .put() 与元组一起使用,而是将整个 PrioritizedItem 类放入 pq.put(PrioritizedItem(0, start)) 或 pq.put(PrioritizedItem(priority, data))。然后取出物品:current = pq.get().item.

我想感谢 user2357112-supports-Monica 提出的使用自定义堆实现的建议。如果我有时间或真正了解如何使用 Python,我会很想尝试一下,但同样我真的没有时间去做一个只提供最低限度功能的解决方案。

我在这里发布这个只是为了礼貌。此解决方案可能仅适用于从 Python 3.7 开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多