我不确定这是否真的是一个“着色”问题,因为它是一个赋值/线性编程问题。我对其中任何一方都没有专业知识,所以请原谅任何可能跟随的任何新闻。但是我觉得这个问题几乎肯定已经解决/研究过了,在查看了http://en.wikipedia.org/wiki/Category:Graph_algorithms上的许多图算法之后我几乎找不到任何东西。我希望能在正确的方向上找到一些指示。
“问题陈述”有效归结为:
图中有两种类型的顶点:路由器和核心。
核心仅连接到路由器。每个核心仅连接到SINGLE路由器。每个都有一个用户输入/定义的“颜色”。 (在我的具体问题中,颜色仅限于4/5种颜色之一)。它们的颜色不能改变,它是一个输入参数。 (核心是下图中的方块)
路由器连接到核心以及其他路由器。他们没有分配“颜色”。分配颜色是程序/算法目标的一部分。 (路由器是下图中的圆形顶点。)
该计划的目标是为图表中的每个路由器指定颜色,以便最小化不同颜色的顶点之间的“交叉点”/边缘的数量。
(另一种观点:实质上,您会得到一个图形,其中某些顶点是彩色的,而其他顶点则不是。目标是将那些不是这样的颜色着色,使不同颜色的顶点之间的边缘数量最小化。)
我能够将这个(我很确定)作为整数线性程序来制定并使用LP-Solve设置解决方案/方法。我也有自己的启发式。我想知道解决这个问题的“正确”/已知/其他方法吗?!
非常感谢!
答案 0 :(得分:3)
让我们首先关注两种颜色的情况。我们可以将其转换为 s-t min cut的实例。我们的想法是我们在图中指定了一个 s 节点和一个 t 节点,并且我们想要将剩余的节点划分为 s group或 t 组,使得两组之间的边权重之和最小化。对于您的版本,我们有一个主黄色节点 s 和主红色节点 t ,我们放置一个高加权边缘超过原始图形中所有边缘的计数核心及其相应的主色彩节点,所有原始边缘完整,每个都具有权重1。高成本边缘确保我们永远不会非法重新着色任何核心,因为移动所有路由器会更便宜。可以使用standard max flow algorithms通过Max flow-Min cut theorem在多项式时间内解决此问题。最佳选择取决于您的边缘和顶点数。
在多种颜色的情况下,您正在尝试解决“多端切割”问题。这与minimum k-cut问题有关,但此问题的标准参考是论文The Complexity of Multiterminal Cuts( k -cut文章间接链接)。对于2种以上的颜色,显然如果图是平面的,那么问题仍然可以在多项式时间内解决;否则,它是NP-hard,所以你不妨使用整数编程求解器,因为这是另一个NP难问题。
答案 1 :(得分:0)
如果颜色数<= 5且路由器<= 10则可以使用暴力。
有少于5 ^ 10个选项,特别是如果默认情况下您为每个路由器着色最常见的颜色,然后只需更改其中一些颜色的颜色,在必要时进行回溯。
编辑:还有一个很好的哈密尔顿路径算法,如果少于15个路由器,你可以根据自己的需要进行调整。 What is the dynamic programming algorithm for finding a Hamiltonian cycle in a graph?