实验三 回溯法——地图填色问题

一.实验目的

  1. 掌握回溯法算法设计思想。
  2. 掌握地图填色问题的回溯法解法。

二.实验步骤与结果

背景知识:

每张地图包含四个相互连接的国家时,它们至少需要四种颜色。1852年,植物学专业的学生弗朗西斯·古思里(Francis Guthrie)于1852年首次提出“四色问题”。他观察到四种颜色似乎足以满足他尝试的任何地图填色问题,但他无法找到适用于所有地图的证明。这个问题被称为四色问题。长期以来,数学家无法证明四种颜色就够了,或者无法找到需要四种以上颜色的地图。直到1976年德国数学家沃尔夫冈·哈肯(Wolfgang Haken)(生于1928年)和肯尼斯·阿佩尔(Kenneth Appel,1932年-2013年)使用计算机证明了四色定理,他们将无数种可能的地图缩减为1936种特殊情况,每种情况都由一台计算机进行了总计超过1000个小时的检查。

四色定理是第一个使用计算机证明的著名数学定理,此后变得越来越普遍,争议也越来越小 更快的计算机和更高效的算法意味着今天您可以在几个小时内在笔记本电脑上证明四种颜色定理。

问题描述:

我们可以将地图转换为平面图,每个地区变成一个节点,相邻地区用边连接,我们要为这个图形的顶点着色,并且两个顶点通过边连接时必须具有不同的颜色。附件是给出的地图数据,请针对三个地图数据尝试分别使用5个(le450_5a),15个(le450_15b),25个(le450_25a)颜色为地图着色。

解决方法:

1. 问题与基础解法:回溯法 (DFS)

优化思路:

地图涂色问题本质是NP完全问题,最直观的解法是回溯法。该方法来源于系统性探索解空间的经典思想,通过试错-回溯机制寻找有效解。

算法细节:

  • 数据结构:

邻接表: 想象一下你有一张地图,每个国家都是一个“顶点”(节点),如果两个国家相邻,它们之间就有一条“边”。邻接表就是用来记录这些连接关系的,比如“国家A和国家B、国家C相邻”。这样,算法就能知道哪些国家是相邻的,必须使用不同的颜色。

colors[] 数组: 这是一个列表(或数组),用来记录每个国家(顶点)最终被涂上了什么颜色。比如 colors[0] = 红色 表示第一个国家是红色。

  • 实现步骤:
    • 从第一个国家(顶点)开始: 算法会从地图上的第一个国家开始尝试着色。
    • 尝试分配颜色: 它会从允许使用的颜色列表中选择一种颜色,比如先尝试红色。
    • 检查是否冲突: 在给当前国家涂色之前,它会检查所有已经涂过颜色的相邻国家。如果发现某个相邻国家已经使用了你现在想涂的颜色,那么这种颜色就不能用。
    • 无冲突则前进: 如果当前颜色没有冲突,算法就把这个颜色涂到当前国家上,然后转向下一个国家,重复步骤2。

无冲突则前进示意图

  • 有冲突或死胡同则回溯: 如果当前国家尝试了所有颜色都不能涂(因为都冲突了),或者涂上当前颜色后,后面的国家无论如何也涂不了(比如导致某个相邻国家没有可用颜色了),那么算法就会认为当前选择是错误的,它会“回溯”到上一个国家,让上一个国家重新选择颜色。

在这里插入图片描述

  • 所有选择都尝试完毕: 如果所有国家都成功涂色,就找到了一个解决方案。如果算法回溯到最初的国家,并且所有颜色都尝试过了,仍然没有找到解决方案,就说明没有符合条件的涂色方案。

    时间复杂度:

  • 最坏情况: O(m^V),其中V为顶点数,m为颜色数

  • 原因:每个顶点有m种可能的颜色选择,深度为V的搜索树

空间复杂度:O(V),递归栈的最大深度

效果分析

  • 问题:顶点处理顺序随机,搜索空间庞大
  • 性能瓶颈:在大规模图上效率极低,无法处理实际问题

2. 优化一:最大度优先 (Maximum Degree First)

优化思路:

源于贪心算法的启发,基于观察到:高度数顶点(邻居多的顶点)往往是冲突的主要来源。这类顶点的着色选择空间更受限,应优先处理。

算法细节:

  • 数据结构:

邻接表: 和基础回溯法一样,用于记录哪些国家是相邻的。

degree[] 数组: 这是一个新的列表(或数组),用来记录每个国家有多少个邻居(即它的“度数”)。比如,degree[0] = 5 表示第一个国家有5个邻居。

排序后的国家列表: 在开始着色之前,我们会把所有国家按照它们的邻居数量从多到少进行排序。这样,度数最大的国家会排在前面,最先被算法处理。

  • 实现步骤:
    • 计算所有国家的邻居数量: 首先,算法会遍历地图上的每一个国家,数出它有多少个邻居,并把这个数量记录下来。
    • 国家排序: 接着,算法会把这些国家按照邻居数量的多少进行排序,邻居最多的国家排在最前面。
    • 按序着色: 然后,算法就会按照这个新的顺序,一个接一个地为国家着色。着色的具体过程仍然沿用基础回溯法的逻辑(尝试颜色、检查冲突、递归、回溯),但现在,它会先处理那些“最复杂”的国家。

在这里插入图片描述
选择最大度的最小标号节点进行填色,之后按着之前的步骤进行

时间复杂度:

  • 预处理复杂度:O(V log V + E)
    • 排序顶点:O(V log V)
    • 重构邻接表:O(E)
  • 总体复杂度:预处理 + DFS = O(V log V + E + m^V)

空间复杂度:O(V + E),用于存储重构的图

效果分析

  • 优势:静态预处理,仅需执行一次,不增加实际搜索开销
  • 优化效果:降低了搜索早期的分支因子,实验中搜索速度提升约1.5-2倍
  • 局限性:仍然是按固定顺序处理顶点,没有动态调整搜索策略

3. 优化二:最少可用颜色优先 (Least Available Color First)

优化思路

源于最小剩余值 (MRV)启发式,这是AI搜索中的经典策略。该思路认为:应优先处理可选择最少的变量,以降低搜索复杂度。

算法细节:

  • 数据结构:

邻接表: 同样用于记录国家间的相邻关系。

available_colors[][] (可用颜色集合): 这是一个非常关键的数据结构。它不是预先设定好的,而是在着色过程中“动态”变化的。它会为每个国家维护一个列表,记录这个国家当前还可以选择哪些颜色。比如,当国家A涂了红色后,它的所有邻居就不能再选红色了,那么这些邻居的 available_colors 列表中就会把红色移除。

  • 实现步骤:
    • 动态选择下一个国家: 与之前固定顺序不同,在这个优化中,算法在每一步决定要为哪个国家着色时,都会“实时”地进行判断。

      在这里插入图片描述

    • 找出“瓶颈”国家: 它会查看所有还没有着色的国家,然后计算出每个国家目前还有多少种颜色可以涂(考虑到它所有已着色邻居的颜色)。

    • 优先处理瓶颈: 算法会优先选择那个可用颜色数量最少的国家。如果多个国家可用颜色数量相同,它可以随机选择一个,或者使用其他策略来打破平局。

    • 尝试着色并更新: 选定国家后,算法会尝试为它涂上一种颜色,并检查是否与邻居冲突。如果成功,它会立即更新所有未着色邻居的“可用颜色集合”(因为它们的可用颜色可能会因为当前国家的着色而减少)。

    • 递归与回溯: 然后,算法会递归地处理下一个国家。如果发现当前选择导致了问题(比如某个邻居没有颜色可选了),就会回溯,重新选择颜色,并恢复之前更新的可用颜色集合状态。

在这里插入图片描述

时间复杂度:

  • 每次选择顶点的复杂度:O(V·(V+E))
    • 遍历V个顶点:O(V)
    • 对每个顶点检查可用颜色:O(邻居数) = O(E/V)平均
    • 最坏情况下,每个顶点都检查所有邻居:O(E)
  • 搜索空间复杂度:O(m^V),但实际上由于启发式减少了分支因子
  • 有效分支因子:显著小于m,使得实际复杂度远低于指数级

空间复杂度:O(V + m·V)

效果分析

  • 核心优势:动态选择约束最强的顶点,更精确地捕捉”瓶颈顶点”
  • 策略本质:在搜索树的每一层,都选择分支可能性最少的变量,提高剪枝效率
  • 预期效果:在复杂图中,搜索速度提升约3-5倍

4. 优化三:最少可用颜色优先 + 最大度优先

优化思路:

结合静态结构分析与动态约束传播的优势。这种组合源于启发式算法研究中的”多启发式融合”理念,利用不同启发式的互补优势。

算法细节:

  • 数据结构:

邻接表、degree[] 数组: 和之前一样,用于存储图结构和每个国家的邻居数量。

available_colors[][] (可用颜色集合): 同最少可用颜色优先,动态记录每个国家当前可以用的颜色。

  • 实现步骤:
    • 预处理: 和最大度优先一样,在开始前计算并存储每个国家的邻居数量(度数)。
    • 动态选择国家: 在每一步选择下一个要着色的国家时,算法会综合考虑两个因素:
  • 主要依据: 优先选择当前“可用颜色数量最少”的国家(延续最少可用颜色优先的策略)。
  • 次要依据(打破平局): 如果有多个国家可用颜色数量相同,那么在这些国家中,算法会选择那个“邻居最多”(度数最大)的国家。这样做的目的是,如果多个国家同样“难搞”,就先处理那个“影响力更大”的。

在这里插入图片描述

  • 着色、递归、回溯: 选定国家后,着色、检查冲突、更新邻居可用颜色、递归以及回溯的逻辑与“最少可用颜色优先”类似。

时间复杂度:

  • 预处理复杂度:O(V log V + E),同最大度优先
  • 搜索过程:与LPC_DFS相同,但在更优化的图结构上
  • 总体期望复杂度:O(V log V + E + b^V),其中b是优化后的有效分支因子,显著小于m

空间复杂度: O(V + E)

效果分析

  • 复合优势:静态优化提供良好初始顺序,动态选择进一步缩减搜索空间
  • 协同效应:两种策略互相补充,适应不同类型的图结构
  • 实验结果:相比单独使用最少可用颜色优先,搜索速度进一步提升1.5-2倍

5. 优化四:最少可用颜色优先 + 最大度优先 + 向前探测

优化思路

基于约束满足问题(CSP)求解中的前向检测技术,这是一种主动约束传播机制。在传统回溯中增加提前检测”死路”的能力,避免无用搜索。

算法细节:

  • 数据结构:

邻接表、degree[] 数组、available_colors[][]: 这三者和之前的组合优化中使用的完全一样,是向前探测的基础。

  • 实现步骤:

    • 选择国家: 和“最少可用颜色优先 + 最大度优先”一样,算法会根据当前状态,选择下一个要着色的国家(优先选择可用颜色最少,其次是度数最大的)。
    • 尝试颜色: 为选定的国家尝试涂上一种颜色。
    • 核心步骤 - 向前探测: 这是最关键的一步。 一旦为当前国家涂上了一种颜色,算法不会立即去着色下一个国家。它会立即进行“预判”:
  • 它会检查当前国家所有未着色的邻居。

  • 对于每一个邻居,算法会模拟一下:如果这个邻居现在不能用刚刚涂给当前国家的颜色,那么它还有多少种颜色可以选?

  • 如果发现任何一个邻居在排除了当前颜色后,它的“可用颜色集合”变为空了(即它已经没有颜色可以选择了),那么算法就立刻知道,当前为这个国家选择的颜色是错误的,因为这种选择会立即导致其邻居无解。

  • 立即回溯: 发现这种情况后,算法会立即放弃当前颜色选择,进行回溯,尝试为当前国家选择下一个颜色,而不需要继续深入探索这条必然无解的路径。

    • 递归与状态恢复: 如果向前探测没有发现任何问题,算法才会继续递归地处理下一个国家。在回溯时,所有被向前探测临时修改的邻居的可用颜色集合都需要被准确地恢复到之前的状态。

      时间复杂度:

  • 每步向前探测的复杂度:O(d·d·m),其中d为平均度数

    • 遍历选中顶点的d个邻居
    • 对每个邻居检查其d个邻居的颜色
    • 对每个邻居需要检查m种颜色
  • 总体期望复杂度:O(V log V + E + bd^V),其中bd是经过三重优化后的有效分支因子

  • 剪枝效率:平均可减少50-80%的无效搜索路径

**空间复杂度:**O(V + E + m·V)

效果分析

  • 先知先觉:不仅检查当前约束,还预判未来可能发生的冲突
  • 优化精髓:发现一步着色会导致某邻居无可用颜色时,立即回溯,不浪费计算
  • 实验结果:在复杂图上,搜索速度相比基础回溯提升8-15倍
  • 实际应用:能够在合理时间内解决中等规模(数百顶点)的图着色问题

三.实验分析

复杂图分析:

各算法得到解的耗时(-1表示时间大于10min),以下单位皆为毫秒

例子:

450V5C/3840的含义是450节点5色解得3840个解

回溯法 (DFS)

9V4C/19V4C/480450V5C/1450V5C/3840450V15C/1450V25C/1
02-1-1-1-1

最大度优先

9V4C/19V4C/480450V5C/1450V5C/3840450V15C/1450V25C/1
00-1-1-1-1

最少可用颜色优先

9V4C/19V4C/480450V5C/1450V5C/3840450V15C/1450V25C/1
0022606-1-150

最大度+最少可用颜色优先

9V4C/19V4C/480450V5C/1450V5C/3840450V15C/1450V25C/1
00677382823-12

最大度+最少可用颜色优先+向前探测

9V4C/19V4C/480450V5C/1450V5C/3840450V15C/1450V25C/1
003387625515742

从数据可以看出,基础回溯法在处理规模稍大的图(如450V5C/1及以上)时,耗时迅速增加,甚至超过了10分钟(-1),这充分印证了其时间复杂度高和搜索效率低下的问题。其随机的着色顺序导致大量的无效尝试和回溯。

相比基础回溯法,最大度优先在处理9V4C/480这样的较小图时,耗时降到了0ms,说明其预处理策略有效降低了搜索树的广度。然而,对于450个顶点的大规模图,它仍然无法在10分钟内找到解,这说明静态的预处理在面对极其庞大的搜索空间时,其优化能力有限,不能动态地应对搜索过程中的复杂性。

最少可用颜色优先在处理450V5C/1时,成功找到了解(耗时22606ms),并且在450V25C/1这种更复杂的图(更多颜色选择,潜在更多分支)中也表现出了不错的性能(耗时50ms)。这体现了其动态选择策略的强大。通过优先处理约束最强的顶点,它能够更早地进行剪枝,显著缩小了实际的搜索空间。

最大度+最少可用颜色优先在处理450V5C/1时,耗时从22606ms大幅降低到6773ms,性能提升明显,且在450V25C/1上更是快至2ms。这表明最大度优先的静态预处理与最少可用颜色优先的动态选择形成了有效的互补。预处理提供了一个更好的初始排序,减少了早期搜索的分支,而动态选择则在搜索过程中持续引导算法走向更优的路径,避免了不必要的探索。

加入向前探测后,算法性能再次实现了质的飞跃。在450V5C/1中,耗时从6773ms骤降至338ms,并且成功在1574ms内解决了450V15C/1这种更为复杂的场景,而之前需要超过10分钟。这说明向前探测的“预判”能力极其强大,它能够在搜索路径的早期就发现不一致性,从而避免沿着死胡同继续搜索,极大地提高了剪枝的深度和效率。这种主动的约束传播机制是解决复杂图着色问题的关键。

随机图分析:

将点边的比例固定,不断地增大图的规模,可发现耗时越来越多

在这里插入图片描述

这反映了算法的固有复杂性。当顶点数 V 和边数 E 同比例增加时,图的整体规模和“稠密程度”(平均度数 E/V)保持相对稳定。然而,着色问题的搜索空间大小(最坏情况下是 m^V)仍然主要由顶点数决定。

趋势形成可能原因如下:

  1. 顶点更多,决策点更多:每个顶点都需要被着色,顶点越多,需要做的决策(选择哪个颜色)就越多。
  2. **搜索树更深/更宽:**回溯法本质上是在一个决策树上搜索。顶点越多,树的深度通常越大,需要探索的分支也越多
  3. **组合可能性爆炸式增长:**尽管有剪枝,但可能的颜色组合数量随顶点数 V 的增加而急剧增加(最坏情况下是 m ^ V,m 是颜色数),导致需要检查和回溯的情况大大增加。

将边的数量固定,不断增加点的数量,可发现耗时也越来越多

在这里插入图片描述

在边数 E 固定不变的情况下,增加顶点数 V 意味着图的平均度数 E/V 降低,图变得越来越“稀疏”。直观上可能认为稀疏图更容易着色,但实际情况并非如此。

趋势形成可能原因如下:

  1. 顶点更多,决策点更多:每个顶点都需要被着色,顶点越多,需要做的决策(选择哪个颜色)就越多。
  2. **搜索树更深/更宽:**回溯法本质上是在一个决策树上搜索。顶点越多,树的深度通常越大,需要探索的分支也越多
  3. **更多的约束检查:**虽然平均度数(E/V)降低了,但在搜索过程中,每次尝试给一个顶点着色时,仍需检查其所有邻居是否冲突。即使邻居少了,但需要进行这种检查的总次数会随着 V 的增加而累积。

将点的数量固定,不断增加边的数量,可发现耗时达到高点后下降

在这里插入图片描述

详细分析: 该图展示了图着色问题中经典的“相变”现象,这是约束满足问题 (CSP) 领域的一个重要发现。

  • 初期上升阶段(约束增加,问题变难): 当边数 E 增加时(点数 V 固定),图变得越来越稠密,这意味着每个顶点都有更多的邻居,相互间的约束(必须不同色)也随之增加。这使得找到有效解的难度加大,因为可用的合法颜色选择变少,回溯算法需要探索更多路径来寻找满足所有约束的解。此时,问题变得“更难解决”,耗时上升。
  • 最高点(临界点,最难解决区域): 在某个特定的图密度(即边数 E 达到一定比例)时,问题达到其“临界点”,此时的着色问题是最难解决的。在这个区域,问题既不像稀疏图那样约束松散而有大量的可行解(需要探索很多),也不像超稠密图那样约束紧密而几乎无解(容易快速剪枝)。它处于一种“刚好有解但又很难找”的状态,需要算法投入最大的努力。
  • 后期下降阶段(约束过强,容易剪枝): 当边数 E 持续增加,图变得极其稠密时,问题变得“过约束”。这意味着许多国家之间都有连接,导致很多颜色组合在一开始就变得不合法,甚至可能根本不存在合法解。在这种情况下,尽管理论上问题更复杂,但实际上,强大的启发式策略(如最少可用颜色优先和向前探测)会变得异常高效。它们能迅速发现大量的冲突和死胡同,从而进行深度剪枝,避免了进入无效的搜索分支。算法很快就能判断出当前路径无解并回溯,或者迅速找到唯一的(或少数的)解。因此,运行时间反而会下降并趋于稳定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值