【VRP】基于matlab改进的模拟退火和遗传算法求解VRP问题【含Matlab源码 343期】

229 阅读3分钟

一、简介

1 模拟退火算法的应用背景
模拟退火算法提出于1982年。Kirkpatrick等人首先意识到固体退火过程与优化问题之间存在着类似性;Metropolis等人对固体在恒定温度下达到热平衡过程的模拟也给他们以启迪。通过把Metropolis 算法引入到优化过程中,最终得到一种对 Metropolis 算法进行迭代的优化算法,这种算法类似固体退火过程,称之为“模拟退火算法”。
模拟退火算法是一种适合求解大规模组合优化问题的随机搜索算法。目前,模拟退火算法在求解 TSP,VLSI 电路设计等组合优化问题上取得了令人满意的结果。将模拟退火算法同其它的计算智能方法相结合,应用到各类复杂系统的建模和优化问题中也得到了越来越多的重视,已经逐渐成为一种重要的发展方向。
2 模拟退火算法介绍
在这里插入图片描述
3
在这里插入图片描述
在这里插入图片描述
3 模拟退火算法的参数
模拟退火是一种优化算法,它本身是不能独立存在的,需要有一个应用场合,其中温度就是模拟退火需要优化的参数,如果它应用到了聚类分析中,那么就是说聚类分析中有某个或者某几个参数需要优化,而这个参数,或者参数集就是温度所代表的。它可以是某项指标,某项关联度,某个距离等等。

二、源代码

clear
clc
filename='input.txt';
[bestRoute,bestL]=SAGA_TSP(filename);
toc
%输入input:               文本文件[序号,x坐标,y坐标]
%输出bestRoute:           全局最优路线
%输出bestL:               全局最优路线对应的路径长度
function [bestRoute,bestL]=SAGA_TSP(filename)
%% 输入数据
input=importdata(filename);
n=size(input,1);                        %n-城市数目
vertexs=input(:,2:3);                   %城市xy坐标
x=vertexs(:,1);                         %x坐标
y=vertexs(:,2);                         %y坐标
h=pdist(vertexs);
dist=squareform(h);                     %距离矩阵
%% 遗传算法参数设置
NIND=50;                                %种群大小
MAXGEN=10;                             %迭代次数
GGAP=0.9;                               %代沟
Pc=0.8;                                 %交叉概率
Pm=0.2;                                 %变异概率
pSwap=0.2;                              %选择交换结构的概率
pReversion=0.5;                         %选择逆转结构的概率
pInsertion=1-pSwap-pReversion;          %选择插入结构的概率
N=n;                                    %染色体长度=城市数目
%% 模拟退火算法参数
MaxOutIter=300;                         %外层循环最大迭代次数
MaxInIter=15;                           %里层循环最大迭代次数
T0=0.025;                               %初始温度
alpha=0.99;                             %冷却因子
%% 种群初始化
Chrom=InitPop(NIND,N);
%% 优化
gen=1;                                  %计数器
bestChrom=Chrom(1,:);                   %初始全局最优个体
bestL=RouteLength(bestChrom,dist);      %初始全局最优个体的总距离
BestChrom=zeros(MAXGEN,N);              %记录每次迭代过程中全局最优个体
BestL=zeros(MAXGEN,1);                  %记录每次迭代过程中全局最优个体的总距离
while gen<=MAXGEN
    %% 计算目标函数值
    ObjV=ObjFunction(Chrom,dist);
    %% 二元锦标赛选择
    SelCh=BinaryTourment_Select(Chrom,GGAP,ObjV);
    %% OX交叉
    SelCh=Recombin(SelCh,Pc);
    %% 变异
    SelCh=Mutate(SelCh,Pm,pSwap,pReversion,pInsertion);
    %% 对种群中前30%的个体都进行模拟退火操作
    SelCh=SA_Chrom(SelCh,dist,MaxOutIter,MaxInIter,T0,alpha,pSwap,pReversion,pInsertion);
    %% 重插入子代的新种群
    Chrom=Reins(Chrom,SelCh,ObjV);
    %% 计算当前代所有个体总距离
    Obj=ObjFunction(Chrom,dist);
    %% 找出当前代中最优个体
    [minObj,minIndex]=min(Obj);
    %% 将当前代中最优个体与全局最优个体进行比较,如果当前代最优个体更好,则将全局最优个体进行替换
    if minObj<=bestL
        bestChrom=Chrom(minIndex,:);
        bestL=minObj;
    end
    %% 记录每一代全局最优个体,及其总距离
    BestChrom(gen,:)=bestChrom;
    BestL(gen,:)=bestL;
    %% 显示外层循环每次迭代的信全局最优路线的总距离
    disp(['第' num2str(gen) '次迭代:全局最优路线总距离 = ' num2str(bestL)]);
    %% 画出每次迭代的全局最优路线图
    figure(1);
    PlotRoute(bestChrom,x,y)
    pause(0.01);
    %% 计数器加1
    gen=gen+1;
end

三、运行结果

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

四、备注

版本:2014a