一道很考逻辑思维能力的好题目(真正的好题)
我是从MATLAB的官方网站的CONTEST拦中发现这个题目的,有来自世界各地的科学家对这个问题编写了算法,并用MATLAB自带的编译器编译运行,到目前为止以有2000多种不同的算法,所有的算法都可以在 http://www.mathworks.com/contest/protein.cgi/home.html 上找到,目前为止最佳的算法大概有3000多行吧。
问题是二维蛋白质折叠问题中抽象出来的,我对问题进一步抽象然后简化描述入下:
有一个围棋盘和黑白旗子。用一根绳子将黑,白旗子不规则的串起来,构成一条链。然后将这条链放在棋盘上。由于黑色的旗子之间有相互的吸引力,所以链有折叠起来的倾向。现在就要问你,如何把这条链在棋盘上摆出来,让最多的黑棋子相连(斜向相连不算)。每个棋子能且只能占用一个节点,而且链子本身不能交叉。
我的解答和体会:
这个问题是去年我本科做毕业设计的题目,这个问题的关键有2个,1是编写描述问题的代码,包括棋盘,链,棋子,折叠方向等所使用的数据结构;2是编写高效率的算法对问题进行计算。这是一个典型的NP-HARD问题,即算法难度会随着问题的规模呈现X的X次方的高速增长。
我当时使用的是矩阵来描述棋盘等等,然后用基础的遗传算法编写的程序,用MATLAB的编译器编译的程序。由于电脑运算能力有限度,我只算出了一条链有9个棋子时的最佳结果,在12个和16个时候只算出了接近的结果,每算一次大概要10分钟左右的时间。另外有同学说如果用FORTRUN编译的话占用系统资源比较少应该可以算更多的好结果出来。
我是信息与计算科学毕业的,有对算法设计有兴趣的朋友加我QQ 474202743 。