TSP 遗传算法
GA——遗传算法
同模拟退火算法一样,都是现代优化算法之一。模拟退火是在一定接受程度的情况下仍然接受一个比较差的解。
遗传算法,是真真正正的和大自然的遗传进化有着非常紧密的联系的,当然遗传进化的只是在生物学中已经讲过了,8个字,物竞天择,适者生存。
简介
《物种起源》,有兴趣可以看看达尔文的著作。
物竞天择,适者生存,这两句话,也可以说是对遗传算法过程的伪代码描述了,物竞天择,就是我们的目标函数,只有越满足我们的目标函数的个体才会留下来,适者生存,就是我们在算法的过程中要淘汰一些个体。
基因编码方式
生物学里面告诉我们,遗传,变异都是以种群为研究对象的,怎么表示一个解呢?用他的基因表示,嘿嘿,组成这个解的步骤表示,第一步干什么,第二步干什么,怎么在程序中编码呢?
常用两种编码方式:二进制编码,浮点数编码。
二进制编码:一定精度的二进制只能表示一定精度的浮点数。栗子,要求精确到6位小数,而区间是 [-1,2],至少要把区间划分为3*10^6等分。编码也就需要22位。这里就涉及到一个二进制串转换到一个区间为 [-1,2] 的实数,两者相互转换。比如得到的十进制数为 x,那么对应的 [-1,2] 区间的浮点数就是

浮点数编码:为改善遗传算法的复杂度,提出来浮点数编码
适应评分及选择函数
适应评分函数就是用来衡量哪个个体应该被淘汰。但是也不能说,取值差点的个体一定就被淘汰了,这里会有一个概率存在,怎么建立一种概率关系呢?常用的方法是轮盘法。假设种群数为 n,某个个体 i 的适应度为 fi,那么个体 i 被选择的概率是:

So,遗传算法中的自然选择过程:
适应评分函数——求出各个体的适应评分值
轮盘选择——个体被选择的概率
基因重组与基因突变
在生物学中,基因重组有两种情况。
基因重组,就是两个个体基因发生交换。
基因突变是一种小概率事件。
使得一个基因变成他的等位基因,引起一定的表现型变化。
TSP问题求解
TSP问题,之前已经用费用流,和模拟退火做过了,现在用遗传来讨论。
程序过程和自然界中的遗传与进化是一样的。
生成50个个体,形成种群,并基因编码。
基因重组,突变,和父代,一起进行天择。
重复100次进化。得到较优的解。
clc,clear;
sj0 = load('sj.txt');
x = sj0(:,::); x = x(:);
y = sj0(:,::); y = y(:);
sj = [x,y];d1 = [,];
sj = [d1;sj;d1]; sj = sj*pi/;
d = zeros();
for i = :
for j = i+:
d(i,j) = *acos(cos(sj(i,)-sj(j,))*cos(sj(i,))*cos(sj(j,))+sin(sj(i,))*sin(sj(j,)));
end
end
d = d + d';
% w 为种群数,g为进化的代数
w = ;
g = ;
rand('state',sum(clock));
% 改良圈算法选取初始种群
for k=:w %通过改良圈算法选取初始种群
c=randperm(); %产生1,...,100的一个全排列
c1=[,c+,]; %生成初始解
for t=: %该层循环是修改圈
flag=; %修改圈退出标志
for m=:
for n=m+:
if d(c1(m),c1(n))+d(c1(m+),c1(n+))<d(c1(m),c1(m+))+d(c1(n),c1(n+))
c1(m+:n)=c1(n:-:m+); flag=; %修改圈
end
end
end
if flag==
J(k,c1)=:; break %记录下较好的解并退出当前层循环
end
end
end
% 染色体编码
J(:,) = ;
J = J/;
% 100次进化
for k = :g
A = J;
c = randperm(w);
for i = ::w % 基因重组
F = + floor(*rand()); % 产生交叉操作的染色体对
tmp = A(c(i),[F:]);
A(c(i),[F:]) = A(c(i+),[F:]);
A(c(i+),F:) = tmp;
end
% 变异
by = [];
while ~isempty(by) % 变异的个体数也是随机的
by =find(rand(,w)<0.1);
end B = A(by,:); % 变异染色体
for j = :length(by)
bw = sort(+floor(*rand(,))); % 产生变异操作的3个地址
B(j,:) = B(j,[:bw(),bw()+:bw(),bw():bw(),bw()+:]); end G=[J;A;B]; % 父代和子代
% 基因翻译为解空间,把染色体翻译成1,...,102的序列ind1
[SG,ind1] = sort(G,);
num = size(G,); % 父子种群的总个体数
long = zeros(,num); % 每一个体的优劣
for j = :num
for i = :
long(j) = long(j)+d(ind1(j,i),ind1(j,i+));
end
end [slong,ind2] = sort(long);
J = G(ind2(:w),:);
end
path = ind1(ind2(),:);
flong = slong();
xx = sj(path,);
yy = sj(path,);
plot(xx,yy,'-o');
参考:
ACdreamer
司守奎
TSP 遗传算法的更多相关文章
- 遗传算法的C语言实现(二)-----以求解TSP问题为例
上一次我们使用遗传算法求解了一个较为复杂的多元非线性函数的极值问题,也基本了解了遗传算法的实现基本步骤.这一次,我再以经典的TSP问题为例,更加深入地说明遗传算法中选择.交叉.变异等核心步骤的实现.而 ...
- 遗传算法的简单应用-巡回旅行商(TSP)问题的求解
上篇我们用遗传算法求解了方程,其中用到的编码方式是二进制的编码,实现起来相对简单很多, 就连交配和变异等操作也是比较简单,但是对于TSP问题,就稍微复杂一点,需要有一定的策略, 才能较好的实现. 这次 ...
- 转:遗传算法解决TSP问题
1.编码 这篇文章中遗传算法对TSP问题的解空间编码是十进制编码.如果有十个城市,编码可以如下: 0 1 2 3 4 5 6 7 8 9 这条编码代表着一条路径,先经过0,再经过1,依次下去. 2.选 ...
- 遗传算法解决旅行商问题(TSP)
这次的文章是以一份报告的形式贴上来,代码只是简单实现,难免有漏洞,比如循环输入的控制条件,说是要求输入1,只要输入非0就行.希望会帮到以后的同学(*^-^*) 一.问题描述 旅行商问题(Traveli ...
- 遗传算法解决TSP问题实现以及与最小生成树的对比
摘要: 本实验采用遗传算法实现了旅行商问题的模拟求解,并在同等规模问题上用最小生成树算法做了一定的对比工作.遗传算法在计算时间和占用内存上,都远远优于最小生成树算法. 程序采用Microsoft vi ...
- 基于遗传算法求解TSP问题(Java界面)
近期为做展示,改写了一个遗传算法求TSP的Java界面版,思路代码和 http://blog.csdn.net/wangqiuyun/article/details/12838903 这篇文章思路是一 ...
- 遗传算法解决TSP问题
1实验环境 实验环境:CPU i5-2450M@2.50GHz,内存6G,windows7 64位操作系统 实现语言:java (JDK1.8) 实验数据:TSPLIB,TSP采样实例库中的att48 ...
- 用遗传算法解决TSP问题
浅谈遗传算法:https://www.cnblogs.com/AKMer/p/9479890.html Description \(小m\)在踏上寻找\(小o\)的路程之后不小心碰到了大魔王\(fat ...
- 遗传算法求解TSP问题
package com.louis.tsp; /** * Project Name:GeneticAlgorithm * File Name:Individual.java * Package Nam ...
随机推荐
- Android应用捕获全局异常自定义处理
[2016-06-30]最新的全局异常处理DRCrashHandler已经集成在DR_support_lib库中 具体请看: https://coding.net/u/wrcold520/p/DR_s ...
- 使用JWT来实现单点登录功能
出处: https://www.cnblogs.com/zexin/p/10389541.html 我们平时自己开发项目,分布式的结构时,访问量不大,但是又不想搭建redis服务器,这时我觉得jwt不 ...
- Spring 和整个体系 @Value注解 配合属性文件.property
未来学习方向 重要思路 学的时候看官方文档,系统地学,比如学Spring Boot ,但真正使用的时候,有比自动化(条件化)配置,约定即配置 更好的方法(这个可读性不强,对电脑来说它执行的代码一样 ...
- zookeper集群
1.vi zoo.cfg server.1= ip:2777:3777 server.2= ip:2888:3888 server.3= ip:2999:3999 开启防火墙端口 2.创建myid文件 ...
- linux中Python源码安装和配置
安装 首先获取安装包,此处版本为3.7 wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz 解压 tar xvf Python- ...
- ElasticSearch:集群(Cluster),节点(Node),分片(Shard),Indices(索引),replicas(备份)之间关系
[Cluster]集群,一个ES集群由一个或多个节点(Node)组成,每个集群都有一个cluster name作为标识----------------------------------------- ...
- 一、IP地址
IP地址 1)网络地址 IP地址由网络号(包括子网号)和主机号组成,网络地址的主机号为全0,网络地址代表着整个网络. 2)广播地址 广播地址通常称为直接广播地址,是为了区分受限广播地址. 广播地址与网 ...
- [转]前端HTML-CSS规范
原文:http://www.cnblogs.com/whitewolf/p/4491707.html 黄金定律 一个项目应该永远遵循同一套编码规范! 不管有多少人共同参与同一项目,一定要确保每一行代码 ...
- netty笔记(一)--Demo
Netty是一个Java开源框架,用于传输数据.由server和client组成,封装了Java nio,支持TCP, UDP等协议.这里写了一Demo EchoClientHandler.java ...
- html5 嵌入元素 img map areaiframe embed meter object meter
<img src="路径"> src 路径可以是img.jpg 也可以是 绝对和相对路径+img.jpg <img src="路径 ...