首页 > 编程语言 >TSP 的遗传算法

TSP 的遗传算法

时间:2024-01-19 12:22:44浏览次数:29  
标签:const int double rnd Individual 遗传算法 TSP population

省流:不如模拟退火


打 OI 的时候一直对乱搞很感兴趣,只是没时间学,现在算是弥补一下吧


旅行商问题(Traveling Salesman Problem, TSP):求无向图边权和最小的哈密顿回路

#include <bits/stdc++.h>
using namespace std;

const double eps = 1e-8;

mt19937 mt(20050827);
int rnd(int l, int r)
{
	return uniform_int_distribution<>(l, r)(mt);
}

double haversin(double x)
{
	return (1 - cos(x)) / 2;
}

const int N = 35, m = 128;
int n;
double total, dis[N][N];
string name[N];

void input()
{
	freopen("in.txt", "r", stdin);
	const double R = 6371;
	static double x[N], y[N];
	n = 34;
	for (int i = 1; i <= n; ++i)
	{
		string tmp;
		cin >> name[i] >> x[i] >> tmp >> y[i] >> tmp;
		// cerr << name[i] << " " << x[i] << " " << y[i] << '\n';
		x[i] = x[i] * M_PI / 180;
		y[i] = y[i] * M_PI / 180;
	}
	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= n; ++j)
		{
			double h = haversin(x[j] - x[i]) + cos(x[i]) * cos(x[j]) * haversin(y[j] - y[i]);
			dis[i][j] = 2 * R * asin(sqrt(h));
		}
	}
	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j < i; ++j)
		{
			total += dis[i][j];
		}
	}
}

struct Individual
{
	vector<int> p;
	double distance, fitness;
	bool operator<(const Individual &rhs) { return fitness < rhs.fitness; }
	void evaluate()
	{
		distance = dis[p.front()][p.back()];
		for (int i = 1; i < p.size(); ++i)
		{
			distance += dis[p[i - 1]][p[i]];
		}
		fitness = total / distance;
	}
	void mutate()
	{
		while (rnd(1, 100) <= 1)
		{
			int l = rnd(0, n - 1), r = rnd(0, n - 1);
			// swap(p[l],p[r]);
			if (l > r)
			{
				swap(l, r);
			}
			reverse(p.begin() + l, p.begin() + r + 1);
			evaluate();
		}
	}
};
Individual cross(const Individual &x, const Individual &y)
{
	static bool vis[N];
	memset(vis, 0, sizeof vis);
	Individual z;
	z.p.resize(n);
	int l = rnd(0, n - 1), r = rnd(0, n - 1);
	if (l > r)
	{
		swap(l, r);
	}
	for (int i = l; i <= r; ++i)
	{
		z.p[i] = x.p[i];
		vis[z.p[i]] = 1;
	}
	for (int i = 0, j = 0; i < n; ++i)
	{
		if (l <= i && i <= r)
		{
			continue;
		}
		while (vis[y.p[j]])
		{
			++j;
		}
		z.p[i] = y.p[j];
		vis[z.p[i]] = 1;
	}
	z.evaluate();
	return z;
}

vector<Individual> population(m);

struct
{
	double sumf;
	void init()
	{
		sumf = 0;
		for (auto &i : population)
		{
			sumf += i.fitness;
		}
	}
	Individual select()
	{
		double rate = uniform_real_distribution<>(0, sumf)(mt);
		for (auto &i : population)
		{
			rate -= i.fitness;
			if (rate < eps)
			{
				return i;
			}
		}
		assert(0);
	}
} roulette;

void GA()
{
	roulette.init();
	vector<Individual> children;
	children.emplace_back(*max_element(population.begin(), population.end()));
	for (int i = 1; i < m; ++i)
	{
		Individual son = rnd(1, 100) <= 60 ?
			cross(roulette.select(), roulette.select()) : roulette.select();
		son.mutate();
		children.emplace_back(son);
	}
	population = children;
}

void output()
{
	Individual best = *max_element(population.begin(), population.end());
	cout << best.distance << "km\n";
	for (int i = 0; i < n; ++i)
	{
		cout << name[best.p[i]] << " ";
	}
	cout << '\n';
	cerr << (double)clock() / CLOCKS_PER_SEC << "s\n";
}

signed main()
{
	input();
	for (auto &i : population)
	{
		i.p.resize(n);
		iota(i.p.begin(), i.p.end(), 1);
		shuffle(i.p.begin(), i.p.end(), mt);
		i.evaluate();
	}
	for (int generation = 1; generation <= 1 << 16; ++generation)
	{
		GA();
	}
	output();
	return 0;
}
in.txt
上海市 31.2304°N 121.4737°E
云南省昆明市 24.8801°N 102.8329°E
内蒙古自治区呼和浩特市 40.48°N 111.41°E
北京市 39.9042°N 116.4074°E
台湾省台北市 25.0639°N 121.5217°E
吉林省长春市 43.8171°N 125.3235°E
四川省成都市 30.5728°N 104.0668°E
天津市 39.3434°N 117.3616°E
宁夏回族自治区银川市 38.4680°N 106.2730°E
安徽省合肥市 31.8206°N 117.2272°E
山东省济南市 36.6512°N 117.1206°E
山西省太原市 37.8706°N 112.5489°E
广东省广州市 23.1291°N 113.2644°E
广西壮族自治区南宁市 22.8240°N 108.3200°E
新疆维吾尔自治区乌鲁木齐市 43.8256°N 87.6168°E
江苏省南京市 32.0603°N 118.7969°E
江西省南昌市 28.6820°N 115.8579°E
河北省石家庄市 38.0428°N 114.5149°E
河南省郑州市 34.7466°N 113.6253°E
浙江省杭州市 30.2741°N 120.1551°E
海南省海口市 20.0442°N 110.1999°E
湖北省武汉市 30.5928°N 114.3055°E
湖南省长沙市 28.2282°N 112.9388°E
澳门特别行政区 22.18°N 115.12°E
甘肃省兰州市 36.0611°N 103.8343°E
福建省福州市 26.0745°N 119.2965°E
西藏自治区拉萨市 29.6500°N 91.1000°E
贵州省贵阳市 26.6466°N 106.6302°E
辽宁省沈阳市 41.7968°N 123.4294°E
重庆市 29.4316°N 106.9123°E
陕西省西安市 34.3416°N 108.9398°E
青海省西宁市 36.6171°N 101.7782°E
香港特别行政区 22.25°N 114.25°E
黑龙江省哈尔滨市 45.8038°N 126.5350°E

标签:const,int,double,rnd,Individual,遗传算法,TSP,population
From: https://www.cnblogs.com/ft61/p/17825648.html

相关文章

  • RTSP流截图并剔除花屏图片
    大致代码如下:importcv2importnumpyasnpfromfastapiimportHTTPExceptionRgbRangeType=tuple[tuple[int,int,int],tuple[int,int,int]]classValidationError(HTTPException):def__init__(self,detail:str,status_code=400)->None:supe......
  • 电力电子仿真工具——LTSpice
    LTSPICE的是ADI旗下一款免费的SPICE类仿真软件,有的时候,可以免费使用,对工程师、学生来说就是胜过千言万语的。SPICE型仿真和PLECS有点不同,它是由器件厂家用伪代码,可以理解为一些方程函数把它家的器件或者子系统的特性描述出来,封装成库函数给器件应用者,这样对于使用者来说,就可......
  • 双脉冲仿真测试(LTspice搭建)
     1.双脉冲测试原理    很多博主已经发布了大量有关双脉冲测试的意义、双脉冲测试原理等,顾在此不在赘诉,如有需要的小伙伴可以点这里。以下重点介绍在LTspice中双脉冲电路的搭建及可能遇到的问题。2.搭建双脉冲测试               ......
  • Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级R
    技术背景我们在对接Unity下推送模块的时候,遇到这样的技术诉求,开发者希望在Android的Unity场景下,获取到前后摄像头的数据,并投递到RTMP服务器,实现低延迟的数据采集处理。在此之前,我们已经有了非常成熟的RTMP推送模块,也实现了Android平台Unity环境下的Camera场景采集,针对这个技术需求,......
  • RTSP/Onvif安防视频云平台EasyNVR迁移盘符后启动异常的问题排查与解决
    EasyNVR安防视频云平台可支持设备通过RTSP/Onvif协议接入,并进行视频流的处理及分发,在视频监控场景中可实现视频实时监控直播、云端录像、云存储、录像检索与回看、告警、级联等,平台能将拉取过来的音视频流转化成适合全平台播放的RTMP、RTSP、hTTP-FLV、Websocket-FLV、HLS、WebRTC......
  • rtsp视频网页播放
    注意:目前都在windows上使用,服务器安装部署多多少少有些问题。1、WebRtcStreamergithub:https://github.com/mpromonet/webrtc-streamer/releases但是经常打不开,如果有需要私信我,因为太忙了没时间放网盘,见谅里面有windows版也有linux版的在本地使用,进入exe目录 启动,默认......
  • Gstreamer Rtspsrc连接大华摄像头失败原因及解决
    先说解决办法sudoapt-getremovegstreamer1.0-plugins-ugly分析过程和原因输入命令gst-launch-1.0rtspsrclocation="rtsp/url"!fakesink终端输出如下SettingpipelinetoPAUSED...PipelineisliveanddoesnotneedPREROLL...Progress:(open)OpeningStre......
  • Android平台RTMP推送|轻量级RTSP服务|GB28181设备接入模块之实时快照保存JPG还是PNG?
    JPG还是PNG?JPG和PNG是两种常见的图片文件格式,在压缩方式、图像质量、透明效果和可编辑性等方面存在显著差异。压缩方式:JPG是一种有损压缩格式,通过丢弃图像数据来减小文件大小,因此可能会损失一些图像细节和质量。而PNG使用的是无损压缩格式,它不会丢失任何原始图像数据,从而保持了图像......
  • LiveNVR监控流媒体Onvif/RTSP常见问题-如何配置快照目录快照存储默认目录目录如何配置
    LiveNVR监控流媒体Onvif/RTSP常见问题-如何配置快照目录快照存储默认目录目录如何配置?1、快照目录2、指定快照目录3、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务1、快照目录部署LiveNVR后,配置通道上线后,会在LiveNVR部署的服务器里面存储对应的最新快照,默认的快照目录是LiveNVR解......
  • GB28181视频监控平台LiteCVR调用rtsp地址返回的IP不正确原因排查
    RTSP(Real-TimeStreamingProtocol)是一种用于控制实时流媒体传输的应用层协议。它被设计用于建立和管理客户端与媒体服务器之间的连接,以便实现实时音频、视频或其他交互式媒体内容的传输。RTSP允许客户端通过发送命令来控制流媒体服务器的播放、暂停、快进、倒带等操作。RTSP支持多......