(C++源码)遗传算法解决TSP问题,30个城市的

本文介绍了使用遗传算法解决旅行商问题(TSP)的具体实现,以30个城市为例。在设定的10万次迭代、100%交叉率和0.3变异率下,探讨了算法的运行过程。欲深入学习,可参考作者的详细教程链接。
摘要由CSDN通过智能技术生成

旅行商问题(Traveling Salesman Problem,
TSP),又译为旅行推销员问题、货担郎问题,简称为TSP问题,是最基本的路线问题。假设有n个可直达的城市,一销售商从其中的某一城市出发,不重复地走完其余n-1个城市并回到原出发点,在所有可能的路径中求出路径长度最短的一条。

在这里插入图片描述
在这里插入图片描述
30条染色体
迭代次数:10万次(大概跑一分钟吧)
交叉率:100%(这个可以自己设置,加点小代码就行了)
变异率:0.3(可自己设置)

如果想认真学习此算法,请转移到(也是我写的,非常详细有手就行):https://blog.csdn.net/gassing/article/details/110186682

#include "pch.h"

#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include<string>
#include<cmath>
#include<ctime>
#include<fstream>
using namespace std;
double dis[30][31];  //城市之间的距离
int generation;   //已经繁衍了多少代
int totalgeneration; //输入的种群繁衍代数
int cities[2][30];     //记录城市坐标 ,cities[][],一维中的0代表x坐标,1代表y坐标;二维代表城市
int citynum = 30;		//30个城市
int groupbest[31];  //最优解染色体
double groupbestp;   //最优解的占总群的概率
double groupbestfit;  //最优解的适应度
int changebest;        // 是否用最优解代替新种群

struct group
{
   
	int city[31];     //一维记录城市序号,二三维记录坐标
	double p;	     //占总群的概率
	double fit;     //适应度
	double  sum_p;  //累计概率
}group[30];
void init_group();//初始种群和城市坐标,计算距离
void calculation();//用来计算种群的p、fit
void savebest();//保存最优解
void change_bestgroup();//精英保留策略,用最优解代替新种群中的最差的染色体
void select();//选择--复制
void crossover();//交叉
void mutation();//变异

int main()
{
   
	int j, flag;
	int out = 1;  //为0则退出,为1则继续
	double distancenum;
	while (out)
	{
   
		distancenum = 0.0;
		flag = 1;
		init_group();
		while (flag)
		{
   
			cout << "请输入种群繁衍代数(100000以内):";
			cin >> totalgeneration;
			if (totalgeneration <= 100000)
				flag = 0;
		}
		while (totalgeneration--)
		{
   
			cout << totalgeneration << endl;
			select();          //选择
			crossover();		//交叉
			mutation();		//变异
		}

		cout << "最优种群是:" << endl;
		for (j = 0; j < citynum + 1; j++)
		{
   
			cout << groupbest[j] << " ";
			if (j < citynum)
			{
   
				distancenum += dis[groupbest[j]][groupbest[j + 1]];
			}
		}

		cout << " 路径长度是 : " << distancenum << ",适应度为 : " << groupbestfit << ",代数为 : " << generation << endl;

		cout << "\n输入任意正整数继续,输入0退出:";
		cin >> out;
		cout << endl;
	}

}

void init_group()					/* 初始种群和城市坐标,计算距离*/
{
   
	int i, j, random, flag, k;
	double ss;
	cities[0][0] = 87;//初始化坐标   cities[0][0]城市0的横坐标
	cities[1][0] = 7;   //cities[1][0]城市0的纵坐标  ,前面第一维表示横纵坐标,第二维代表城市n
	cities[0][1] = 91;
	cities[1][1] = 38;
	cities[0][2] = 83;
	cities[1][2] = 46;
	cities[0][3] = 71;
	cities[1][3] = 44;
	cities[0][4] = 64;
	cities[1][4] = 60;
	cities[0][5] = 68;
	cities[1][5] = 58;
	cities[0][6] = 83;
	cities[1][6] = 69;
	cities[0][7] = 87;
	cities[1][7] = 76;
	cities[0][8] = 74;
	cities[1][8] = 78;
	cities[0][9] = 71;
	cities[1][9] = 71;
	cities[0][10
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值