从优先队列中拿起带有主要向量的物品

发布于 2025-01-21 00:06:57 字数 2742 浏览 1 评论 0 原文

实现A*优先级队列

import heapq
class PriorityQueue:
    def __init__(self):
        self.elements = []

    def empty(self):
        return len(self.elements) == 0

    def put(self, item, priority):
        heapq.heappush(self.elements, (priority, item))

    def get(self):
        return heapq.heappop(self.elements)[1]

可以使用 。当item被拾取时,priority数字是队列中剩余项目的优先级数字中最小的。在 NAMOA 算法中,而不是单个数字定义优先级,使用向量。因此,当拾取item时,相关向量是“主导的”。

如果f支配向量f' src="https://latex.codecogs.com/gif.image?%5Cdpi%7B110%7D%5Cforall%20%5Cvec%7Bf%7D ,%20%5Cvec%7Bf%7D%27,%20%5Cin%20%5Cmathbb%7BR%7D%5Eq%20%5Cquad%20%20%5Cvec%7Bf%7D% 20%5Cprec%20%5Cvec%7Bf%7D%27%20%5C左箭头%20%5Cforall%20i%20%7E%20f_i%20%5C leq%20f_i%27%7E%5Ctext%7Band%7D%7E%20%5Cvec%7Bf%7D%20%5Cneq%20%5Cvec%7Bf%7D%27%20" alt="输入图像描述 这里>.

例如,向量 (2, 3) 支配 (2, 4),但 (2, 3)< 不存在支配 /code> 和 (3, 2) 要确定向量是否占主导地位,我们可以使用 这个到目前为止我已经尝试过

class Node(object):
    def __init__(self, item: int, vec: list):
        self.item = item
        self.vec = vec

    def __lt__(self, obj):
        """self.vec < obj.vec"""
        return map(operator.lt, self.vec, obj.vec)

    def __le__(self, obj):
        """self <= obj."""
        return map(operator.le, self.vec, obj.vec)

    def __eq__(self, obj):
        """self == obj."""
        return map(operator.eq, self.vec, obj.vec)

    def __ne__(self, obj):
        """self != obj."""
        return map(operator.ne, self.vec, obj.vec)

    def __gt__(self, obj):
        """self > obj."""
        return map(operator.gt, self.vec, obj.vec)

    def __ge__(self, obj):
        """self >= obj."""
        return map(operator.ge, self.vec, obj.vec)

class PriorityQueue:
    def __init__(self):
        self.elements = []

    def empty(self):
        return len(self.elements) == 0

    def push(self, node):
        heapq.heappush(self.elements, node)

    def pop(self):
        x = heapq.heappop(self.elements)
        return x.item

# Example
open = PriorityQueue()
open.push(Node('source1', [2, 3]))
open.push(Node('source2', [1, 1]))
open.push(Node('source3', [2, 4]))
item = open.pop()

拾取的项目是source3,而所需的结果是 source2,具有主导向量,即 [1, 1]

To implement A*the priority queue

import heapq
class PriorityQueue:
    def __init__(self):
        self.elements = []

    def empty(self):
        return len(self.elements) == 0

    def put(self, item, priority):
        heapq.heappush(self.elements, (priority, item))

    def get(self):
        return heapq.heappop(self.elements)[1]

can be used. When an item is picked up, the priority number is the smallest among the priority numbers of the remaining items in the queue. In the NAMOA algorithm, instead of a single number that defines the priority, a vector is used. Thus, when an item is picked up, the associated vector is "dominant".

The vector f dominates the vector f' if enter image description
here.

For example, the vector (2, 3) dominates (2, 4), but no dominance relation exists for (2, 3) and (3, 2). To decide if a vector is dominant we can use this. So far I have tried

class Node(object):
    def __init__(self, item: int, vec: list):
        self.item = item
        self.vec = vec

    def __lt__(self, obj):
        """self.vec < obj.vec"""
        return map(operator.lt, self.vec, obj.vec)

    def __le__(self, obj):
        """self <= obj."""
        return map(operator.le, self.vec, obj.vec)

    def __eq__(self, obj):
        """self == obj."""
        return map(operator.eq, self.vec, obj.vec)

    def __ne__(self, obj):
        """self != obj."""
        return map(operator.ne, self.vec, obj.vec)

    def __gt__(self, obj):
        """self > obj."""
        return map(operator.gt, self.vec, obj.vec)

    def __ge__(self, obj):
        """self >= obj."""
        return map(operator.ge, self.vec, obj.vec)

class PriorityQueue:
    def __init__(self):
        self.elements = []

    def empty(self):
        return len(self.elements) == 0

    def push(self, node):
        heapq.heappush(self.elements, node)

    def pop(self):
        x = heapq.heappop(self.elements)
        return x.item

# Example
open = PriorityQueue()
open.push(Node('source1', [2, 3]))
open.push(Node('source2', [1, 1]))
open.push(Node('source3', [2, 4]))
item = open.pop()

The picked up item is source3, while the desired result is source2, with the dominant vector, i.e., [1, 1].

Could you please someone cast some light?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文