Color coding 解决最小权重k-path问题(例子)

来源:互联网 发布:python 爬虫要学多久 编辑:程序博客网 时间:2024/06/03 19:39

Color coding 解决最小权重k-path问题

首先简单介绍一下Color coding,Color coding是一种近似算法。主要用于解决图论中的问题,将图中的顶点着色,通过颜色来决策。详细的我也不清楚,你可以去维基百科上看看。

再介绍一下最小权重K-Path,很简单就是在一个图中寻找一条长度为K(包含K个顶点的路径),并且保证该路径的权重最短。我们在下面讨论的是以某一点为起点的算法,全局最短可有两种思路,第一种就是对所有点都当成起点来一次,求最短,还有就是每一次着色后都随机选择一个起点,当第二种方法运行的次数足够多是,他的性能就会向第一种收敛。

Color coding的过程如下:

1 使用K种颜色对图随机着色。

2 构建一个表,列为图中的顶点,行为K的大小。

3 进行动态规划。

代码描述能力有限,直接走个例子吧。

 

说明一下,上图就是着完色的图,K=4,所以有四种颜色。颜色用r,g,b,y代表。线上的数字就是权重。

动态规划填表时,表里的内容为一个{数字,颜色集合}。行数代表路径的长度,列代表这条路径终点。举个例子,比如在K=3,V5的格子里填有{5,[r,y,b]},意思就是从V1到V5之间有长度为3的路径,总权重为5,终点为V5,经过红—黄—蓝三色。

当我们从长度为i的路径延伸为长度为i+1的路径时,我们对所有长度为i的路径的终点的邻居进行遍历。如果一个邻居的颜色不属于当前的颜色集合。就可以把它加进来,并把它作为路径终点,如果一个顶点可以成为多条路径的终点,这时候就取一个最短的(此处就是动态规划的核心)。

初始化:

K

V1

V2

V3

V4

V5

V6

1

 

 

 

 

 

 

2

 

 

 

 

 

 

3

 

 

 

 

 

 

4

 

 

 

 

 

 

 

第一步:

求K=1的path,只有一个顶点即为起点,因此在K=1的V1下填写[0,(r)]意为权重为0,颜色集为(r)。表的第一行填写如红色部分。

第二步:

求K=2的path,对第一行不是--的所有的顶点的邻居进行遍历。即对V1的邻居进行遍历。一共有V2,V3,V4。对于V2,他的颜色不在V1的颜色集合里,可以在K=2的V2下填写[1,(r,g)],同理V3下填写4,[(r,b)],V4下填写[4,(r,g)],其他空格为--。

第三步:

对第二行的每个--的顶点的邻居遍历,首先对V2的邻居进行遍历。一共有V1,V3,V4。V1,V4的颜色为r和g,因此能再加到路径上。对于V3,其颜色不属于(r,g),因此可以加到路径中,在K=3,V3下填上[3,(r,g,b)]。按照这种方法对V3,V4的另据进行相同操作。最后发现V3和V6下填了两个。这时就选取最小的那个作为结果。

第四步:

按照上面的步骤填完这张表。对于K=4的那行,选取权重最小的就可以了。

K

V1

V2

V3

V4

V5

V6

1

[0,(r)]

--

--

--

--

--

2

--

[1,(r,g)]

4,[(r,b)]

[4,(r,g)]

--

--

3

--

[6,(r,b,g)]

Min{[3,(r,g,b)],[5,(r,g,b)]}

[5,(r,b,g)]

--

Min{[8,(r,b,y)],[7,(r,g,y)]}

4

--

--

[7,(r,g,b,y)]

[8,(r,b,g,y)]

--

[11,(r,g,y,b)]

这样,一次的着色算法就完成了。你觉得很荒唐,长度为4的路径明明是V1,V2,V4,V5长度为4,怎么用着色的方法得到的却是7呢?

因为着色算法是近似的,他要求你着色足够多次,就能在一个概率下得到最优解。看下面的证明:


首先假设有这样的一条K-path,权重最小。他们被着不同颜色的概率是K!,这点毋庸置疑。用K种颜色着色的总的方案数为K的K次方。因此着色能找到最优路径的概率是上述结果。重复足够多次,就能近似的找到结果。


0 0
原创粉丝点击