基于遗传算法的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)

相关推荐

  • Python字典获取(Get)操作的实现方法

    Python字典获取(Get)操作的实现方法Python字典是一种存储键值对的无序集合,可以通过键来访问对应的值。字典中的键必须是不可变的(不可改变的对象),如字符串、数字、元组等,而值可以是任意对象。

    2023-12-10
    112
  • mysql怎么过滤重复数据_MySQL常用命令

    mysql怎么过滤重复数据_MySQL常用命令 一、过滤复制 什么是过滤复制 # 出现原因 让从节点仅仅复制指定的数据库,或指定数据库的指定数据表。主服务器有10个数据库,而从节点只需要同步其中的一两个数据库。这个时候就需要复制过滤。 复…

    2023-03-27
    157
  • vue3国际化_jsp能用vue吗

    vue3国际化_jsp能用vue吗当切换语言设置的时候,可以自动切换整个项目的文字显示。 发现Vue项目中有对应的组件vue-i18n,而且对项目的代码修改不大,于是就使用了这个组件去修改项目中的代码。 一般一个项目中使用都是通过安装包的方式去运行的,script引入的较少。 还有一些其他的用法,具体的请参…

    2023-07-19
    142
  • windows启动 MySQL出错「建议收藏」

    windows启动 MySQL出错「建议收藏」C:Program Filesmysql-5.7.10-winx64in># 启动mysql服务net start mysql# 停止mysql服务net stop mysql 提示信息

    2023-02-22
    155
  • Python Scipy:高效科学计算利器

    Python Scipy:高效科学计算利器Python 是一种高级编程语言,具有简单易学的语法、卓越的可读性和高效的代码执行性能,成为广大开发者和科学家所钟爱的一门编程语言。在 Python 生态系统中,Scipy 是一种广受欢迎的科学计算库,用于数据分析、机器学习、信号处理、图像处理、计算几何和优化等领域。

    2024-07-23
    37
  • 基于 Hi3861 平台的 HarmonyOS Device 开发体验–环境搭建篇「建议收藏」

    基于 Hi3861 平台的 HarmonyOS Device 开发体验–环境搭建篇「建议收藏」编程界有个传承了几十年的”规矩“入门先从环境搭建开始,有的时候环境搭建比较简单,比如学习 HTML 编程,有浏览器就行;有时候又比较繁琐,比如 React Native 开发,需要安装 NodeJS、Python、Java、Android SDK……而 HarmonyOS …

    2023-08-01
    103
  • MySQL日志简介「建议收藏」

    MySQL日志简介「建议收藏」一.MySQL日志简介 二.错误日志 作用: 记录mysql数据库的一般状态信息及报错信息,是我们对于数据库常规报错处理的常用日志。 默认位置: $MYSQL_HOME/data/ 开启方式: (My

    2022-12-18
    138
  • Redis 的基本数据类型 和 基础应用场景「建议收藏」

    Redis 的基本数据类型 和 基础应用场景「建议收藏」1. 获取中奖用户ID,随机弹出之后集合中就不存在了【set】
    2. 存储活动中中奖的用户ID,保证同一个用户不会中奖两次【set】
    3. 存储粉丝列表,value 为粉丝的用户ID,score 是关

    2023-03-16
    153

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注