调度算法 - 只有首次访问付费

时间:2011-12-15 04:27:22

标签: algorithm optimization scheduling graph-theory

我需要知道以前是否已经研究过以下问题:

让我们有一个有向无环图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]--

3 个答案:

答案 0 :(得分:1)

这是考虑动态图形的最短路径问题的一个很好的变体,即随着时间的推移而变化的图形(当你离源更远时,边缘权重会发生变化)。 Dijkstra's algorithm将解决它,因为边缘的权重是在你去的时候计算的,所以边缘权重根据你去过的地方而不同并不重要。这是维基百科的描述,其中考虑了粗体颜色变化问题

  

让我们开始的节点称为初始节点。让   节点Y的距离是从初始节点到Y的距离。   Dijkstra的算法将分配一些初始距离值并且将会   尝试逐步改进它们。

     
      
  1. 为每个节点分配一个暂定距离值:为我们的初始节点设置为零,为所有其他节点设置为无穷大。

  2.   
  3. 标记未访问的所有节点。将初始节点设置为当前节点。创建一组称为未访问集的未访问节点   由除初始节点之外的所有节点组成。

  4.   
  5. 对于当前节点,考虑所有未访问的邻居并计算其暂定距离。 现在这取决于到目前为止所选择的路径。例如,如果是当前的   节点A标记为距离为6,边缘连接它   邻居B的长度为2 基于有色权重,那么到目前为止通过路径到B 的距离将是   6 + 2 = 8。如果此距离小于先前记录的距离,   然后覆盖那个距离。即使是邻居也是如此   经检查,此时未标记为已访问,并且仍然存在   未经审查的集合。

  6.   
  7. 当我们考虑当前节点的所有邻居时,将当前节点标记为已访问并将其从   未经审查的集合。永远不会再次检查受访节点;它的   现在记录的距离是最终的,最小的。

  8.   
  9. 如果目标节点已标记为已访问,则停止。算法已经完成。

  10.   
  11. 将标记有最小暂定距离的未访问节点设置为下一个“当前节点”,然后返回步骤3.

  12.   

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放松可能足以分支并开始工作。