图着色
- 格式:doc
- 大小:220.00 KB
- 文档页数:12
第8节图论应用实例_图着色问题预备知识_回溯法回溯法:在实际生活中,有些问题是不能用数学公式去解决的,它需要通过一个过程,此过程要经过若干个步骤才能完成,每一个步骤又分为若干种可能;同时,为了完成任务,还必须遵守一些规则,但这些规则无法用数学公式表示,对于这样一类问题,一般采用搜索的方法来解决,回溯法就是搜索算法(广度优先、深度优先等)中的一种控制策略,它能够解决许多搜索中问题。
回溯法基本思想:试探法,撞了南墙就回头。
(一般采用深度优先搜索策略) 搜索策略:深度优先(不撞南墙不回头)。
在搜索过程中,如果求解失败,则返回搜索步骤中的上一点,去寻找新的路径,以求得答案。
要返回搜索,前进中的某些状态必须保存,才能使得退回到某种状态后能继续向前。
白话搜索:如果用数组存放搜索信息,i表示数组下标(当前状态), ++i表示往前走(下一个状态),--i表示回溯(往回退,返回上一次状态)。
第8节图论应用实例_图着色(graph coloring)问题数学定义:给定一个无向图G=(V, E),其中V为顶点集合,E为边集合,图着色问题即为将V分为k个颜色组(k为颜色数),每个组形成一个独立集,即其中没有相邻的顶点。
其优化版本是希望获得最小的k值。
典型应用:地图的着色、调度问题等。
k-着色判定问题:给定无向连通图G和k种不同的颜色。
用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色,例四色问题。
设有如图1的地图,每个区域代表一个省,区域中的数字表示省的编号,现在要求给每个省涂上红、蓝、黄、白四种颜色之一,同时使相邻的省份以不同的颜色区分。
课外拓展:搜索“四色问题”,了解四色问题相关知识。
5674231图1问题分析:(1)属于图的搜索问题。
将问题简化:将每个省抽象为一个点,省之间的联系看为一条边,可以得到图2。
16751432图2(2)用邻接矩阵表示各省之间的相邻关系,二维数组实现:1 表示省i与省j相邻, ,,ri,j,,0 表示省i与省j不相邻,由图2可以得到如下矩阵:(对称矩阵)1 2 3 4 5 6 71 0 1 0 0 0 0 12 1 0 1 1 1 1 13 0 1 0 1 0 0 04 0 1 1 0 1 0 05 0 1 0 1 0 1 06 0 1 0 0 1 0 17 1 1 0 0 0 1 0 为一对称矩阵。
离散数学中的图着色与图分割离散数学是数学的一个分支,它研究的是离散的结构和对象。
在离散数学中,图论是一个非常重要的领域。
而图着色与图分割是图论中的两个基本概念。
一、图着色图着色是指给定一个图的每个顶点分配一种颜色,并且要求相邻的顶点不能有相同的颜色。
这个问题可以看作是一种涂色问题,我们希望用最少的颜色来对图的顶点进行着色。
1.1 色数与染色多项式图的色数是指给定一个图所需的最少颜色数。
一个图的色数通常用符号χ(G)表示。
图的染色多项式是对于给定的图G,它与对应的染色问题有关。
1.2 四色问题四色问题是图论中一个经典的问题,它说的是任何平面地图都可以用四种颜色进行着色,使得相邻的地图区域颜色互不相同。
这个问题虽然在1976年得到了解决,但它的证明过程非常复杂,需要运用大量的数学定理和方法。
二、图分割图分割是指将一个图分割成多个不相交的子图。
图分割在图论和组合优化中具有广泛的应用。
2.1 最小割最小割是指可以将图分割成两个不相交的子图,并且两个子图之间的边的权重之和最小。
最小割问题可以通过最大流最小割定理来解决。
2.2 图分割算法图分割算法是指用于将图分割成多个子图的算法。
常用的图分割算法包括谱图分割算法、k-means算法等。
这些算法可以根据图的特点和需求来选择合适的方法。
三、图着色与图分割的应用3.1 地图着色图着色在地图着色中有着广泛的应用。
通过给地图的每个区域进行着色,可以实现不同区域之间的边界清晰,便于观察和分析。
3.2 电路布线在电路布线中,图着色可以用于解决信号线的冲突问题,保证信号线之间不会相互干扰。
3.3 图像分割图分割在图像处理中有着重要的应用。
通过将图像分割成多个子图,可以实现目标检测、边缘提取等算法的实现。
四、总结离散数学中的图着色与图分割是图论中的两个重要概念。
图着色是将图的顶点着色的过程,目标是用尽量少的颜色进行着色。
图分割是将图分割成多个子图的过程,通过选择合适的算法可以得到满足要求的子图。
数学中的图的着色问题与四色定理数学中的图论是一门研究图及其性质的学科,其中一个重要的问题就是图的着色问题。
图的着色问题是指如何用有限种颜色给图的顶点或边进行染色,使得相邻的顶点或边不具有相同的颜色。
这个问题在实际应用中有着广泛的应用,比如地图着色、时间表的安排等。
在图的着色问题中,最著名的就是四色定理。
四色定理是指任何平面图都可以用四种颜色进行着色,使得相邻的区域不具有相同的颜色。
这个定理在1852年被英国数学家弗朗西斯·格思·韦尔斯顿和威廉·哈姆顿·伯奇证明,被认为是图论中的一个里程碑。
证明四色定理的过程非常复杂,需要运用大量的数学知识和技巧。
其中一个重要的思想就是通过对图进行适当的分割,将大问题转化为小问题,然后逐步解决。
这种分割的方法被称为“规约法”,即将一个复杂的问题规约为一系列简单的子问题。
通过这种方法,韦尔斯顿和伯奇最终证明了四色定理的正确性。
四色定理的证明引起了广泛的关注和讨论。
人们对于这个问题的兴趣不仅在于它的应用价值,更在于它背后的数学原理和思维方式。
四色定理的证明过程中,涉及到了众多的数学概念和定理,如图的平面性、图的连通性、图的染色等。
这些概念和定理的研究不仅推动了图论的发展,也对其他领域的数学研究产生了重要影响。
除了四色定理,图的着色问题还有其他一些重要的结果。
比如,五色定理指出任何平面图都可以用五种颜色进行着色,六色定理指出任何平面图都可以用六种颜色进行着色。
这些定理的证明过程和四色定理类似,都需要运用复杂的数学技巧和方法。
图的着色问题不仅在理论上有着重要的意义,也在实际应用中发挥着重要的作用。
比如,在地图着色中,我们可以用不同的颜色表示不同的国家或地区,以便更好地区分它们。
在时间表的安排中,我们可以用不同的颜色表示不同的活动或任务,以便更好地组织和管理。
这些应用都离不开图的着色问题的研究和应用。
总之,图的着色问题是数学中一个重要且有趣的问题。
图论中的图的着色与染色问题图论是数学的一个分支,研究的是图的性质和图的应用。
在图论中,图的着色与染色问题是一个经典且重要的研究课题。
图的着色问题是指如何用有限的颜色对图的顶点或边进行染色,使得相邻的顶点或边具有不同的颜色。
本文将介绍图的着色与染色问题的基本概念和应用。
一、图的基本概念1. 无向图和有向图无向图由一些顶点和连接这些顶点的边组成,边没有方向性。
而有向图中,边是有方向性的,连接两个顶点的边有始点和终点之分。
2. 邻接矩阵和邻接表邻接矩阵是一种表示图的方法,用一个矩阵表示图中各个顶点之间的连接关系。
邻接表是另一种表示图的方法,用链表的形式表示图中各个顶点之间的连接关系。
二、图的着色问题图的着色问题是指如何用有限的颜色对图的顶点或边进行染色,使得相邻的顶点或边具有不同的颜色。
图的着色问题有以下两种情况:1. 顶点着色对于无向图或有向图的顶点,通过对每个顶点进行染色,使得图中任何相邻的顶点具有不同的颜色。
这里的相邻顶点指的是通过一条边相连的顶点。
2. 边着色对于无向图或有向图的边,通过对每条边进行染色,使得图中任何相邻的边具有不同的颜色。
这里的相邻边指的是有共同始点或终点的边。
三、图的染色算法对于图的着色问题,有不同的染色算法可以解决。
在这里我们介绍两种常用的染色算法:贪心算法和回溯算法。
1. 贪心算法贪心算法是一种基于局部最优策略的算法。
对于图的顶点着色问题,贪心算法的策略是从一个未染色的顶点开始,将其染上一个可用的颜色,并将该颜色标记为已占用,然后继续处理下一个未染色的顶点。
如果当前顶点没有可用的颜色可染,则需要增加一个新的颜色。
2. 回溯算法回溯算法是一种穷举所有可能性的算法。
对于图的着色问题,回溯算法的策略是从一个未染色的顶点开始,尝试不同的颜色进行染色,如果发现染色后与相邻顶点冲突,就回溯到上一个顶点重新尝试其他颜色,直到所有顶点都被染色。
四、图的着色问题的应用图的着色问题在实际中有广泛的应用。
图着⾊算法详解(GraphColoring)图着⾊算法描述:给定⽆向连通图和m种不同的颜⾊。
⽤这些颜⾊为图G的各顶点着⾊,每个顶点着⼀种颜⾊。
是否有⼀种着⾊法使G中每条边的两个顶点有不同的颜⾊。
这个问题是图的m可着⾊判定问题。
若⼀个图最少需要m种颜⾊才能使图中每条边相连接的两个顶点着不同颜⾊,称这个数m为这个图的⾊数。
求⼀个图的⾊数m称为图的m可着⾊优化问题。
给定⼀个图以及m种颜⾊,请计算出涂⾊⽅案数。
分析:细致分析后,t代表顶点还是能分析出来的。
使⽤到了邻接矩阵 还有就是color数组,也是解题的关键,要明确color数组代表的含义:color[n],⼤⼩为n,下标肯定代表顶点,⾥⾯的值代表这个顶点放的是哪种颜⾊。
Traceback(t)的t代表某⼀个顶点,这个顶点具体放哪种颜⾊不知道,肯定有个for循环从第⼀种颜⾊到最后⼀种颜⾊都要试⼀下,那么color[t]⾥就放当前这种颜⾊。
OK(t)判断⼀下,如果可以,traceback(t+1)。
OK(t)中,t顶点和哪些顶点有联系,我就去判断这些点放置的颜⾊有没有和我相同,若有相同的,return false;否则,return true。
#include<stdio.h>#include<iostream>#define V 4//图中的顶点数/* 打印解决⽅案的实⽤函数 */void printSolution(int color[]){printf(" Following are the assigned colors \n");for (int i = 0; i < V; i++)printf(" %d ", color[i]);printf("\n");}bool isSafe(int v, bool graph[V][V], int color[], int c)////⽤于检查当前颜⾊分配的实⽤程序函数{for (int i = 0; i < V; i++)if (graph[v][i] && c == color[i])return false;return true;}void graphColoring(bool graph[V][V], int m, int color[], int v)//求解m着⾊问题的递推效⽤函数{if (v == V)//基本情况:如果所有顶点都指定了颜⾊,则返回真{printSolution(color);return;}/* 考虑这个顶点v并尝试不同的颜⾊*/for (int c = 1; c <= m; c++){/* 检查颜⾊C到V的分配是否正确*/if (isSafe(v, graph, color, c)){color[v] = c;/* 递归为其余顶点指定颜⾊ */graphColoring(graph, m, color, v + 1);/* 如果指定颜⾊C不会导致解决⽅案然后删除它 */color[v] = 0;}}}// driver program to test above functionint main(){/* Create following graph and test whether it is 3 colorable(3)---(2)| / || / || / |(0)---(1)*/bool graph[V][V] = { { 0, 1, 1, 1 }, { 1, 0, 1, 0 },{ 1, 1, 0, 1 },{ 1, 0, 1, 0 },};int m = 3; // Number of colorsint color[V];for (int i = 0; i < V; i++)color[i] = 0;graphColoring(graph, m, color, 0); system("pause");return 0;} 运⾏结果:。
图论中的图的着色与染色问题在图论中,图的着色与染色问题是一类经典的问题。
图的着色是指给图的每个顶点赋予一个颜色,要求相邻的顶点不能有相同的颜色;而图的染色是指给图的边赋予一个颜色,要求相邻的边不能有相同的颜色。
一、图的顶点着色图的顶点着色问题是图论中的经典问题之一。
给定一个无向图,要求为每个顶点分配一个颜色,使得任意两个相邻的顶点颜色不同。
这个问题的本质是将相邻的顶点划分到不同的颜色集合中。
解决图的顶点着色问题有多种算法,其中较为简单和常用的是贪心算法。
贪心算法按照某种规则为图的顶点逐个着色,每次着色时选择当前可用颜色的最小编号。
贪心算法的时间复杂度为O(n^2),其中n 为图的顶点数。
二、图的边染色图的边染色问题是另一个经典的图论问题。
给定一个无向图,要求给每条边分配一个颜色,使得任意两条相邻的边颜色不同。
这个问题的目标是将相邻的边划分到不同的颜色集合中。
解决图的边染色问题的算法有多种,其中常用的是基于回溯法和深度优先搜索的算法。
回溯法通过递归地尝试为每条边分配颜色,并根据约束条件进行回溯,直到找到可行的解或者穷尽所有可能。
深度优先搜索则通过遍历图的边,逐个给边染色,当发现某条边与相邻边颜色相同时,回溯到前一条边重新选择颜色。
三、特殊图的着色与染色问题除了一般的图的着色与染色问题,还存在一些特殊类型的图,对应着特殊的着色与染色问题。
1. 树的着色与染色:在树中,任意两个顶点之间都只有一条路径,因此树的着色与染色问题可以简化为树的边染色问题。
树的边染色问题可以使用贪心算法解决,每次为某条边选择一个未使用的颜色,直到所有边都被染色。
2. 平面图的着色与染色:平面图是指可以画在平面上,且任意两条边最多只有一个公共顶点的图。
平面图的着色与染色问题是在满足平面图约束条件下对图进行着色或染色。
对于平面图的着色与染色问题,使用四色定理可以得到解,即任何平面图最多只需要四种颜色来着色或染色。
四、应用领域图的着色与染色问题在实际应用中具有广泛的应用。
组合数学中的的着色问题研究组合数学中的着色问题研究组合数学是数学中的一个重要分支,主要研究离散结构和计数问题。
而着色问题则是组合数学中的一个经典研究方向,涉及到对图、平面、多面体等结构进行着色的问题。
本文将探讨组合数学中的着色问题及其相关研究。
一、基本概念1. 图的着色问题图着色问题指将图的顶点或边进行染色,并且要求相邻的顶点或边不能使用相同的颜色。
常见的图着色问题有顶点着色问题和边着色问题。
2. 平面着色问题平面着色问题是指在平面上对区域进行染色,要求相邻的区域不能使用相同颜色。
该问题常被用于地图着色、地区划分等实际问题中。
3. 多面体着色问题多面体着色问题是指对多面体的面进行染色,要求相邻的面不能使用相同颜色。
例如,著名的四色定理即是多面体着色问题的一个重要结果。
二、研究方法与技巧回溯法是求解组合数学中着色问题的一种常用方法。
其基本思想是通过逐步试探的方式,对每一个顶点或区域进行染色,直到得到满足约束条件的染色方案。
2. 图着色算法图着色算法是求解图着色问题的一种有效方法。
常见的图着色算法包括贪心算法、基于约束满足问题的算法等。
3. 数学模型数学模型在组合数学中的着色问题研究中起到了重要作用。
通过构建合适的数学模型,可以将实际问题转化为数学问题,并进而应用数学工具进行求解。
三、应用领域及案例分析1. 地图着色地图着色问题是平面着色问题的一个典型应用。
通过对地图中的区域进行染色,可以实现地区划分、行政管理等目的。
例如,美国的选举地图就是通过对各个州进行着色来表示选举结果。
2. 时间表着色在课程表、会议安排等场景中,经常需要对时间进行调度和安排。
时间表着色问题可以将时间段表示为不同的颜色,来实现有效的时间管理。
在电路布线的过程中,往往需要对电路中的不同节点进行染色,以实现电路的连接和调度。
着色问题在电路设计中有着广泛的应用。
四、发展趋势与挑战1. 着色问题的复杂性组合数学中的着色问题在实际应用中往往具有复杂性。
图的着色与染色问题图的着色与染色问题是离散数学中的一个经典问题,涉及到对图的顶点进行染色使相邻顶点具有不同颜色的约束条件。
本文将介绍图的着色与染色问题的定义、应用以及解决方法。
一、图的着色与染色问题的定义图的着色与染色问题是指给定一个无向图,用有限种颜色对图的顶点进行染色,使得相邻顶点之间不具有相同的颜色。
其中,相邻顶点是指通过边相连的顶点。
二、图的着色与染色问题的应用图的着色与染色问题在现实生活中有着广泛的应用,例如地图着色、时间表的调度、寻找相互独立的任务等。
这些问题都可以转化为图的着色与染色问题进行求解。
三、图的着色与染色问题的解决方法1. 贪心算法贪心算法是解决图的着色与染色问题的常用方法。
该算法按照某种规则依次给顶点进行染色,直到所有顶点都被染色为止。
常用的贪心策略有最小度优先、最大度优先以及最小饱和度优先等。
2. 回溯算法回溯算法是一种递归的搜索算法,它通过不断地尝试不同的颜色对顶点进行染色,并检查染色结果是否满足约束条件。
如果染色结果不满足约束条件,则回溯到上一次的选择,继续尝试其他颜色。
直到找到满足约束条件的染色方案或者遍历完所有可能性为止。
3. 基于图的染色算法基于图的染色算法是一种使用图的结构特性进行求解的方法。
这类算法通过分析图的特征,如度数、连通性等,来设计有效的染色策略。
四、图的着色与染色问题的扩展除了对顶点进行染色外,图的着色与染色问题还可以扩展到对边进行染色。
对边进行染色的约束条件是相邻边不得具有相同的颜色。
这种问题可以转化为顶点染色问题进行求解。
五、结论图的着色与染色问题作为离散数学中的一个经典问题,具有重要的理论意义和实际应用价值。
本文介绍了该问题的定义、应用、解决方法以及扩展内容,希望读者能够对图的着色与染色问题有更深入的了解。
以上就是图的着色与染色问题的相关介绍,希望对您有所帮助。
如有任何问题,请随时与我联系。
谢谢!。
图论中的图着色问题算法图着色问题是图论中的一个重要研究课题,它的目标是给定一个无向图,为每个顶点分配一个颜色,使得相邻的顶点拥有不同的颜色。
这个问题有着广泛的应用,例如地图着色、课程时间表安排以及调度等领域。
本文将介绍几种常见的图着色算法。
一、贪心算法贪心算法是解决图着色问题最直接且简便的方法之一。
其基本思想是从图的某个顶点开始,依次为每个顶点选择一个未被使用的最小颜色号。
该算法的具体步骤如下:1. 选择一个起始顶点v,并为其分配一个颜色c。
2. 对于v的所有相邻顶点u,如果u未着色,则为u选择一个未被使用的最小颜色号,并标记u为已着色。
3. 重复步骤2,直到所有顶点都被着色。
贪心算法的时间复杂度为O(n^2),其中n为顶点数。
该算法的缺点是可能得到的着色方案不是最优解。
二、回溯算法回溯算法是另一种常见的用于解决图着色问题的算法。
其基本思想是通过不断尝试不同的着色方案,直到找到一个满足条件的解。
该算法的具体步骤如下:1. 选择一个起始顶点v,并为其分配一个颜色c。
2. 对于v的所有相邻顶点u,如果u未着色,则为u选择一个未被使用的颜色号,并标记u为已着色。
3. 选择下一个未着色的顶点作为新的起始顶点,重复步骤2。
4. 如果无法为任何顶点着色,则回溯到上一步,修改之前的着色方案,为当前顶点选择一个新的颜色。
5. 重复步骤3和步骤4,直到所有顶点都被着色。
回溯算法的时间复杂度取决于图的结构和颜色数目,一般情况下是指数级的。
该算法可以得到最优解,但在处理大规模问题时效率较低。
三、基于现有算法的改进除了贪心算法和回溯算法外,还存在一些基于这两种算法的改进方法,以提高图着色问题的求解效率。
例如,使用启发式算法、剪枝技术以及约束求解等方法。
启发式算法是一种非确定性的搜索算法,通过引入启发函数来指导搜索过程,以期望更快地找到一个不错的解。
典型的启发式算法包括Tabu搜索、模拟退火算法等。
剪枝技术是在搜索过程中通过判断某些分支的无效性,从而减少搜索空间,提高算法效率。
图论中的图的着色与染色问题图是图论中的基本概念之一,是由顶点和边构成的数学结构。
在图的理论中,图的着色与染色问题是一个非常重要且有趣的研究领域。
本文将介绍图的着色与染色问题的基本概念、定理和算法,希望能够为读者深入了解图论领域提供一些帮助。
一、基本概念在图的理论中,图的着色与染色问题是指将图的顶点或边用不同颜色标记的过程。
着色是指给图的顶点或边分配颜色,使得相邻的顶点或边颜色不相同;而染色是指给图的顶点或边分配颜色,使得相邻的顶点或边颜色可以相同。
定理1:图的顶点着色问题对于一个简单图,顶点着色问题是指如何用最少的颜色将图的所有顶点着色,使得相邻的顶点颜色不同。
根据四色定理,任何一个平面图都可以只用四种颜色进行顶点着色。
定理2:图的边着色问题对于一个简单图,边着色问题是指如何用最少的颜色将图的所有边着色,使得任意两条依附于同一顶点的边颜色不同。
根据维茨定理,任何简单无向图都可以用最大度数加一种颜色进行边着色。
二、算法与实践在解决图的着色与染色问题时,常用的算法包括贪心算法、回溯算法、图染色算法等。
其中,Welsh-Powell算法是用来解决无向图的顶点着色问题的一种有效算法,其基本思想是优先考虑度数最大的顶点进行着色。
而在解决边着色问题时,常用的算法包括Vizing定理、边染色算法等。
三、应用与拓展图的着色与染色问题在实际生活中有着广泛的应用,如地图着色、时间表着色、调度问题等。
同时,在拓展领域中,图的着色与染色问题也与其他数学领域有着密切的联系,如组合数学、离散数学等,在各个领域都有着深入的研究与应用。
总结:图的着色与染色问题是图论领域中的一个重要研究方向,具有丰富的理论内涵和实际应用。
通过本文对图的着色与染色问题的介绍,希望读者能够对该领域有一个初步的了解,进一步深入研究与探讨。
愿本文能够为读者在图论领域的学习与研究提供一些帮助与启发。
算法设计课程设计题目图着色问题姓名学号专业年级指导教师职称2014年 12月 4日图的m着色问题1 摘要 (3)2 图的着色问题 (4)2.1 图的着色问题的来源 (4)2.2 图的着色问题的描述 (4)3算法的基本思想 (4)3.1 求极小覆盖法----布尔代数法 (4)3.2 穷举法-Welch Powell着色法 (4)3.3 回溯法 (4)3.4 贪心法 (4)3.5 蚁群算法 (5)4算法步骤 (5)4.1 求极小覆盖法----布尔代数法 (4)4.2 穷举法-Welch Powell着色法 (4)4.3 回溯法 (4)4.4 贪心法 (4)4.5 蚁群法 (4)5 理论分析(复杂度比较)、实验性能比较 (7)5.1 复杂度分析 (4)5.2 实验性能比较 (4)6 心得体会 (8)7参考文献 (8)8 附录 (8)摘要图论是近年来发展迅速而又应用广泛的一门新兴学科,已广泛应用于运筹学、网络理论、信息论、控制论、博奕论以及计算机科学等各个领域。
一般说来,图的着色问题最早起源于著名的“四色问题”,染色问题不但有着重要的理论价值,而且,它和很多实际问题有着密切联系,例如通讯系统的频道分配问题,更有着广泛的应用背景. 本文首先讨论了人工智能的状态搜索方法在图着色中的具体应用,并用可视化方法展示了低维的着色空间和约束的具体意义。
关键词:图着色 c++代码2、图的着色问题2.1图的着色问题的来源1852年,毕业于伦敦大学的弗南西斯·格思里(Francis Guthrie)在一家科研单位从事地图着色工作时,发现“任何一张地图似乎只用四种颜色就能使具有共同边界的国家着上不同的颜色。
”用数学语言来表示,即“将平面任意地细分为不相重迭的区域,每一个区域总可以用1,2,3,4这四个数字之一来标记,而不会使相邻的两个区域得到相同的数字。
”这就是源于地图着色的四色猜想问题。
这里所指的相邻区域,是指有一整段边界是公共边界。
如果两个区域只相遇于一点或有限多点,就不叫相邻。
因为用相同的颜色给它们着色不会引起混淆。
用四种颜色着色的世界地图:采用四种颜色着色的美国地图:2.2图的着色问题的描述(一)图的着色问题是由地图的着色问题引申而来的:用m种颜色为地图着色,使得地图上的每一个区域着一种颜色,且相邻区域颜色不同。
(二)通常所说的着色问题是指下述两类问题:1.给定无环图G=(V,E),用m种颜色为图中的每条边着色,要求每条边着一种颜色,并使相邻两条边有着不同的颜色,这个问题称为图的边着色问题。
2.给定无向图G=(V,E),用m种颜色为图中的每个顶点着色,要求每个顶点着一种颜色,并使相邻两顶点之间有着不同的颜色,这个问题称为图的顶着色问题。
(三)问题处理:如果把每一个区域收缩为一个顶点,把相邻两个区域用一条边相连接,就可以把一个区域图抽象为一个平面图。
例如,图12-1(a)所示的区域图可抽象为12-1(b)所表示的平面图。
19世纪50年代,英国学者提出了任何地图都可以4中颜色来着色的4色猜想问题。
过了100多年,这个问题才由美国学者在计算机上予以证明,这就是著名的四色定理。
例如,在图12-1中,区域用城市名表示,颜色用数字表示,则图中表示了不同区域的不同着色问题。
(在本文中主要讨论顶点着色)3、算法的基本思想目前求图着色问题主要有以下几种方法3.1求极小覆盖法----布尔代数法采用代数的方法来解决顶点着色问题3.2穷举法-Welch Powell着色法采用穷举一切的方法来找出所有的解3.3回溯法回溯法的基本思想是,在确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。
这个开始结点就成为一个活结点,同时也成为当前的扩展结点。
在当前的扩展结点处,搜索向纵深方向移至一个新结点。
这个新结点就成为一个新的活结点,并成为当前扩展结点。
如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。
换句话说,这个结点不再是一个活结点。
此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。
回溯法即以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已没有活结点时为止。
3.4贪心法贪心算法:贪心策略:选择一种颜色,以任意顶点作为开始顶点,依次考察图中的未被着色的每个顶点,如果一个顶点可以用颜色1着色,换言之,该顶点的邻接点都还未被着色,则用颜色1为该顶点着色,当没有顶点能以这种颜色着色时,选择颜色2和一个未被着色的顶点作为开始顶点,用第二种颜色为尽可能多的顶点着色,如果还有未着色的顶点,则选取颜色3并为尽可能多的顶点着色,依此类推。
3.5蚁群算法4、算法步骤4.1 求极小覆盖法----布尔代数法例1:求图12-2G的顶色数解:Step1:求极大独立集先求图G的极小覆盖,(a+bd)(b+aceg)(c+bdef)(d+aceg)(e+bcdf)(f+ceg)(g+bdf)化简得aceg+bcdeg+bdef+bcdf故G的极小覆盖为{a,c,e,g},{b,c,d,e,g},{b,d,e,f},{b,c,d,f},{b,d,f},{a,f},{a,c,g},{a,e,g}取其补集,得到G的所有极大独立集:Step2:求出一切若干极大独立集和所有顶点的子集显然我们可以选用4种颜色给每个顶点涂色,或者选用3种颜色分别给3个极大独立集涂色,例如为{b,d,f}中的b、d、f涂颜色1,为{a,f}中的a涂颜色2,为{a,c,g} 中的c和g涂颜色3,为{a,e,g}中的e涂颜色4。
Step3:从中挑选所用极大独立集个数最小者,即为X(G)但上述子集的颜色数都不是X(G),正确的应该是X(G)=3,该子集为:给{b,d,f}中的b,d,f涂颜色1,为{a,e,g}中a,e,g涂颜色2为{a,c,g}中的c涂颜色3。
由此可见,求色数其需要求极大独立集以及一切若干极大独立集的和含所有顶点的子集,对于大图,因为图计算量过大而成为实际上难以凑效的算法,所以不是一个好算法,一般我们采用贪心法等近似算法来求解。
4.2 穷举法-Welch Powell着色法穷举法:I.将图G中的结点按度数的递减顺序进行排列(这种排列可能不是唯一的,因为有些结点的度数相同)。
II.用第一种颜色对第一结点着色,并按排列顺序对与前面着色结点不邻接的每一结点着上同样的颜色。
III.用第二种颜色对尚未着色的结点重复II,用第三种颜色继续这种做法,直到所有的结点全部着上色为止。
4.3 回溯法回溯法:设数组color[n]表示顶点的着色情况,回溯法求解m着色问题的算法如下:图着色回溯法:1.将数组color[n]初始化为0;2.k=1;3.while (k>=1)3.1 依次考察每一种颜色,若顶点k的着色与其他顶点的着色不发生冲突,则转步骤 3.2;否则,搜索下一个颜色;3.2 若顶点已全部着色,则输出数组color[n],返回;3.3 否则,3.3.1 若顶点k是一个合法着色,则k=k+1,转步骤3处理下一个顶点;3.3.2 否则,重置顶点k的着色情况,k=k-1,转步骤34.4 贪心法算法步骤:设数组color[n]表示顶点的着色情况,贪心法求解图着色问题的算法如下:图着色贪心法:1.color[1]=1; //顶点1着颜色12.for (i=2; i<=n; i++) //其他所有顶点置未着色状态color[i]=0;3.k=0;4.循环直到所有顶点均着色4.1 k++; //取下一个颜色4.2 for (i=2; i<=n; i++) //用颜色k为尽量多的顶点着色4.2.1 若顶点i已着色,则转步骤4.2,考虑下一个顶点;4.2.2 若图中与顶点i邻接的顶点着色与顶点i着颜色k不冲突,则color[i]=k;5.输出k;4.5 蚁群法蚁群算法:ai:表示第i只蚂蚁的起始城市;pmax:蚂蚁i下一步所选城市中最大的概率。
建立邻接矩阵Y为n×n的矩阵,表示地区与地区之间的邻接关系,Yic表示城市i与城市c的邻接关系,当城市i与城市c是同一个城市用Yic=0表示,当城市i与城市c不相邻,Yic取一较小值(如Yic=-1);当城市i与城市c相邻Yic取一较大值(如Yic=1)。
ai与c城市的表更新方程:ai到c城市的概率计算公式:算法:For t←1将k只蚂蚁随机置于k个顶点上将k只蚂蚁出发点置于当前解集中For m←1 to n/kFor i←1 to kFor c←1 to n按概率pkic选择顶点c移动蚂蚁i到顶点c将顶点c置于蚂蚁i的当前解集检查着色条件End forEnd for检查若未完成的任务End fort←t+1Δτic←0End for 输出满意h5、理论分析(复杂度比较)、实验性能比较5.1复杂度分析当图的顶点数为20时计算时间与最小色数:算法 | 复杂度 | 色数 |极小覆盖 | O(n^2) | 4 |穷举法 | O(n^2) | 4 |回溯法 | O(n^2) | 4 |贪心算法 | O(n^2) | 4 |蚁群法 | O(n^2) | 4 |5.2性能比较布尔代数的性能是最高的但是用算法实现起来较为困难,而且不能得到最优解,得不到全部的解。
穷举法的性能是最低的,它穷举了所有的方法,可以找出所有的方法。
回溯法和贪心算法的性能相似。
蚁群算法的实现较为困难,有随机性。
布尔代数 >贪心算法 >回溯法 >蚁群法 >穷举法6、心得体会这次我们小组选了地图着色这个题目,最开始我们都不了解什么是地图着色,后来通过在网上查找了大量资料才明白地图着色是基于历史上著名的四色问题。
图着色问题对于现实生活中也有许多的应用,比如交通管理系统、安排考试、贮藏问题等,以前觉得算法与现实生活离得比较远,有时候也会产生对算法的厌恶情绪,但是通过对它的学习才知道现实生活中很多地方都用到了算法。
以前读浪潮之巅时有一章就是讲网络搜索的,那个就采用了布尔代数,好的算法算法很大程度上可以提高效率,节约时间,这在计算机网络方面很明显。
此外通过小组一起的学习,我们学会了小组合作的重要性,大家一起分工合作,每个人研究一个算法,然后大家一起讨论,这样问题就很快得到了解决。
7、附录算法采用c++来实现,而且图采用了矩阵来存储,图的存储可以采用矩阵和链表两种方式,链表方式存储起来比较节约空间。
链表存储有顺序存储与链式存储两种方式,在查找时不易,故此文中的代码都采用了矩阵来存储。
由于布尔代数与蚂蚁算法用算法不易实现,故附录中只附上了其他的两种算法。
8、参考文献[1] Kyle Loudon.算法精解.机械工业出版社.2012.9.1[2]谭浩强.C++面向对象程序设计[M].北京.清华大学出版社,2006.[3]王晓东.计算机算法设计与分析(第3版)[M].北京.电子工业出版社.2007.[4]Cliff A.Shaffer.数据结构与算法分析(C++版).2013年第三版[5]朱洪.算法设计和分析[M].上海科学技术文献出版社,1989,162-163.附录1贪心算法代码#include <stdio.h>#define N 21int ok(int metro[N][N],int r_color[N],int current){/*测试当前着色方案是否可行*/int j;for(j=1;j<current;j++)if(metro[current][j]==1&&r_color[j]==r_color[current])return 0;/*城市相邻且颜色相同*/return 1;}void go(int metro[N][N],int r_color[N],int sum,int current){int i;if(current<=sum)/*检查所有城市*/for(i=1;i<=4;i++)/*测试每种颜色*/{r_color[current]=i;/*尝试着色*/if(ok(metro,r_color,current))/*若尝试成功*/{go(metro,r_color,sum,current+1);/*检查下一个城市*/return;}}}void main(){int r_color[N]={0};int i;int metro[N][N]={{0},/*邻接矩阵*/{0,1,1,1,1,1,1},{0,1,1,1,1},{0,1,1,1,0,0,1},{0,1,1,0,1,1},{0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,1},{0,1,0,1,0,1,1,1,1,1},{0,0,0,0,0,0,1,1,1},{0,0,0,0,0,0,1,1,1,1,0,0,1},{0,0,0,0,0,1,1,0,1,1,0,0,1,1,1,0,1},{0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,1},{0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1},{0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,1,1},{0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1},{0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1},{0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,0,1},{0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,1,1},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1},{0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,1,1,1},{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1}};go(metro,r_color,20,1);printf("\n");for(i=1;i<=20;i++)/*输出着色方案*/printf("%3d",r_color[i]);printf("\n");}1.1结果截图2回溯法代码#include<stdio.h>int color[100];bool ok(int k,int c[][100]) //判断顶点k的着色是否发生冲突{int i,j;for(i=1;i<k;i++){if(c[k][i]==1&&color[i]==color[k])return false;}return true;}void graphcolor(int n,int m,int c[][100]){int i,k;for(i=1;i<=n;i++)color[i]=0;k=1;while(k>=1){color[k]=color[k]+1;while(color[k]<=m)if(ok(k,c)) break;else color[k]=color[k]+1; //搜索下一个颜色if(color[k]<=m&&k==n){for(i=1;i<=n;i++)printf("%d ",color[i]);printf("\n");}else if(color[k]<=m&&k<n)k=k+1; //处理下一个顶点else{color[k]=0;k=k-1;//回溯}}}void main(){int i,j,n,m;int c[100][100];//存储n个顶点的无向图的数组printf("输入顶点数n和着色数m:\n");scanf("%d %d",&n,&m);printf("输入无向图的邻接矩阵: \n");for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf("%d",&c[i][j]);printf("着色所有可能的解:\n");graphcolor(n,m,c);}2.1结果截图。