使用模拟退火的图形着色

我正在尝试使用模拟退火来提出图形着色问题的算法。 在线有一般算法,但是当我看到它时,我无法理解如何将此算法应用于此问题。 图中的每个节点必须具有来自它的neibours的不同颜色。

我怎样才能使用模拟退火算法。
这个问题的“温度”,“时间表”是什么?

请帮我理解这个。 谢谢

正确设置起始温度和冷却计划参数是一件痛苦的事,因为在获得良好结果之前,您需要为两者提供良好的价值。 如果其中一个关闭,那么你可能不会注意到你正朝着正确的方向改变另一个。

这就是为什么我应用一个技巧来计算基于其他参数(起始温度)和时间梯度(在开始时为0.0且在达到时间限制后为1.0的数字)的冷却时间表。 将1个参数调整为好的值要容易得多。

一般来说,我建议从你所有动作(=邻里)的平均得分差异的起始温度开始。

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

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

最后写一个递归方法作为simulationAnnealing(graph,temp),它包含一个主循环来改变每个节点的颜色然后检查isColoringValid(),如果它可以计算loss function()和getProbability()。 因为在较高温度下你可以接受值得回答但是在较低温度下,只接受更好的答案,并且在方法结束时降低温度并调用模拟退火(图形,温度)。

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