graph coloring学习记录

  

  首先简要的说明一下,VCP(Vertex Coloring Problem)也就是最基础的graph coloring 问题,即,在一个无向图上给每个节点染色,要求相邻节点的颜色不同,同时使颜色总数最小。

  然后从VCP中延伸出了PCP(Partition Coloring Problem),描述是,整个图已经被分成了k个部分,你需要在每个部分中选择一个点,使这些点构成的诱导子图在VCP问题中,染色数最小化。

  目前有两种明确的算法来解决PCP问题,一种是branch-and-cut,另一种是branch-and-price。

  但是首先,让我们用一些线性规划方程来描述PCP。

  显然,我们颜色数的上界是PCP中给出的划分数k,因为最差的情况一定是每个节点的颜色都互不相同,所以定义y_c={0,1}表示颜色c是否被使用,x_vc={0,1}表示v点是否被染成了颜色c,那么我们的目的显然是sum_{c=1}^k y_c最小,同时满足sum_{c=1}^k sum_{v∈P_i} x_vc =1 (即每个分割都只有一个点被染色),x_vc+x_uc≤y_c(即相邻的两个点不能染成相同的颜色)

  但是这个约束会受到对称性(这里不太清楚,论文上没有细说)的影响,使其只适用于规模较小的图。

  我们使用另外一种约束方法。

  另S为V的一个类似于幂集的集合,S中的任意一个集合都是V的一个子集,同时与每个划分交集大小不超过1,且任意两点之间不存在边。我们会发现这实际上是PCP中的一种颜色选择。那么我们继续定义ξ_S={1,0}即,S中的所有点是否相同。

  那么,我们的约束就变成了最小化sum ξ_S,约束10大概是想要表示对于每个划分,必须且只能有一个点被染成一一种颜色?(但是感觉它的描述存在问题),之后将ξ_S放宽为非负实数。

  upd:上面的约束大概开始是通过限制ξ_S只能为1、0来约束,之后放宽为非负实数的话,也就是说存在多个颜色选择方案涉及到划分i,那么ξ_S就变成了小数

  但是第二个约束的解被证明不会比第一种约束更优。

  upd:似乎不是最优,而是最小化的值更大。。。因为维护的不是同一个东西。。。但是看到后面怎么又感觉第二个会比第一个更优?好像第一个之后把取值也改成非负实数后就出问题了。。。

  /*定义p(v)为v所在的划分的编号,那么每个颜色选择的编号c(S)就可以定义为其中所在划分最小的那个编号。这在答案中一定是不会重复的。*/

  解决第二个约束的朴素思想是枚举S集合的元素,S的规模是指数级的。论文提出用列生成算法去解决这个约束。

  具体的branch-and-price算法,是由一个列生成算法和一个分支计划(branch scheme)构成的。大概就是我们预先给出一个对约束的分配,用一个估价函数,对当前的分配进行评估,把不满足要求的点调出来,再次分配,不断重复,直到没有冲突。

  问题在于我们如何定义这个估价函数(文中定义了一个optimal vector?),文中把它转化成了MWSSP。。。(这一段不是很难理解?)

  之后是branch scheme的介绍,也不是很难理解?主要是两条分支(搜索?)条件

  发现论文的核心其实是后面的搜索方式的描述。。。而且也不是很难理解。。。主要就是讲LS的具体操作办法,以及定义一次搜索的好坏之类的。。。

 

  这篇论文应该放在第二位去读的。。。当我读了第二篇之后我才意识到这算是其中的一个操作的具体描述之类的。。。(mac打字声音真大。。。无论我怎么刻意压制声音。。。)

  

  接下来是第二篇论文,讲的是混合进化算法在graph coloring上的应用。核心思想就是我们用遗传算法作为整个混合算法的框架,在选择crossover的两个值时,区别于遗传算法的随机选择,这里会有一个选择机制(具体是什么我给忘了,好像文章中也没有说的太过具体。。。)

  在进行crossover之后,混合算法并不是直接将其插入种群当中,而是采用贪心和LS对其进行优化,这里的LS算法具体使用的是TS。

  就像爬山法一样?(我不是很清楚爬山法,只是觉得很形象就拿来用了。。。upd:刚刚查了一下,发现TS就是爬山法?(问句表示不确定的语气))为了防止算法停留在局部最优解上,就用一个TB table来记录之前的交换,强制之后的n次LS不能再次交换,这里的n是由一个公式给出的,里面的参数需要具体调节。

  大概就是这样?这篇论文感觉十分浅显易懂。。。

 

 

  过几天写代码了解一下?。。。。

转载于:https://www.cnblogs.com/htwx/p/8661565.html

你可能感兴趣的:(graph coloring学习记录)