遗传算法解决TSP问题

遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法

遗传算法的基本运算过程如下:

a)初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。

b)个体评价:计算群体P(t)中各个个体的适应度。

c)选择运算:将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。

d)交叉运算:将交叉算子作用于群体。所谓交叉是指把两个父代个体的部分结构加以替换重组而生成新个体的操作。遗传算法中起核心作用的就是交叉算子。

e)变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。

群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t 1)。

f)终止条件判断:若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。

下面用C语言模拟遗传算法模拟TSP问题

TSP问题及旅行商问题,假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值

交叉的算法如下图

遗传算法解决TSP问题_第1张图片

#include
#include
#include
#include
#include
#define cities 10  //城市的个数
#define MAXX 100//迭代次数
#define pc 0.8 //交配概率
#define pm 0.05 //变异概率
#define num 10//种群的大小
int bestsolution;//最优染色体
int distance[cities][cities];//城市之间的距离
struct group  //染色体的结构
{
	int city[cities];//城市的顺序
	int adapt;//适应度
	double p;//在种群中的幸存概率
}group[num],grouptemp[num];
//随机产生cities个城市之间的相互距离
void init()
{
	int i,j;
	memset(distance,0,sizeof(distance));
	srand((unsigned)time(NULL));
    for(i=0;igroup[bestsolution].p)
	bestsolution=i;
	//打印适应度
	for(i=0;i\n");
	for(i=0;ipoint2) //保证point1<=point2
		{
			temp=point1;
			point1=point2;
			point2=temp;
		}
        memset(map1,-1,sizeof(map1));
		memset(map2,-1,sizeof(map2));
		//断点之间的基因产生映射
		for(k=point1;k<=point2;k++)
		{
			map1[group[temp1].city[k]]=group[temp2].city[k];
			map2[group[temp2].city[k]]=group[temp1].city[k];
		}
		//断点两边的基因互换
		for(k=0;k
遗传算法解决TSP问题_第2张图片

你可能感兴趣的:(人工智能)