TSP 遗传算法

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(:,1:2:8); x = x(:);
y = sj0(:,2:2:8); y = y(:);
sj = [x,y];d1 = [70,40];
sj = [d1;sj;d1]; sj = sj*pi/180;
?
d = zeros(102);
?
for i  = 1:101
    for j = i+1:102
        d(i,j) = 6370*acos(cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2)));
    end
end
?
d = d + d‘;
% w 为种群数,g为进化的代数
w = 50;
g = 100;
rand(‘state‘,sum(clock));
?
% 改良圈算法选取初始种群
for k=1:w  %通过改良圈算法选取初始种群
    c=randperm(100); %产生1,...,100的一个全排列
    c1=[1,c+1,102]; %生成初始解
    for t=1:102 %该层循环是修改圈
        flag=0; %修改圈退出标志
        for m=1:100
            for n=m+2:101
                if d(c1(m),c1(n))+d(c1(m+1),c1(n+1))<d(c1(m),c1(m+1))+d(c1(n),c1(n+1))
                    c1(m+1:n)=c1(n:-1:m+1);  flag=1; %修改圈
                end
            end
        end
        if flag==0
            J(k,c1)=1:102; break %记录下较好的解并退出当前层循环
        end
   end
end
?
% 染色体编码
J(:,1) = 0;
J = J/102;
?
% 100次进化
for k = 1:g
    A = J;
    c = randperm(w);
    for i = 1:2:w                       % 基因重组
        F = 2 + floor(100*rand(1));     % 产生交叉操作的染色体对
        tmp = A(c(i),[F:102]);
        A(c(i),[F:102]) = A(c(i+1),[F:102]);
        A(c(i+1),F:102) = tmp;
    end
?
    % 变异
    by = [];
    while ~isempty(by)      % 变异的个体数也是随机的
        by =find(rand(1,w)<0.1);
    end

    B = A(by,:);        % 变异染色体
    for j = 1:length(by)
        bw = sort(2+floor(100*rand(1,3)));      % 产生变异操作的3个地址
        B(j,:) = B(j,[1:bw(1),bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:102]);

    end

    G=[J;A;B];       % 父代和子代
    % 基因翻译为解空间,把染色体翻译成1,...,102的序列ind1
    [SG,ind1] = sort(G,2);
    num = size(G,1);        % 父子种群的总个体数
    long = zeros(1,num);

    % 每一个体的优劣
    for j = 1:num
        for i = 1:101
            long(j) = long(j)+d(ind1(j,i),ind1(j,i+1));
        end
    end

    [slong,ind2] = sort(long);
    J = G(ind2(1:w),:);
end
?
path = ind1(ind2(1),:);
flong = slong(1);
xx = sj(path,1);
yy = sj(path,2);
plot(xx,yy,‘-o‘);

参考:

ACdreamer

司守奎

原文地址:https://www.cnblogs.com/TreeDream/p/8410572.html

时间: 2024-08-30 15:54:04

TSP 遗传算法的相关文章

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

近期为做展示,改写了一个遗传算法求TSP的Java界面版,思路代码和 http://blog.csdn.net/wangqiuyun/article/details/12838903 这篇文章思路是一样的,追加了Java用Graphics画点及画线做路径展示,展示部分做得比較粗糙,须要的拿走,效果图例如以下. 下载地址:http://download.csdn.net/detail/wangqiuyun/7406201 另C#界面版:http://blog.csdn.net/wangqiuyun

遗传算法解决TSP问题

1实验环境 实验环境:CPU [email protected],内存6G,windows7 64位操作系统 实现语言:java (JDK1.8) 实验数据:TSPLIB,TSP采样实例库中的att48数据源 数据地址:http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/tsp/att48.tsp.gz TSPLIB是一个从各种来源和各种类型中产生的TSP及其相关问题的采样实例库,这里选取TSP采样实例库中的att48数据源,最优值为106

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

上篇我们用遗传算法求解了方程,其中用到的编码方式是二进制的编码,实现起来相对简单很多, 就连交配和变异等操作也是比较简单,但是对于TSP问题,就稍微复杂一点,需要有一定的策略, 才能较好的实现. 这次的TSP问题的题目是: 随机产生10~30个城市,每个城市之间的距离也是随机产生,距离的范围是[1,50],求最优的路径 ========================================================== 下面就是具体的求解,由于我的策略是基于知网上的<一种改进的遗

遗传算法求解TSP问题

遗传算法是一种启发式搜索,属于进化算法的一种.它最初是人们根据自然界对物种的自然选择和遗传规律而设计的.它模拟自然界物种的自然选择.遗传和变异等,对一个种群的基因进行改良. 遗传算法需要设置交叉概率.变异概率和迭代次数等参数,且算法的收敛性受其参数设置影响较大. 遗传算法中把每一个候选解看做是一个个体,个体组成的集合看作是一个种群.遗传算法通过对每个解进行二进制编码把每个解转化为0-1字符串,其中每一个位叫做一个基因.不同基因的组合构成的个体的表现型也不同.它从一个初始种群开始,经过N次迭代最终

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

上一次我们使用遗传算法求解了一个较为复杂的多元非线性函数的极值问题,也基本了解了遗传算法的实现基本步骤.这一次,我再以经典的TSP问题为例,更加深入地说明遗传算法中选择.交叉.变异等核心步骤的实现.而且这一次解决的是离散型问题,上一次解决的是连续型问题,刚好形成对照. 首先介绍一下TSP问题.TSP(traveling salesman problem,旅行商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问题规模的增大按指数方式增长,到目前为止还没有找到一个多项式时间的有效算法.TS

tsp问题——遗传算法解决

TSP问题最简单的求解方法是枚举法.它的解是多维的.多局部极值的.趋于无穷大的复杂解的空间,搜索空间是n个点的所有排列的集合,大小为(n-1)!.可以形象地把解空间看成是一个无穷大的丘陵地带,各山峰或山谷的高度即是问题的极值.求解TSP,则是在此不能穷尽的丘陵地带中攀登以达到山顶或谷底的过程. 这一篇将用遗传算法解决TSP问题. 1)评价.这个评价算法应该比较简单了,就是找计算总距离,小的为优.目标函数转化为适应度函数可以取倒数. 2)突变.为了防止重复访问,不能随机的进行突变.因为每个城市只能

用遗传算法解决TSP问题

浅谈遗传算法:https://www.cnblogs.com/AKMer/p/9479890.html Description \(mzf\)在踏上寻找\(oxy\)的路程之后不小心碰到了大魔王\(fater\). 大魔王看了看\(mzf\)的命运,心生怜悯,便给\(mzf\)和自己做一个交换的机会. 这个交换是这样的: 由于\(oxy\)不知在天涯海角,\(mzf\)的要找到实在是太难了.所以大魔王愿意把\(mzf\)和\(oxy\)同时扔到一个迷宫(\(n\)个点的完全无向图)里,但是\(o

遗传算法求解TSP源码及解析

1.算法效果 图 1?1算法效果1 图 1?2算法效果2 2.原理说明 TSP问题是指假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市.路径的选择目标是要求得的路径路程为所有路径之中的最小值.本文使用遗传算法解决att30问题,即30个城市的旅行商问题. 旅行商问题是一个经典的组合优化问题.一个经典的旅行商问题可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地.应如何选择

遗传算法(三)—— 旅行商问题TSP

遗传算法 (GA) 算法最主要的就是我们要想明白什么是他的 DNA 和怎么样对个体进行评估 (他们的 Fitness). Fitness和DNA 这次的编码 DNA 方式又不一样, 我们可以尝试对每一个城市有一个 ID, 那经历的城市顺序就是按 ID 排序咯. 比如说商人要经过3个城市, 我们就有 0-1-2 0-2-1 1-0-2 1-2-0 2-0-1 2-1-0 这6种排列方式. 每一种排列方式我们就能把它当做一种 DNA 序列, 用 numpy 产生这种 DNA 序列的方式很简单. >>