Algorithm 利润最大化的寻路算法

Algorithm 利润最大化的寻路算法,algorithm,graph,graph-algorithm,path-finding,Algorithm,Graph,Graph Algorithm,Path Finding,假设我们有一个有向图,其中每条边包含一个元组(d,p),其中d是必须移动的距离,p是通过遍历该边获得的利润,在遍历一条边后,其利润设置为0。我的问题是,给定一个起始节点和最大距离D(这样穿过所有边的∑D

假设我们有一个有向图,其中每条边包含一个元组(d,p),其中d是必须移动的距离,p是通过遍历该边获得的利润,在遍历一条边后,其利润设置为0。我的问题是,给定一个起始节点和最大距离D(这样穿过所有边的∑D),求解最大利润,其中穿过所有边的利润定义为∑p

可以重新访问节点并重新遍历边


我试图修改dijkstra,但没有成功,因为dijkstra不知道何时停止洪水填充,而且据我所知,在检查所有可能性之前,没有办法保证dijkstra的最佳解决方案。我还研究了TSP的各种变化,这个问题似乎与路径查找有关。任何参考文献、伪代码或已经理解的算法都将不胜感激。当然,我不是在寻找蛮力算法。

考虑到问题的规模,我们可以用整数程序成功地攻击它。对于每个有向边
e
,设
x(e)
为非负整数变量,表示我们使用该边的次数,
y(e)
为0-1变量,表示我们从该边获利的次数。对于每个顶点
v
,将
w(v)
设为0-1变量,指示是否访问
v
,将
z(v)
设为0-1变量,指示
v
是否为结束顶点。integer程序最简单的部分是

maximize sum_e p(e) y(e)
subject to
y(e) <= x(e)            # can't profit from an edge if we don't use it
for all e, y(e) <= w(head(e))    # can't profit unless we visit
for all e, y(e) <= w(tail(e))    # can't profit unless we visit
sum_e d(e) x(e) <= D    # bounded distance
sum_v z(v) = 1          # exactly one ending vertex
# path constraints
for all vertices v, sum_{e with head v} x(e) - sum_{e with tail v} x(e) =
    z(v) - 1 if v is the starting vertex,
    z(v)     otherwise.

从哈密顿路径归约的NP难问题。与非对称集奖旅行商问题相关。@Davidisenstat是的,感谢您提到它是NP难问题,从我在非对称集奖旅行商问题上所能找到的文献来看,除了只访问一次节点之外,它确实非常相似。@Davidisenstat在进一步阅读后,奖品收集TSP的优化目标似乎与我的目标相去甚远,奖品收集TSP的目标是访问一个子集的节点,使巡更的长度加上所有不在巡更中的节点的惩罚之和尽可能小。对穿越的最大距离没有明显的限制,只是试图将其保持在较低的水平。这不是一个精确的对应关系,但是(在分割每条边以允许中间有奖品之后),您可以通过尝试几个不同的D值,并通过引入拉格朗日乘数,使用APCTSP的算法来很好地近似APCTSP。注意到这种关系的想法与其说是对APCTSP应用现成的算法,不如说是用来攻击APCTSP的想法可能对这个问题有用。我正在写一个想法。从约束开始,我们不是在试图最大化
和p(e)y(e)
?因为重新遍历一条边并不能获得更多的利润,
x(e)
可以大于一。对于这些限制,我不明白为什么必须有
x(e)我也不明白Euler轨迹在这里有什么用处,难道我们不需要事先知道子图来确定Euler轨迹吗?@Bryce219弄糊涂了
x
y
,已修复。@Bryce219 Euler轨迹将使用计数转化为实际行走。@Bryce219约束在所选多组边中强制执行Euler轨迹的存在条件:除源和汇外,入度等于出度,加上强连接性(“硬”约束)。最后一个约束是不同的,因为它扩展为指数数量的约束。
for all sets of vertices S containing the starting vertex,
    for all vertices v not in S,
        sum_{directed edges e entering S} y(e) >= w(v)