1. 概述
早在几个周以前就有同学在群里面说使用启发式算法来解决来解决这个问题,当然也有同学使用这个方法得到很不错的效果。在本篇文章中将遗传算法作为一个例子,列出来与大家交流。
首先对遗传算法中的几个概念做一下简短的介绍。
遗传算法是根据生物进化演变的规律总结来的,因而其中的一些概念也是跟生物息息相关的。
交叉:
有性生殖生物在繁殖下一代时,两个同源染色体之间通过交叉而重组,亦即在两个染色体的某一相同位置处DNA被切断,其前后两串分别交叉组合而形成新的染色体,这个新的染色体继承了两个父代染色体的基因。
变异:
虽然概率很小,但有可能产生某些基因复制差错,从而使DNA发生某种变异,产生出新的染色体,这些新的染色体表现出新的生物性状。
适应性:
根据达尔文的自然选择学说,地球上的生物具有很强的繁殖能力。在繁殖过程中,大多数生物通过遗传,使物种保持相似的后代;部分生物由于变异,后代具有明显差别,甚至形成新物种。正是由于生物的不断繁殖后代,生物数目大量增加,而自然界中生物赖以生存的资源却是有限的。因此,为了生存,生物就需要竞争。生物在生存竞争中,根据对环境的适应能力,适者生存,不适者消亡。自然界中的生物,就是根据这种优胜劣汰的原则,不断地进行进化。每一个个体对其生存环境都有不同的适应能力,这种适应能力称为个体的适应度。适应性强的个体有更高多机会生存并遗传下一代。
群体:
生物的进化是以集团的形式共同进行的,这样的一个团体称为群体或称为种群;组成群体的单个生物称为个体。
针对比赛中提出的问题,这里采用0-1规划与遗传算法结合,因而下面的概念可以解释为:
编码:染色体是生物个体的唯一表示,通常用编码来表示染色体;在比赛中使用0-1来表示该节点是否是服务器节点,也就是二进制编码。
群体:个体的集合;在比赛中种群的大小也意味着计算量的大小,因而在大图的时候可以适当减小种群的数量。
适应度:个体的适应性、生命力的度量;在比赛中使用最小费用最大流计算得到的代价来作为它的代价函数,也可以采用拉格朗日松弛来简化数学模型。
选择(复制):适应度高的个体,被大自然选择并生存的机率高;采用随机类似赌轮的方式进行。
交叉:个体间的基因交叉,生物遗传的主要行为;
变异:个体继承父代基因时的基因变异,生物进化的主要行为。
群体:个体的集合;在比赛中种群的大小也意味着计算量的大小,因而在大图的时候可以适当减小种群的数量。
适应度:个体的适应性、生命力的度量;在比赛中使用最小费用最大流计算得到的代价来作为它的代价函数,也可以采用拉格朗日松弛来简化数学模型。
选择(复制):适应度高的个体,被大自然选择并生存的机率高;采用随机类似赌轮的方式进行。
交叉:个体间的基因交叉,生物遗传的主要行为;
变异:个体继承父代基因时的基因变异,生物进化的主要行为。
2. 编码
///*遗传算法 start*
# define POPSIZE 10 //种群内个体数量
# define MAXGENS 100 //最大的迭代次数
static int NVARS = 3; //变量个数,即用以表示基因型的bit数
# define PXOVER 0.85 //交换率
# define PMUTATION 0.3 //突变率
struct genotype
{
double gene[MAX_NODE];
double fitness;
double uppe