该算法来源于我最近所读的一本书。《Artificail Intelligence, A Moden Approach 3rd》中文译名是《人工智能,一种现代的方法》。是人工智能方向非常经典的一本教科书,一千多页的厚度也是令人望而生畏的。(当然,和高德纳的《计算机程序设计艺术》比起来,仍然是小巫见大巫了。)该书的第六章介绍了CSP问题以及一些经典的解决该问题的方案。心血来潮,再加上最近刚刚学习了python,想找个机会试下手,自己用python实现了其中的一部分。
所谓CSP问题(constraint satisfaction problem),是指多个变量(variable)各有自己的取值范围(domain),同时它们之间存在一些值上相互制约的条件(condition),要求给出一组能够自洽的解,或者证明无解的问题。涂色问题就是一种经典的CSP,我们为地图上的不同区域涂色,保证相邻的区域不会出现相同的颜色。在这里,每个区域就是一个变量,取值范围指我们能够选择的颜色种类,条件是和相邻的区域的变量值(颜色)不相等。
一个CSP就是由这三部分组成:变量variable,范围domain,限制条件condition。
我们用中国地图的一部分来描述并且表达一个CSP问题。
为了简单。我们只选取地图上湖南同色的部分省市做讨论。我们可以看到,如果按照上述涂色的要求,假设我们拥有4种颜色(红绿蓝白)用于填涂。(4种颜色足够用来填涂任何平面上的涂色问题,这个经典的四色问题直到近代才被人用穷举配合计算机方法作出了证明。)这里河南湖北相邻,故不能用相同的颜色,以此类推,湖北不能和任何其它三个省之间用相同的颜色。
我们按照以上提到的三个部分来描述这个问题,一种简单的方式如下:
variable:河南,湖北,湖南,江西
domain:河南:[红绿蓝白],湖北:[红绿蓝白],湖南:[红绿蓝白],江西:[红绿蓝白]