我正在处理m_coloring问题,其中我必须使用回溯来确定无向图的色数m。到目前为止我的(java)解决方案是增量m,尝试m_Coloring方法,然后重复,如果找不到解决方案。但是,对于较大的文件,如果m大于6,则计算将永远进行。有人告诉我,我们使用的算法没有修剪整合,所以我试图弄清楚如何将它放入并且在搜索一周后没有运气。
vColor = new int[nodes+1];
vColor[1] = 1;
while(unsolved)
{
m++;
mColoring(1);
}
static void mColoring(int i)
{
int color;
if (promising(i))
{
if (i==nodes)
{
unsolved = false;
}
else
{
for(color = 1; color<=m; color++)
{
if(unsolved)
{
vColor[i+1] = color;
mColoring(i+1);
}
}
}
}
}
static public boolean promising (int i)
{
int j=1;
boolean promise = true;
while(j<i && promise)
{
if(adjMatrix[i][j] && vColor[i] == vColor[j])
{
promise = false;
}
j++;
}
return promise;
}
答案 0 :(得分:0)
一个简单,高效且众所周知的精确算法使用Brélaz最小饱和度启发式DSATUR(即选择具有较少可用颜色的新候选顶点,具有更多不同颜色的别名邻居)在完整的enumeration scheme内进行分支。
基本修剪策略是隐含的:每个候选顶点最多只能有前面顶点+ 1中使用的颜色(新颜色,如果饱和则分配)。这意味着可以沿着任何分支修剪搜索,该分支在最后一个分配为 new 颜色的顶点上回溯。
很抱歉,我不能提及基于DSATUR的精确算法的Java实现,但如果您有兴趣,我可以给C,C ++引用。