省流:不如模拟退火


打 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

TSP 的遗传算法的更多相关文章

  1. tsp问题——遗传算法解决

    TSP问题最简单的求解方法是枚举法. 它的解是多维的.多局部极值的.趋于无穷大的复杂解的空间.搜索空间是n个点的全部排列的集合.大小为(n-1)! .能够形象地把解空间看成是一个无穷大的丘陵地带,各山 ...

  2. TSP问题 遗传算法 智能优化算法

    写了半天,效率还是有点低的,以后有空再优化下: //用次序表示法来表示个体编码 #include<iostream> #include<fstream> #include< ...

  3. 遗传算法 TSP(Python代码)

    该代码是本人根据B站up主侯昶曦的代码所修改的. 原代码github地址:https://github.com/Houchangxi/heuristic-algorithm/blob/master/T ...

  4. 遗传算法 | Java版GA_TSP(我的第一个Java程序)

    嗯哼,第一次写博客,准确说是第一次通过文字的方式记录自己的工作,闲话少叙,技术汪的博客就该直奔技术主题(关于排版问题,会在不断写博客的过程中慢慢学习,先将就着用吧,重在技术嘛~~~). 遗传算法(Ge ...

  5. 遗传算法的C语言实现(二)-----以求解TSP问题为例

    上一次我们使用遗传算法求解了一个较为复杂的多元非线性函数的极值问题,也基本了解了遗传算法的实现基本步骤.这一次,我再以经典的TSP问题为例,更加深入地说明遗传算法中选择.交叉.变异等核心步骤的实现.而 ...

  6. 遗传算法的简单应用-巡回旅行商(TSP)问题的求解

    上篇我们用遗传算法求解了方程,其中用到的编码方式是二进制的编码,实现起来相对简单很多, 就连交配和变异等操作也是比较简单,但是对于TSP问题,就稍微复杂一点,需要有一定的策略, 才能较好的实现. 这次 ...

  7. 转:遗传算法解决TSP问题

    1.编码 这篇文章中遗传算法对TSP问题的解空间编码是十进制编码.如果有十个城市,编码可以如下: 0 1 2 3 4 5 6 7 8 9 这条编码代表着一条路径,先经过0,再经过1,依次下去. 2.选 ...

  8. 遗传算法解决旅行商问题(TSP)

    这次的文章是以一份报告的形式贴上来,代码只是简单实现,难免有漏洞,比如循环输入的控制条件,说是要求输入1,只要输入非0就行.希望会帮到以后的同学(*^-^*) 一.问题描述 旅行商问题(Traveli ...

  9. 遗传算法解决TSP问题实现以及与最小生成树的对比

    摘要: 本实验采用遗传算法实现了旅行商问题的模拟求解,并在同等规模问题上用最小生成树算法做了一定的对比工作.遗传算法在计算时间和占用内存上,都远远优于最小生成树算法. 程序采用Microsoft vi ...

  10. 基于遗传算法求解TSP问题(Java界面)

    近期为做展示,改写了一个遗传算法求TSP的Java界面版,思路代码和 http://blog.csdn.net/wangqiuyun/article/details/12838903 这篇文章思路是一 ...

随机推荐

  1. Linux特殊权限之SUID,SGID

    SUID定义 暂时借用属主身份运行二进制程序.(SGID则是借用属组) 应用场景 某些用户在运行二进制程序的过程中,没有权限访问此二进制程序中其他的一些文件.给此用户过高的权限又不安全. 比如,每个用 ...

  2. W801单片机入门开发环境设置

    W801单片机入门开发环境设置 开发软件下载 烧录工具和SDK 在 WinnerMicro的网站 https://www.winnermicro.com/html/1/156/158/558.html ...

  3. IoTBrowser V2.0:引领物联网时代的全新浏览器

    强大的兼容性,无限的可能 IoTBrowser V2.0,基于Chromium内核,完美支持H5/css/js开发界面,让您的物联网应用拥有与主流浏览器同等的流畅体验.同时,它还支持CSS 3动画.C ...

  4. Stable Diffusion(二)WebUI使用指南

    1. 前言 基于 https://stable-diffusion-art.com/ 内的教程进行翻译与整理,帮助快速上手 stable-diffusion 的使用. 2. 环境 AWS DeepLe ...

  5. zRAM内存压缩技术原理与应用

    zRAM内存压缩技术原理与应用 作者: 发布于:2020-3-8 8:38 分类:内存管理 http://www.wowotech.net/memory_management/458.html/com ...

  6. Linux 内核:设备树(3)把device_node转换成platfrom_device

    Linux 内核:设备树(3)把device_node转换成platfrom_device 背景 在上一节中讲到设备树dtb文件中的各个节点转换成device_node的过程(<dtb转换成de ...

  7. 使用bootchart 对 高通Android 进行性能分析

    使用bootchart 对 高通Android 进行性能分析 Android版本:7.0 适用平台:高通和MTK 参考: https://blog.csdn.net/qq_19923217/artic ...

  8. 全国产!瑞芯微RK3568J/RK3568B2工业核心板规格书

    核心板简介 创龙科技SOM-TL3568是一款基于瑞芯微RK3568J/RK3568B2处理器设计的四核ARM Cortex-A55全国产工业核心板,每核主频高达1.8GHz/2.0GHz.核心板CP ...

  9. Spring的@Configuration和@Bean注解定义第三方bean

    @Configuration和@Bean注解的使用 @Configuration标注在类上,相当于把该类作为spring的xml配置文件中<beans>,作用为:配置spring容器(应用 ...

  10. 云服务器从阿里云迁移到华为云,FTP服务器的一些设置处理

    由于一些特殊原因,计划从阿里云上把ECS服务器的相关资源资源迁移到华为云上,为了保险起见,先申请一个月的华为云ECS服务器进行测试,首先就是搭建FTP服务器进行文件的上传处理,在使用FileZilla ...