导航:首页 > 源码编译 > 图的点着色问题算法

图的点着色问题算法

发布时间:2023-03-20 20:24:25

‘壹’ “四色定理”在实际中有什么应用

四色定理是图的着色问题的一个结果。图的着色本质是给图中的顶点贴标签(labeling),但是要满足一定的条件。“色”只是一种标签。

四色定理的描述虽然提到了地图,但是地图绘制并不需要四色定理:他只要着色,不需要用最少的颜色。实际画地图时一般不用四种颜色。

着色问题的应用,主要排程和分配问题上。
比如我有几个任务,每个任务都需要一天。而我知道其中几样任务是冲突的,不能安排在同一天完成。现在我希望四天完成。这就是四色问题了:所用的图以任务为顶点,冲突的任务间连边,用日期做颜色,对图着色。

再比如我有一些员工,我希望把他们分成四个小组。但是我知道其中几个员工互相之间有矛盾,不能安排在同一组。那么这又是四色问题:所用的图以员工为顶点为,矛盾的员工间连边,用组做颜色,对图着色。

四色定理说:如果上面提到的图是平面图(有高效算法判定),那么可能四天完成/可能分成四组。

‘贰’ 用c#编码一个图的m-着色问题

给出一个图的m-着色的程序段,回溯法:
/* 图的邻接矩阵Graph[n,n]表示无向连通图G,
1,2,3,..m代表不同的颜色
顶点i所着色用x[i]表示,初始值都赋为0
*/
void NextValue(int k)
{
int j, flag;
do{
x[k] = (x[k]+1) % (m + 1)//分配给x[k]一种新的颜色
if (x[k] == 0)
return; //x[k]的颜色已用完
flag = 1; //x[k]是否可用的标记
for (j = 0; j < n; j++)
if (Graph[k,j] == 1 && x[k] == x[j]){
flag = 0; //x[k]不可用
break;
}
while (flag);
}
void MColoring(int k)
{
while (x[k] < m){ //产生x[k]的合理分配
NextValue(k); //找x[k]的一个合理分配
if (x[k] == 0)
return; //无解,结束调用
if (k == n) { //着完n个顶点,找到完整着色法,输出
Output(x,k) //输出当前解
else
MColoring(k+1)
}
}

/*
递归算法:
void Coloring(区域 n)
1. 令颜色集ClrSet={ 没有被区域n的邻居区域使用的颜色 }.
2. 如果ClrSet是空集,返回.
3. 对ClrSet中的每种颜色c,作循环:
3.1 为区域n着色c。
3.2 如果所有区域都已着色(n是最后一个区域),那么显示/保存着色结果.
3.3 否则对下一个尚未着色的区域(n+1),调用Coloring(n+1).
4. 把区域n变为没有着色的区域.
--------------------------------------------------------
*/
template<int node_count = 8>
class CColoring
{
private:
typedef int node_type;
typedef int color_type;
typedef std::set<node_type> node_set;
typedef std::vector<color_type> color_array;

public:
void operator()(const int _Matrix[node_count][node_count])
{
matrix = _Matrix;

colors_of_nodes.resize(node_count, 0);

total_count = 0;

coloring(0);
}

private:
void coloring(node_type n)
{
// 颜色的使用情况
std::vector<bool> used_colors;

node_type m;
color_type c;

// 初始化颜色的使用情况
used_colors.resize(color_count, false);

// 遍历每个与区域n相邻的区域m
for(m = 0; m < node_count; ++m)
{
if(matrix[n][m])
{
// 获取m的颜色
c = colors_of_nodes[m];
// m已着色
if(c != 0)
used_colors[c] = true;
}
}

// 遍历每个未被n的邻居使用的颜色c
for(c = 1; c < color_count; ++c)
{
if(!used_colors[c])
{
// 为n着色c
colors_of_nodes[n] = c;

// 着色完毕
if(n >= node_count - 1)
{
++total_count;

// 输出结果
_tprintf(_T("---------------------\n"));
_tprintf(_T("Method %d:\n"), total_count);
for(m = 0; m < node_count; ++m)
{
_tprintf(_T("node: %d, color: %d\n"), m, colors_of_nodes[m]);
}
}
// 还有区域没有着色
else
{
// 为下一个未着色的区域,调用coloring()
coloring(n + 1);
}
}
}

// 将n设置为没有着色的区域
colors_of_nodes[n] = 0;
}

// 0表示无色,1-4表示4种不同颜色
static const int color_count = 5;
// 邻接矩阵
const int (* matrix)[node_count];
// 各区域对应的颜色
color_array colors_of_nodes;
// 总的着色方案数
int total_count;
};

void main()
{
int Matrix[4][4] =
{
{ 0, 1, 0, 0 },
{ 1, 0, 0, 0 },
{ 0, 0, 0, 1 },
{ 0, 0, 1, 0 },
};

CColoring<4> coloring;
coloring(Matrix);
}

‘叁’ 图着色问题的简介

图着色问题(Graph Coloring Problem, GCP)又称着色问题,是最着名的NP-完全问题之一。
数学定义:给定一个无向图G=(V, E),其中V为顶点集合,E为边集合,图着色问题即为将V分为K个颜色组,每个组形成一个独立集,即其中没有相邻的顶点。其优化版本是希望获得最小的K值。

图的m-着色判定问题猜纯——给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色?
图的m-着色优化问题——若一个图最少需要m种颜色才能使图中任意春磨相邻的扒兆斗2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的最小色数m的问题称为m-着色优化问题。

‘肆’ 图着色问题的路线着色问题

道路着色问题(Road Coloring Problem)是图论中最着名的猜想之一。通俗的说,这个猜想认为,可以绘制一张“万能地图”,指导人们到达某一目的地,不管他们原来在什么位置。这个猜想最近被以色列数学家艾夫拉汉· 特雷特曼(Avraham Trahtman)在2007年9月证明。
举个例子。在维基网给出的图例中,如果按图中所示方式将16条边着色,那么不管你从哪里出发,按照“蓝红红蓝红红蓝红红”的路线走9步,你最后一定达到黄色顶点。路线着色定理就是说在满足一定条件的有向图中,这样的着色方式一定存在。严格的数学描述如下。我们首先来定义同步着色。G是一个有限有向图并且G的每个顶点的出度都是k。G的一个同步着色满足以下两个条件:1)G的每个顶点有且只有一条出边被染成了1到k之间的某种颜色;2)G的每个顶点都对应一种走法,不管你从哪里出发,按该走法走,最后都结束在该顶点。有向图G存在同步着色的必要条件是G是强连通而且是非周期的。一个有向图是非周期的是指该图中包含的所有环的长度没有大于1的公约数。路线着色定理这两个条件(强连通和是非周期)也是充分的。也就是说,有向图G存在同步着色当且仅当G是强连通而且是非周期的。
特雷特曼在数学上的这一成果极为令人瞩目,英国《独立报》为此事专门发表了一篇题为“身无分文的移民成了数学超级明星”的文章,给予了高度的评价。
以色列人也为特雷特曼取得的成就感到无比的骄傲。特拉维夫电视台中断了正常的节目播放,以第一时间发布了这一重大消息,连中东其他国家的主流媒体也作了大篇幅的相关报道。
得知特雷特曼解决这一难题的消息后,多年从事路线着色问题研究的加拿大数学家乔尔·弗里德曼说,“路线着色问题的解决令数学共同体非常兴奋。”读过特雷特曼论文的中国数学家和语言学家周海中教授认为,特雷特曼的数学知识非常渊博,解题方法十分巧妙,这一谜题得到破解,无疑是数学史上的一个华彩乐章。 算法描述:color[n]存储n个顶点的着色方案,可以选择的颜色为1到m。
当t=1时,对当前第t个顶点开始着色:若t>n,则已求得一个解,输出着色方案即可。否则,依次对顶点t着色1-m, 若t与所有其它相邻顶点无颜色冲突,则继续为下一顶点着色;否则,回溯,测试下一颜色。 #include<stdio.h>intcolor[100];boolok(intk,intc[][100])//判断顶点k的着色是否发生冲突{inti,j;for(i=1;i<k;i++){if(c[k][i]==1&&color[i]==color[k])returnfalse;}returntrue;}voidgraphcolor(intn,intm,intc[][100]){inti,k;for(i=1;i<=n;i++)color[i]=0;k=1;while(k>=1){color[k]=color[k]+1;while(color[k]<=m)if(ok(k,c))break;elsecolor[k]=color[k]+1;//搜索下一个颜色if(color[k]<=m&&k==n){for(i=1;i<=n;i++)printf(%d,color[i]);printf( );}elseif(color[k]<=m&&k<n)k=k+1;//处理下一个顶点else{color[k]=0;k=k-1;//回溯}}}voidmain(){inti,j,n,m;intc[100][100];//存储n个顶点的无向图的数组printf(输入顶点数n和着色数m: );scanf(%d%d,&n,&m);printf(输入无向图的邻接矩阵: );for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf(%d,&c[i][j]);printf(着色所有可能的解: );graphcolor(n,m,c);} 利用相交图(interference graph)来表示程序变量的生命期是否相交,将寄存器分配给变量的问题,可以近似地看成是给相交图着色:相交图中,相交的节点不能着同一颜色;每一种颜色对应一个寄存器。Chaitin等人最早提出了基于图着色的寄存器分配方法其着色思路采用了Kempe的着色方法,即,任意一个邻居节点数目少于k的节点,都能够被k着色。判断一个图是否能够被k(k>=3)种颜色着色,即k着色问题,被Karp证明是一个NP-complete问题。
但是,寄存器分配不仅仅是图着色的问题。当寄存器数目不足以分配某些变量时,就必须将这些变量溢出到内存中,该过程成为spill。最小化溢出代价的问题,也是一个NP-complete问题。如果简化该问题——假设所有溢出代价相等,那么最小化溢出代价的问题,等价于k着色问题,仍然是NP-complete问题。
此外,如果两个变量的生命期仅仅因为出现在同一个拷贝指令中而相邻,那么,通过将这两个变量分配到同一个寄存器,就可以消除该拷贝指令,成为coalescing。这个方向的努力在Chaitin的文章以后的1/4个世纪,成为推动寄存器分配的主要动力之一,涌现出了包括aggressive coalescing,conservative coalescing和optimistic coalescing。但是,将两个变量分配到同一个寄存器,等价于将这两个变量合并成同一个变量,生命期合并,因而会加剧相交图的聚簇现象,降低相交图的可着色性。Bouchez等人证明了目前的coalescing问题都是NP-complete的。
为了降低相交图的聚簇现象,提高相交图的可着色性,可以通过将变量拷贝给一个临时变量,并将以后对该变量的使用替换成对该临时变量的使用,从而将一个变量的生命期分解成两个变量的生命期,称为live range splitting。显然,这是一个与coalescing的作用相反的过程。Bouchez等人考虑了该方法的复杂度。
此外,寄存器分配还需要考虑寄存器别名(aliasing)和预着色(pre-coloring)的问题。寄存器别名是指,在某些体系结构中,一个寄存器的赋值可能会影响到另外一个寄存器。比如,在x86中,对AX寄存器的赋值,会影响AL和AH寄存器。预着色是指,某些变量必须被分配到特定的寄存器。比如,许多体系结构会采用特定寄存器来传递函数参数。
George和Appel发展了Chaitin的算法,更好地考虑了coalescing过程和赋值过程,以及各过程之间的迭代,在基于图着色的寄存器分配方法中具有广泛的影响。

阅读全文

与图的点着色问题算法相关的资料

热点内容
学而思哪个app免费 浏览:971
孝敬爸妈电影介绍 浏览:94
软件编程前端月收入多少 浏览:983
在线网站78影院 浏览:587
发送接收邮件服务器是什么协议 浏览:737
印度电影有关蛇 浏览:449
广告公司asp源码 浏览:553
韩国电影在线观看韩国推理片推荐 浏览:229
妻子开美容店是什么电影 浏览:50
悦翔V3怎样换压缩机 浏览:353
韩剧男主不勃起去 浏览:215
4位数字电子钟单片机 浏览:699
初中程序员月薪 浏览:968
姜恩惠电影法利赛人云盘 浏览:786
程序员的焦虑有哪些 浏览:348
10部缅甸电影 浏览:207
程序员宾利 浏览:731
初一编程软件教学 浏览:918
ftp服务器的地址是哪个 浏览:15
图像模糊处理算法 浏览:34