使用模拟退火进行图形着色

时间:2018-08-01 14:18:15

标签: java np-complete simulated-annealing graph-coloring

我正在尝试提出使用模拟退火解决图形着色问题的算法。在线上有通用算法,但是当我看它时,我不明白如何将此算法应用于此问题。图中的每个节点必须与其临近点具有不同的颜色。

如何为此使用模拟退火算法。
 这个问题的“温度”,“时间表”是什么?

请帮助我理解这一点。谢谢

2 个答案:

答案 0 :(得分:1)

正确设置启动温度和冷却调度参数很麻烦,因为在获得良好结果之前,您必须同时具有良好的价值。如果其中一个处于关闭状态,则可能不会注意到您正在朝着正确的方向更改另一个。

这就是为什么我applied a trick根据另一个参数(起始温度)和时间梯度(在开始时为0.0,在达到时间限制后为1.0)计算冷却调度的原因。 将1个参数调整为合适的值要容易得多。

通常,我建议从所有动作的平均得分差异开始温度开始(=邻居)。

答案 1 :(得分:0)

图形的正确着色是将颜色分配给图形的顶点,以便没有两个相邻的顶点具有相同的颜色。
要解决此问题,假定您有一个具有N个节点的图G,那么您需要以下方法:

  • assignColor(graph):第一个结果
  • assignColor(图形,节点):为点头设置新颜色
  • isColoringValid(graph):检查当前着色是否有效
  • lossFunction(graph):计算使用的颜色数
  • getProbability(oldValue,newValue,温度):计算是否接受新状态

最后编写一个递归方法,如SimulationAnnealing(graph,temp),它包含一个主循环以更改每个节点的颜色,然后检查isColoringValid()是否可以计算出损失函数()和getProbability()。因为在较高的温度下您可以接受有价值的答案,但在较低的温度下,则只能接受更好的答案,并且在方法结束时降低温度并调用simulatedAnnealing(graph,temp)。

您可以在my github中找到完整的解决方案。