我需要知道以前是否已经研究过以下问题:
让我们有一个有向无环图G.图是连通的,它只有一个源顶点(没有输入节点)和恰好一个宿顶点(没有输出节点)。
每个顶点都以美元和颜色分配了非负价格。
目标是找到从开始到水槽的步行,最大化访问边缘的价格总和。
问题是,只有在第一次访问特定颜色的顶点时才会收到价格。例如,当我们使用价格为1的红色顶点,然后是带有$ 2的蓝色顶点然后是带有$ 30的红色,总价格是$ 3.
我特定问题的大致尺寸:50000个顶点,3000种颜色,从开始到下沉的典型步行长度约为200个边缘。
------>[B red $1]--- ---->[E red $1]----
/ \ / \
[A black $0] ==>[D black $0]== ==>[G black $0]
\ / \ /
---->[C green $2]--- ->[F green $1000]--
答案 0 :(得分:1)
这是考虑动态图形的最短路径问题的一个很好的变体,即随着时间的推移而变化的图形(当你离源更远时,边缘权重会发生变化)。 Dijkstra's algorithm将解决它,因为边缘的权重是在你去的时候计算的,所以边缘权重根据你去过的地方而不同并不重要。这是维基百科的描述,其中考虑了粗体颜色变化问题:
让我们开始的节点称为初始节点。让 节点Y的距离是从初始节点到Y的距离。 Dijkstra的算法将分配一些初始距离值并且将会 尝试逐步改进它们。
为每个节点分配一个暂定距离值:为我们的初始节点设置为零,为所有其他节点设置为无穷大。
标记未访问的所有节点。将初始节点设置为当前节点。创建一组称为未访问集的未访问节点 由除初始节点之外的所有节点组成。
对于当前节点,考虑所有未访问的邻居并计算其暂定距离。 现在这取决于到目前为止所选择的路径。例如,如果是当前的 节点A标记为距离为6,边缘连接它 邻居B的长度为2 基于有色权重,那么到目前为止通过路径到B 的距离将是 6 + 2 = 8。如果此距离小于先前记录的距离, 然后覆盖那个距离。即使是邻居也是如此 经检查,此时未标记为已访问,并且仍然存在 未经审查的集合。
当我们考虑当前节点的所有邻居时,将当前节点标记为已访问并将其从 未经审查的集合。永远不会再次检查受访节点;它的 现在记录的距离是最终的,最小的。
如果目标节点已标记为已访问,则停止。算法已经完成。
- 醇>
将标记有最小暂定距离的未访问节点设置为下一个“当前节点”,然后返回步骤3.
Nannicini和Liberti对Shortest paths on dynamic graphs进行了很好的调查。
答案 1 :(得分:1)
如果我正确理解了这个问题,可以在O( E )时间内解决,如下所示。 让我们从正式定义其解决方案开始。
鉴于DAG G =( V , E ),让FS( i )成为< em>顶点顶点 i :
E 中的FS( i )= {( x , y ): x < / em> = i }
让 C 到目前为止所访问的顶点颜色集合,让p [ i ]和c [ i ]分别为顶点的价格和颜色 i ;现在定义奖励 r 从顶点 i 到属于FS的顶点 j ( i < / em>)as
r [ i , j ] = p [ j ]如果c [ j ]不属于到 C
否则r [ i , j ] = 0(如果c [ j ]属于 C )
我们现在准备如下定义我们的子问题:
i , j , C )= max k 属于FS( i ){r [ i , k ] + D( k , j , C union {c [ k ]}}}
使用D( i , i , C )= 0作为终止条件(当我们到达汇聚节点时需要)
首先要解决的问题是D( s , t ,{c [ s ]})其中 s 和 t 分别是源顶点和汇点顶点:
( s , t ,{c [ s ]})= max k 属于FS( s ){r [ s , k ] + D( k , t ,{c [ s ]} union {c [ k ]}}}
要解决此问题,请使用与顶点前向星相对应的邻接列表存储DAG。然后从源顶点开始,确定与考虑颜色约束的所有路径关联的成本。由于您基本上是在探索顶点的前向星并且永远不会返回,因此总体复杂度为O( E ),使用哈希表来表示集合,因此插入颜色和成员资格测试需要O (1)平均时间。我所谓的 union 实际上是一个 insert 操作(每次执行单例集合时,结果都是相同的。)
答案 2 :(得分:0)
有趣的问题。它是NP难的,但与任何近似算法文献的经典都没有相似之处。
通过示例证明集合封面实例{{1,2,3},{2,4},{3,4},{4,5}}的缩减。所有边缘都朝下。
s:$0
| \
| \
| \
| 1:$100
| |
!A:$1 2:$100
| |
| 3:$100
| /
| /
| /
*:$0
| \
| \
| \
| 2:$100
!B:$1 |
| 4:$100
| /
| /
| /
*:$0
| \
| \
| \
| 3:$100
!C:$1 |
| 4:$100
| /
| /
| /
*:$0
| \
| \
| \
| 4:$100
!D:$1 |
| 5:$100
| /
| /
| /
t:$0
我不知道是否有一个好的近似算法(这种减少不排除它)。使用单位流而不是路径的LP放松可能足以分支并开始工作。