Java中的蛮力色数

时间:2011-11-15 23:34:24

标签: java colors matrix brute-force

这是对矩阵色数的强力尝试。它似乎在某种意义上起作用,它给我正确的颜色数量,但不是1,2,3,4,它将显示1,2,3,6。出于某种原因,即使矩阵可能成功用较少的颜色,它仍然会失败并继续达到最大数量。有没有理由继续失败?

“n”是最大颜色数。 “v”是顶点,“m”是当前使用的颜色数。

伪代码: http://i42.tinypic.com/deoc2u.jpg

static int color(){ 
       int i;
       for(i = 1; i <= n; i++)
       {
               if(color(0,i)){
                       return i;}
       }
       return i;
}

    static boolean color(int v, int m) {

    if(v > n-1)
            return true;
    else
    {
            for(int i = 1; i <= m; i++)
            {
                    boolean match = false;
                    q[v] = i;

                            for(int j = 0; j < n; j++)
                            {
                                    if(input[v][j] == 1)                
                                    {
                                            if(q[v] == j+1)
                                                    match = true;
                                    }
                            }

                    if(match == false)
                    {
                            if(color(v+1,m)) 
                                    return true;
                    }
            }
            q[v] = 0;
            return false;
    }

}

示例输出:

文件名:file1
输入
6
0 1 1 0 1 1
1 0 1 1 1 1
1 1 0 1 0 1
0 1 1 0 1 1
1 1 0 1 0 1
1 1 1 1 1 0
1失败了 2失败了 3失败了 4失败了 5失败了

颜色: 1 2 3 1 3 6

1 个答案:

答案 0 :(得分:0)

加,我应该睡着了!但我无法计算我在绝对最后可能的时刻推迟分配的次数,所以我对你的截止日期感到同情。

这实际上并不是一种“暴力”方法,因为实际上这将是尝试每个可能的节点着色组合并检查哪些不冲突。您的方法是一种称为greedy coloring的启发式方法。它可以找到最佳结果,但也可能产生任意不好的解决方案。也就是说,我已经尝试手动浏览您提供的示例输入(谢谢,Microsoft Paint),并且遵循该算法,从顶点0开始时结果应该确实为4。

所以这就是我认为您的代码可能出错的地方。在以下摘录中......

if(input[v][j] == 1)
{
    if(q[v] == j+1)
    match = true;
}

您似乎将当前顶点(无论如何只是i)的颜色与顶点索引进行比较,而不是将其他顶点的颜色进行比较。我认为你需要改变内部测试......

if(i == q[j])

或者,如果你愿意(不会有所作为)......

if(q[i] == q[j])

另外,你做的检查太多了。可以为顶点0指定颜色1.如果顶点0相邻,则需要对顶点0进行检查。如果它们相邻,则需要针对0和1检查顶点2,依此类推。您正在检查尚未分配颜色的顶点。因此,请不要将j限制为n,而是将其限制为当前的顶点v

最后,使用像if(match == false)这样的结构是相当混乱而不是必需的。只需使用if(!match)代替。

希望这会有所帮助。如果你仍然卡住了,我碰巧及时发现了评论,我可以提供更多指示。