使用回溯的最小图形着色

时间:2013-04-15 04:16:38

标签: java backtracking pruning graph-coloring

我正在处理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;
}

1 个答案:

答案 0 :(得分:0)

一个简单,高效且众所周知的精确算法使用Brélaz最小饱和度启发式DSATUR(即选择具有较少可用颜色的新候选顶点,具有更多不同颜色的别名邻居)在完整的enumeration scheme内进行分支。

基本修剪策略是隐含的:每个候选顶点最多只能有前面顶点+ 1中使用的颜色(新颜色,如果饱和则分配)。这意味着可以沿着任何分支修剪搜索,该分支在最后一个分配为 new 颜色的顶点上回溯。

很抱歉,我不能提及基于DSATUR的精确算法的Java实现,但如果您有兴趣,我可以给C,C ++引用。