TSP_GA(旅行商问题_遗传算法)

原文链接: https://blog.csdn.net/Houchaoqun_XMU/article/details/54584264

本文转载:https://blog.csdn.net/Houchaoqun_XMU/article/details/54584264

上面链接的内容很详细,推荐看链接内容!

以下只是个人学习的小笔记,缺乏严谨性,不必在意!

 

TSP_GA(旅行商问题_遗传算法)

 

简单思路:

1.生成由N个对象ob产生的群体group[N] 

2.选择两个对象group[x]和group[y]

3.这两个对象进行杂交【1】得到新的对象new_ob

4.新的对象new_ob是否变异

5.新的对象new_ob与群体group[N]比较,若更优,则替换

 

【1】杂交:

两个对象 x 和 y 杂交

即对象x的 "元素i到元素j" 和 对象y的 "元素i到元素j" 进行杂交。

简单步骤:

1)选取杂交开始点 i 和杂交结束点 j

2)先将对象x和对象y产生冲突的元素各保存在 x_c 和 y_c

3)对象x的 "元素i到元素j" 和 对象y的 "元素i到元素j" 交换

4)将对象x冲突的元素替换,将对象y冲突的元素替换

5)完成

 

GA.h文件

#ifndef _GA_H_
#define _GA_H_
	#define CITY_NUM 10				// TSP_城市个数
	#define GROUP_NUM 30				// 群体规模
	#define SON_NUM 32				// 产生儿子的个数	SON_NUM = GROUP_NUM + 2
 
	const double P_INHERIATANCE = 0.01;	// 变异概率
	const double P_COPULATION = 0.8;	// 杂交概率
	const int ITERATION_NUM = 5500;		// 遗传次数(迭代次数)
	const double MAX_INT = 9999999.0;
 
	typedef struct{
		int vex_num, arc_num;			// 顶点数 边数
		int vexs[CITY_NUM];			// 顶点向量
		double arcs[CITY_NUM][CITY_NUM];	// 邻接矩阵
	}Graph;
 
	typedef struct{
		double length_path;
		int path[CITY_NUM];
		double P_Reproduction;
	}TSP_solution;
 
	TSP_solution TSP_Groups[GROUP_NUM];		// 存储群体
	TSP_solution Son_solution[SON_NUM];		// 存储杂交后的个体
	int Length_SonSoliton = 0;			// 遗传产生的孩子的个数
	TSP_solution BEST;
 
	void CreateGraph(Graph &G);
	void InitialGroup(Graph G);
	double CalculateLength(Graph G,TSP_solution newSolution);
	void TSP_Evolution(Graph G);	// 模拟生物进化 - 解决TSP问题	
 
	int Evo_Select(Graph G);		// 选择函数
	void Evo_Cross(Graph G, TSP_solution TSP_Father, TSP_solution TSP_Mother);	// 杂交函数
	void Evo_Variation(Graph G, int Index_Variation);	// 变异函数
	void Evo_UpdateGroup(Graph G);
	void TSP_Evaluate(Graph G);		// TSP - 评价函数	
 
	int *Get_Conflict(int Conflict_Father[], int Conflict_Mother[], int Length_Cross, int &Length_Conflict);	// 返回冲突的数组
	TSP_solution Handle_Conflict(Graph G, TSP_solution ConflictSolution, int *Detection_Conflict, int *Model_Conflict, int Length_Conflict);	// 解决冲突
 
	void Calc_Probablity(Graph G, double total_length);	// 计算概率
	bool Check_path(Graph G, TSP_solution CurrentSolution);
	void Display(Graph G);
	void Dis_BEST(Graph G);
#endif

 

#include 
#include 
#include 	// 本文用于输出对齐
#include  
#include 
#include 
 
#include "GA.h"
 
using namespace std;
 
int IndexCross_i;
int IndexCross_j;
 
int main(){
	time_t T_begin = clock();
	Graph G;
	CreateGraph(G);
 
	srand ( unsigned ( time(0) ) );
	InitialGroup(G);
 
	TSP_Evolution(G);	// 遗传算法
	
	Dis_BEST(G);
 
	time_t T_end = clock();
	double RunningTime = double(T_end - T_begin) / CLOCKS_PER_SEC;
	cout<> G.vex_num;
	// read_in >> G.arc_num;
	G.arc_num = 0;
	for (int i = 0;i < G.vex_num; i++)
	{
		read_in >> G.vexs[i];
	}
	G.vexs[G.vex_num] = '\0';	// char的结束符.
 
	for (i = 0; i < G.vex_num;i++)
	{
		for (int j = 0; j < G.vex_num; j++)
		{
			read_in >> G.arcs[i][j];
 
			// calculate the arc_num
			if (G.arcs[i][j] > 0)
			{
				G.arc_num++;
			}
		}
	}
 
	// display
	cout<<"无向图创建完毕,相关信息如下:"< 自交( 父母为同一个个体时, 母亲重新选择, 直到父母为不同的个体为止 )
			// cout<<"Warning!【Father_index = Mother_index】"<= GROUP_NUM
		int M = GROUP_NUM - GROUP_NUM/2;
		Length_SonSoliton = 0;	// 遗传产生的个体个数, 置零重新累加
		while(M){
			double Is_COPULATION = ((rand()%100 + 0.0) / 100);
			if (Is_COPULATION > P_COPULATION)
			{
				// cout<<"[ 这两个染色体不进行杂交 ]Is_COPULATION = "< ";
			}
			cout< IndexCross_j)
	{
		int temp = IndexCross_i;
		IndexCross_i = IndexCross_j;
		IndexCross_j = temp;
	}
	if (IndexCross_j == CITY_NUM || IndexCross_i == 0)
	{
		cout<<"[ 杂交过程的随机数产生有问题... ]"< ConflictSolution
		// 8 7 [4 5 6 7 1] 9 6 5
		// [0 3 2] --> Detection_Conflict
		// [4 5 6] --> Model_Conflict
		// 解决冲突, index 为当前i冲突的位置, 用Model_Conflict去替换.
		// cout<<"index = "< ";
	}
	cout< ";
	}
	cout<";
	cout<

你可能感兴趣的:(TSP_GA(旅行商问题_遗传算法))