• 【GA TSP】基于matlab遗传算法求解旅行商问题【含Matlab源码 1909期】


    一、获取代码方式

    获取代码方式1:
    完整代码已上传我的资源:【GA TSP】基于matlab遗传算法求解旅行商问题【含Matlab源码 1909期】

    获取代码方式2:
    通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

    备注:
    订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

    二、TSP简介

    旅行商问题是优化组合问题研究中一个著名而经典的问题, 它的研究价值也就不言而喻。在实际问题里, 一个大家都熟知的例子就是利用机器给电路板钻孔的优化设计问题。此外旅行商问题的实际应用还体现在交通管理规划方面。交通管理的主要的目的是在复杂的地理网络结构中优化决定车辆的线路来减少交通费用。旅行商问题的应用例子还包括:设计安全, 合理, 有效率的交通网, 从而减少交通拥堵;如何来规划出更好地物流线路, 缩小运营界产生的成本, 减少资源消耗等。

    由于旅行商问题具有这么重要的实际意义, 求解旅行商问题算法也就随之发展起来。最早的解决方法是线性规划, 后来陆续产生了多种求解旅行商问题的算法。其中大致可以分为精确算法, 近似算法, 智能算法。精确算法:线性规划, 动态规划, 分支定界;近似算法包括:插入法, Clark&Wright算法, 生成树算法, 最近邻算法, 概率算法等。近年来也出现了许多新的智能算法。像诸如模拟退火, 蚁群算法以及遗传算法等等。

    本文首先介绍了什么是旅行商问题, 然后简单介绍了目前解决旅行商问题所用到的一些算法。之后详细介绍了什么是遗传算法, 遗传算法的实现原理, 以及遗传算法的构成。然后利用常用的MATLAB软件, 使用遗传算法解决了几个实际问题。

    1 旅行商问题
    1.1 问题描述

    旅行商问题, 也叫货郎担问题, 目的是求解最优线路, 是一类经典的规划类问题。旅行商问题是指, 一个旅行商, 要去往n个不同的城市, 需要每个城市都去, 并且仅仅去一次, 再回到最初的城市, 形成一个环路, 从众多可能路径中求解出一个最短的路径。

    1.2 数学模型
    旅行商问题的数学模型为:假设有n个 (n为有限正自然数) 城市集合C={1, 2, …, i, j, …, n};其中两城市间的距离为dij∈Z+, 其中的i, j∈C (1≤i, j≤n) ;求解一个城市的序列I (1) , I (2) , …, I (n) 使得使得从一个城市出发, 遍历所有城市后又回到原城市的总路程最小时的。 (这里的I (1) , I (2) , …, I (n) 是城市序号1, 2, …, n的一个全排列。)

    根据上面的分析, 可以得到的数学模型为:
    在这里插入图片描述
    我们将xij设定为决策变量。没有直接从城市i到达城市j的路线, 我们将其赋值为xij=0。如果商人直接从城市i到达城市j, 我们用xij=1来表示。我们在上述模型得到的5个式子中, 第一个式子保障了路径之和最小, 第二个和第三个式子分别保障从某个城市出来和进入都只是一次。而第四个式子则保障了走过的所有路径都没有回路。其中∣C∣表示集合C中元素个数。

    2 算例分析
    2.1 问题描述

    一个旅行商人要从某一个城市出发, 经过所有的城市, 并且每个城市只能走一次。最终回到出发的城市, 求解一个最短路径。设有15个城市, 已知它们的地理坐标分别为:

    a=[2200, 2378;3267, 2908;2890, 1109;4490, 3830;1100, 2200;3456, 4509;2345, 4567;1219, 4347;3425, 3908;1237, 5908;4409, 1299;4321, 2209;7980, 4350;5566, 4433;6742, 5534]

    2.2 问题分析

    1. 编码方式。我们这里使用十进制编码方式。把旅行商途经的城市的顺序序号作为遗传算法的编码。假设15个城市的序号为{1, 2, …, 15}, 那么它的任意一个全排列{i1, i2, …, i15}就是一个数据编码, 表示一个染色体, 每个染色体就代表一个解, 不同解是靠染色体上不同的基因i决定的。

    2. 适应度函数。由于旅行商问题的规划模型的目标函数是要求解最小值, 所以适应度函数就用路径的总长度的倒数来表示。这样, 符合了遗传算法的优胜略汰的搜索策略。

    3. 初始群体的产生。随机生产一个大小为N且每条染色体上的基因长度都是的n初始种群, 作为第一代个体。
      在这里插入图片描述

    4. 交叉过程。首先设定交叉概率pc=0.9。其次, 根据这一概率, 选出要进行交叉操作的个体, 并将它们两两配对。然后在染色体上1~n-1个基因编号之间随机地选出两个, 之间的基因作为接下来将要进行交叉的对象。

    5. 变异过程。进行完交叉操作后, 以变异概率pm=0.2从群体中选出要进行变异的遗传个体。然后, 随机地从1~n-1之间选择两个数作为变异点, 将基因进行交换。

    6. 复制操作。复制过程就是将适应度值打的个体直接复制到下一代, 从而不至于丢掉性质较优的解。

    三、部分源代码

    clear all;
    clc;
    close all;
    
    fprintf('let start my work\r\n');
    
    %  globle prarm define here
    % never change it
    First = 1;              % macro define
    X = 1;                  % macro define
    Y = 2;                  % macro define
    Best = 1000000;
    
    % change what you want
    CityNum = 50;           % city number
    Size = 100;             % population size 
    Generation = 999;       % target generation num
    CrossRate = 0.3;        % rate of cross
    InsertRate = 0.12;
    MutationRate = 0.025;    % rate of mutation
    CROSS_MODE = 3;         % macro define     
    
    % init the matrix 
    BestWay = zeros(1,CityNum);              % set he bestway as zero 
    Time = zeros(Generation,1);              % set the time
    MinDistance = zeros(Generation,1);       % use for recording data
    MaxDistance = zeros(Generation,1);       % use for recording data
    Map = 100 * rand(CityNum,X + Y);         % asix init 0-100 and set the
    DistanceMap = zeros(CityNum,CityNum);    % init the default distance 
    Population = zeros(Size,CityNum);        % each body have difference serial numbers
    Fitness = zeros(Size,1);                 % init the fitness as the default
    Distance = zeros(Size,1);                % init the list M * 1 
    PopulationTemp = zeros(Size,CityNum);    % as a temp for new population
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    四、运行结果

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    五、matlab版本及参考文献

    1 matlab版本
    2014a

    2 参考文献
    [1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
    [2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
    [3]程荣.遗传算法求解旅行商问题[J].科技风. 2017,(16)

    3 备注
    简介此部分摘自互联网,仅供参考,若侵权,联系删除

  • 相关阅读:
    [Python] 字典操作及方法总结
    数学建模学习笔记(9):主成分分析法
    【OpenGL】OpenGL Examples
    蓝桥杯:合根植物
    面试官: AMS在Android起到什么作用,简单的分析下Android的源码
    外贸业务管理有效方法汇总
    无痛迁移:图解 Kubernetes 集群升级步骤
    bbs项02
    云服务器部署Neo4j
    SpringBoot和SpringCloud版本对应
  • 原文地址:https://blog.csdn.net/TIQCmatlab/article/details/125432875