我最初计划使用给定算法解决难题所需的时间来设置难度,但最终我选择实现暴力求解算法。其他算法对我来说太复杂了,因为我没有找到一些清晰的资源来解释如何实现最优3或4种颜色方案。
我的问题是有些棘手的难题可以制作出来,使得暴力求解需要很长时间,而采用另一种求解方法则可能很容易解决难题。
那么,您如何确定地图着色难题的相对难度?
你的地图是一个无向图。顶点是需要填充颜色的表面,而边缘则连接相邻表面。
当每个表面有很少的相邻表面时,难度较低。如果每个顶点都有许多边,则难度较高。
因此,排列难度的一种方法就是:
difficulty = total_number_edges - total_number_vertices
difficulty = (total_number_edges - total_number_vertices)
* (total_number_vertices / max_edges_in_vertex)
地图/图形着色问题是“NP完全问题”。这意味着科学界几乎可以确定,对于某些问题实例(即难题),任何给定的算法都将花费指数级(巨大)的时间。这就是为什么你实现的任何算法(包括你的“蛮力”机制)都会在某些难题实例上失败。
我建议你实现几种不同的算法来解决你的难题,例如:
算法1-逐个选择一个随机区域,并给它一个仍然“适合”的颜色,即不是任何有色邻居的颜色。如果遇到冲突(无法给所选区域着色),则停止算法。运行此循环,比如说,N次,并计算循环实际上着色整个地图的次数;让这个数字为K。这里你得到一个得分K/N(百分比),0%=困难问题(可能不可能),100%=非常容易的问题
算法2-向算法1添加一定量的回溯,例如允许最多1,000个回溯步骤。运行相同的“采样”循环。你会得到另一个0%-100%的得分。
然后使用得到的分数(从Alg. 2获得的分数比从Alg. 1获得的分数更高,因为它更强大)来获取难题的相对难度。
整个过程的关键是,如果您得到分数(0%,0%),即您不知道难题是否可解决,您应该将其丢弃,因为您不想向观众呈现可能无法解决的问题:)
最后,使用自己的判断力将分数“映射”到“人类可读”的难度描述——选择几个难题,手动解决它们,检查程序计算的分数,然后看看百分比分数如何映射到您对难度的感知。
我发现了一段话,这给了我一个想法,可以让你评估困难程度。
一类近似算法是基于“贪心”方法的 - 顶点按顺序处理,每个顶点分配到最低编号的颜色,不与其之前已着色邻居冲突。因为当前顶点相邻的顶点可能使用所有四种颜色,第五种甚至第六种、第七种等颜色可能是必要的。当贪心算法需要创建新的颜色类时,该顶点被称为在“僵局”中。
因此,必要颜色类的数量可能是您难题的难度。您可以按顶点度数从高到低处理顶点(排序模式为最大优先)。
我在Raymond A. Archuleta和Henry D. Shapiro的论文A Fast Probabilistic Algorithm For Four-Coloring Large Planar Graphs中找到了引用的段落。