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 ...
随机推荐
- django学习笔记——搭建博客网站
1. 配置环境,创建django工程 虚拟环境下建立Django工程,即创建一个包含python脚本文件和django配置文件的目录或者文件夹,其中manage.py是django的工程管理助手.(可 ...
- 【温故知新】c#抽象类abstract与接口interface
1.什么是抽象类 先来看MSDN对抽象类描述: 抽象类是一些留有部分或全部成员未实现的类,以便可以由派生类来提供实现. 在面向对象的编程中,抽象类用作层次结构的基类,并表示不同对象类型组的通用功能. ...
- (转)超全整理!Linux性能分析工具汇总合集
超全整理!Linux性能分析工具汇总合集 原文:http://rdc.hundsun.com/portal/article/731.html 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望, ...
- 面向切面编程 (AOP )
什么是面向切面编程? 面向切面编程就是(AOP --- aspect-oriented programming), 在百科上说: 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一 ...
- Java版多人聊天室
server.java import java.io.*; import java.net.*; import java.text.SimpleDateFormat; import java.util ...
- 写C#代码时用到的中文简体字 、繁体字 对应的转化 (收藏吧)
简体字 下面有与之对应的繁体字 private const String Jian = "啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆疤巴拔跋靶 ...
- HashMap和Hashtable存放null
Hashmap是可以放key为null的,Hashtable不能放key为null.hashtable放key为null会报空指针异常 1. hashmap put方法源码 public V put( ...
- 数组和矩阵(2)——Reshape the Matrix
In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a new o ...
- vue——指令系统
指令系统,可以联想咱们的cmd命令行工具,只要我输入一条正确的指令,系统就开始干活了. 在vue中,指令系统,设置一些命令之后,来操作我们的数据属性,并展示到我们的DOM上. 在vue中提供了一套为数 ...
- [转]滚动视差?CSS 不在话下/background attachment
何为滚动视差 视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验. 作为网页设计的热点趋势,越来越多的网站应用了这项技术. ...