基于遗传算法的tsp算法_遗传算法的三个步骤

基于遗传算法的tsp算法_遗传算法的三个步骤(1).算法流程(2).(1).种群初始化(2).适应度函数(3).选择操作(4).交叉操作(5).变异操作(6).进化逆转操作(7).画路线轨迹图(8).遗传算法主函数(9).1. 使用精英策略2. 本案例以14个城市为例,假定14个城市的位置坐标如表1所列。寻找出一条最短的遍…

文章目录

  • 一、理论基础
  • 二、案例背景
    • 1,问题描述
    • 2,解决思路和步骤
      • (1).算法流程
      • (2).遗传算法实现
  • 三、MATLAB程序实现
    • (1).种群初始化
    • (2).适应度函数
    • (3).选择操作
    • (4).交叉操作
    • (5).变异操作
    • (6).进化逆转操作
    • (7).画路线轨迹图
    • (8).遗传算法主函数
    • (9).结果分析
  • 四、遗传算法的改进
    • 1. 使用精英策略
    • 2. 使用进化逆转操作
  • 五、算法的局限性
  • 六、参考文献

一、理论基础

基于遗传算法的tsp算法_遗传算法的三个步骤

二、案例背景

1,问题描述

本案例以14个城市为例,假定14个城市的位置坐标如表1所列。寻找出一条最短的遍历14个城市的路径。

表1 14个城市的位置坐标

在这里插入图片描述

2,解决思路和步骤

(1).算法流程

遗传算法TSP问题的流程图如图1所示。

图1 遗传算法TSP问题求解的流程图

在这里插入图片描述

(2).遗传算法实现

基于遗传算法的tsp算法_遗传算法的三个步骤

基于遗传算法的tsp算法_遗传算法的三个步骤

基于遗传算法的tsp算法_遗传算法的三个步骤

三、MATLAB程序实现

(1).种群初始化

种群初始化函数InitPop的代码:

function Chrom = InitPop(NIND,N)
%% 初始化种群
% 输入:
% NIND:种群大小
% N: 个体染色体长度(这里为城市的个数) 
% 输出:
% 初始种群
Chrom = zeros(NIND, N);         % 用于存储种群
for i = 1:NIND
    Chrom(i, :) = randperm(N);    % 随机生成初始种群
end

(2).适应度函数

求种群个体的适应度函数Fitness的代码:

function FitnV = Fitness(len)
%% 适应度函数 
% 输入:
% 个体的长度(TSP的距离)
% 输出:
% 个体的适应度值
FitnV = 1./len;
clear
clc
close all
load CityPosition1.mat
%% 初始化参数
NIND = 100; % 种群大小
MAXGEN = 200; % 最大遗传代数
Pc = 0.9; % 交叉概率
Pm = 0.05; % 变异概率
GGAP = 0.9; % 代沟(Generation gap)
D = Distance(X); % 生成距离矩阵
N = size(D, 1); % (14*14)
%% 初始化种群
Chrom = InitPop(NIND, N);
%% 在二维图上画出所有坐标点
% figure
% plot(X(:,1),X(:,2),'o');
%% 画出随机解的路线图
DrawPath(Chrom(1,:), X)
%% 输出随机解的路线和总距离
disp('初始种群中的一个随机值:')
OutputPath(Chrom(1,:));
Rlength = PathLength(D,Chrom(1,:));
disp(['总距离:', num2str(Rlength)]);
disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%% 优化
gen = 0;
figure;
hold on; box on
xlim([0,MAXGEN])
title('优化过程')
xlabel('代数')
ylabel('最优值')
ObjV = PathLength(D,Chrom); %计算路线长度
preObjV = min(ObjV);
while gen < MAXGEN
    %% 计算适应度
    ObjV = PathLength(D,Chrom); % 计算路线长度
    % fprintf('%d   %1.10f\n',gen,min(ObjV))
    line([gen-1, gen], [preObjV, min(ObjV)]);
    preObjV = min(ObjV);
    FitnV = Fitness(ObjV);
    %% 选择
    SelCh = Select(Chrom,FitnV,GGAP);
    %% 交叉操作
    SelCh = Recombin(SelCh,Pc);
    %% 变异
    SelCh = Mutate(SelCh,Pm);
    %% 进化逆转操作
    SelCh = Reverse(SelCh,D);
    %% 重插入子代的新种群
    Chrom = Reins(Chrom,SelCh,ObjV);
    %% 更新迭代次数
    gen = gen+1 ;
end
%% 画出最优解的路线图
ObjV = PathLength(D,Chrom); %计算路线长度
[minObjV, minInd] = min(ObjV);
DrawPath(Chrom(minInd(1), :), X)
%% 输出最优解的路线和总距离
disp('最优解:')
p = OutputPath(Chrom(minInd(1), :));
disp(['总距离:', num2str(ObjV(minInd(1)))]);
disp('-------------------------------------------------------------')

结果分析

优化前的一个随机路线轨迹图如图2所示。

图2 随机路线图

在这里插入图片描述

初始种群中的一个随机值:
10—>4—>8—>11—>9—>13—>3—>12—>14—>6—>1—>5—>2—>7—>10
总距离:70.3719
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

优化后的路线图如图3所示。

图3 最优解路线图

在这里插入图片描述

最优解:
5—>4—>3—>14—>2—>1—>10—>9—>11—>8—>13—>7—>12—>6—>5
总距离:29.3405 -------------------------------------------------------------

优化迭代图如图4所示。
在这里插入图片描述基于遗传算法的tsp算法_遗传算法的三个步骤

图4 遗传算法进化过程图

由优化图可以看出,优化前后路径长度得到很大改进,接近40代以后路径长度已经保持不变了,可以认为是最优解了,总距离由优化前的70.3719变为29.3405,减为原来的41.7%。

具体细节可参考:
链接:pan.baidu.com/s/16vnho_Uf…
提取码:shgr

四、遗传算法的改进

上述程序中,对遗传算法做了以下两处改进。

1. 使用精英策略

子代种群中的最优个体永远不会比父代最优的个体差,这样使得父代的好的个体不至于由于交叉或者变异操作而丢失。

2. 使用进化逆转操作

同交叉算子相比较,逆转算子能使子代继承亲代的较多信息。

五、算法的局限性

当问题规模n nn比较小时,得到的一般都是最优解;当规模比较大时,一般只能得到近似解。这时可以通过增大种群大小和增加最大遗传代数使得优化值更接近最优解。

代码下载或者仿真咨询添加QQ1575304183

六、参考文献

[1] 储理才. 基于MATLAB的遗传算法程序设计及TSP问题求解[J]. 集美大学学报:自然科学版, 2001.
[2] 郁磊等. MATLAB智能算法30个案例分析(第2版)[M].北京航空航天大学出版社.2015年.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13852.html

(0)

相关推荐

  • csv和excel读取和下载「建议收藏」

    csv和excel读取和下载「建议收藏」同时,使用FileReader对象,web应用程序可以异步的读取存储在用户计算机上的文件(或者原始数据缓冲)内容,可以使用File对象或者Blob对象来指定所要处理的文件或数据。FileReader 提供了如下 几个方法。 readAsText(file,encoding):以…

    2023-03-02
    140
  • hive orc文件_ora是什么文件

    hive orc文件_ora是什么文件ORC文件是以二进制的方式存储的,不可以直接读取,但由于ORC的自描述特性,其读写不依赖于 Hive Metastore 或任何其他外部元数据。本身存储了文件数据、数据类型及编码信息。因为文件是自包含

    2023-06-02
    143
  • 数控车床G代码大全_数控车床常用g代码详解

    数控车床G代码大全_数控车床常用g代码详解

    2022-12-14
    219
  • Python实现Excel合并单元格功能

    Python实现Excel合并单元格功能在Excel操作中,很多时候需要对表格进行整理和排版等处理,而合并单元格就是其中一个比较常用的功能。而在Python中,也可以通过调用相关的库实现Excel合并单元格的功能。本文将通过介绍Python中实现Excel合并单元格功能的方法及相关代码示例,帮助读者更好地掌握这个知识点。

    2024-09-04
    10
  • SD nand 与 SD卡的SPI模式驱动「终于解决」

    SD nand 与 SD卡的SPI模式驱动「终于解决」在发送ACMD命令之前必须发送特定的CMD命令表明接下来的一帧命令是ACMD命令,在SD协议种规定此特定命令名称叫APP_CMD,也就是CMD5

    2023-07-02
    130
  • mybatis是如何防止SQL注入的(转)

    mybatis是如何防止SQL注入的(转)1、首先看一下下面两个sql语句的区别: