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 ...
随机推荐
- java se系列(四) 函数、数组、排序算法、二分法、二维数组
1 函数 1.1 数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表 ...
- (转)Python格式化字符 %s %d %f
Python格式化字符 %s %d %f 原文:http://blog.csdn.net/huangfu77/article/details/54807835 格式 描述%% 百分号标记 #就是输出一 ...
- 04-struts2获得参数
1 struts2 获得参数 1-属性驱动获得参数 1 Demo8Action package www.test.c_param; import java.util.Date; import com. ...
- Steamworks and Unity – P2P多人游戏
之前我们讨论过“如何把Steamworks.Net和Unity整合起来”,这是一个很好的开始,现在我们研究深一点,谈一谈Steam中的多人游戏.这不是教程,但是可以指导你在你的游戏中如何使用Steam ...
- tomcat修改jvm内存
内存大小:-Xms256M -Xmx512M -XX:PermSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=512m -Djava.awt.headles ...
- Codeforces 975D. Ghosts
Description 给出一条直线 \(a*x+b\) 上的 \(n\) 个点,每一个点有一个速度 \((v_x,v_y)\),求 \(T=[-oo,oo]\) 相交的次数乘以 \(2\) 题面 S ...
- Nginx下载安装
系统环境:win7 nginx:1.11.4 1.下载Nginx 下载地址:http://nginx.org/en/download.html 2.将压缩包解压到相应位置 3.启动nginx服务,ng ...
- ASP.NET 使用 AjaxPro 实现前端跟后台交互
使用 AjaxPro 进行交互,很多人都写过文章了,为什么还要继续老生常谈呢.因为有一些细节上的东西我们需要注意,因为这些细节如果不注意的话,那么程序会报错,而且维护性较差. 引言 一.首先,还是那句 ...
- Python中变量的本质探索
Python中变量的本质探索 参考:Vamei博客Python进阶09 动态类型 ''' a = [1,2,3] ''' (1)这条"赋值语句"实际上是将a指向对象"[1 ...
- 20_AOP_Advice增强1(前置、后置、环绕)
[增强的类型] 1.前置增强:org.springframework.aop.BeforeAdvice. 由于Spring只支持方法级别的增强,所以MethodBeforeAdvice是目前可用的前置 ...