GA——遗传算法

同模拟退火算法一样,都是现代优化算法之一。模拟退火是在一定接受程度的情况下仍然接受一个比较差的解。

遗传算法,是真真正正的和大自然的遗传进化有着非常紧密的联系的,当然遗传进化的只是在生物学中已经讲过了,8个字,物竞天择,适者生存。

  • 简介

《物种起源》,有兴趣可以看看达尔文的著作。

物竞天择,适者生存,这两句话,也可以说是对遗传算法过程的伪代码描述了,物竞天择,就是我们的目标函数,只有越满足我们的目标函数的个体才会留下来,适者生存,就是我们在算法的过程中要淘汰一些个体。

  • 基因编码方式

生物学里面告诉我们,遗传,变异都是以种群为研究对象的,怎么表示一个解呢?用他的基因表示,嘿嘿,组成这个解的步骤表示,第一步干什么,第二步干什么,怎么在程序中编码呢?

常用两种编码方式:二进制编码,浮点数编码。

二进制编码:一定精度的二进制只能表示一定精度的浮点数。栗子,要求精确到6位小数,而区间是 [-1,2],至少要把区间划分为3*10^6等分。编码也就需要22位。这里就涉及到一个二进制串转换到一个区间为 [-1,2] 的实数,两者相互转换。比如得到的十进制数为 x,那么对应的 [-1,2] 区间的浮点数就是

 

浮点数编码:为改善遗传算法的复杂度,提出来浮点数编码

  • 适应评分及选择函数

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

So,遗传算法中的自然选择过程:

适应评分函数——求出各个体的适应评分值

轮盘选择——个体被选择的概率

  • 基因重组与基因突变

在生物学中,基因重组有两种情况。

基因重组,就是两个个体基因发生交换。

基因突变是一种小概率事件。

使得一个基因变成他的等位基因,引起一定的表现型变化。

  • TSP问题求解

TSP问题,之前已经用费用流,和模拟退火做过了,现在用遗传来讨论。

程序过程和自然界中的遗传与进化是一样的。

  1. 生成50个个体,形成种群,并基因编码。

  2. 基因重组,突变,和父代,一起进行天择。

  3. 重复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 遗传算法的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 遗传算法解决TSP问题

    1实验环境 实验环境:CPU i5-2450M@2.50GHz,内存6G,windows7 64位操作系统 实现语言:java (JDK1.8) 实验数据:TSPLIB,TSP采样实例库中的att48 ...

  8. 用遗传算法解决TSP问题

    浅谈遗传算法:https://www.cnblogs.com/AKMer/p/9479890.html Description \(小m\)在踏上寻找\(小o\)的路程之后不小心碰到了大魔王\(fat ...

  9. 遗传算法求解TSP问题

    package com.louis.tsp; /** * Project Name:GeneticAlgorithm * File Name:Individual.java * Package Nam ...

随机推荐

  1. PIE SDK栅格生成等值线、面

      1.算法功能简介 等值线图能直观地展示数据的变化趋势,是众多领域展示成果的重要图建之一,被广泛应用于石油勘探.矿物开采.气象预报等众多领域.等值线的绘制是指从大量采样数据中提取出具有相同值的点的信 ...

  2. Vue.js插槽slot和作用域插槽slot-scope学习小结

    一般来说,在Vue项目中使用父子组建时,都是把通用的HTML结构提取出来写成一个子组件,需要动态展示的数据用过prop属性传递,不过有时候我们可能想给子组件传递一个HTML代码,这个时候用prop不太 ...

  3. linux无敌权限之chattr

    chattr 修改文件或者目录的文件属性,添加超级权限 -R 递归修改文件机子目录 -V 显示详细修改的内容 + 在原有的基础上追加参数 — 减参数 = 跟新为指定参数 a append 设定改参数后 ...

  4. vue之理解异步更新 --- nextTick

    默认情况下,vue中DOM的更新是异步执行的,理解这一点非常重要. 当侦测到数据变化时,Vue会打开一个队列,然后把在同一个事件循环(event loop)当中观察到的数据变化的watcher推送进入 ...

  5. kafka配置文件中参数的限制

    在kafka的优化过程中,不断的调节配置文件中的参数,但是有时候会遇到java.lang.NumberFormatException这样的错误 比如socket.receive.buffer.byte ...

  6. TOJ 2452 Ultra-QuickSort

    描述 In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a se ...

  7. 网站加入QQ聊天链接

    有时候我们的网站需要加入客服聊天功能,实现方式各不相同同,对于流量不大的网站,可以加入qq聊天的链接,点击链接,会打开本地qq的聊天窗口, 和指定的人会话.实现方式很简单,就是一个<a>标 ...

  8. pat1006. Sign In and Sign Out (25)

    1006. Sign In and Sign Out (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  9. HDU 5313——Bipartite Graph——————【二分图+dp+bitset优化】

    Bipartite Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  10. K&R C风格函数

    前些天在看getopt源码, 一种前所未见的函数定义方法 int getopt(nargc, nargv, ostr) int nargc; char * const nargv[]; const c ...