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