【TWVRP】基于matlab遗传算法和模拟退火求解带时间窗自行车调度问题【含Matlab源码 370期】

695 阅读3分钟

一、简介

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

二、源代码

%%遗传算法求解vrp问题(为选择操作从新设计后程序)
%D是距离矩阵,n为种群个数
%C为停止代数,遗传到第 C代时程序停止,C的具体取值视问题的规模和耗费的时间而定
%m为适配值淘汰加速指数,最好取为1,2,3,4,不宜太大
%交叉概率Pc,变异概率Pm
%R为最短路径,Rlength为路径长度
function VRP
t0=cputime;%计时开始
%初始化
mytimewindows;
coor;
mydemand;
% demand=[0 1 -2 1 2 -1 4 -2 2];
distance;
% D=[ 0 4 6 7.5 9 20 10 16 8;
%     4 0 6.5 4 10 5 7.5 11 10;
%     6 6.5 0 7.5 10 10 7.5 7.5 7.5;
%     7.5 4 7.5 0 10 5 9 9 15;
%     9 10 10 10 0 10 7.5 7.5 10;
%     20 5 10 5 10 0 7 7 7.5;
%     10 7.5 7.5 9 7.5 7 0 0 10;
%     16 11 7.5 9 7.5 9 7 10 10;
%     8 10 7.5 15 10 7.5 10 10 0];

popsize=70;
capacity = 25;
%经验公式m=[Σgi /aq]+1,粗求车辆数
a = 0.8;   %【3】
k1 = round((sum(abs(demand))./(a*capacity))+1)-1;    %最小车辆数
k2 = round((sum(abs(demand))./(a*capacity))+1)+1;    %最大车辆数
original = 15;
C=200;
Pc=0.9;
Pm=0.2;

[n,nn] = size(D);
minvalue = 100000;
for k = k1:k2 %每种车辆数做一次寻优
    tempR = zeros(1,n+k);
    R = zeros(1,n+k);
    [tempR,tempvalue] = Run_VRP(D,demand,popsize,timewindows,k,capacity,original,C,Pc,Pm);%运算返回最优路径R和其总距离Rlength
    if tempvalue*k < minvalue
        minvalue = tempvalue;
        R = tempR;
        minvehicle = k;
    end
    function [R,minvalue]=Run_VRP(D,demand,popsize,timewindows,k,capacity,original,C,Pc,Pm)
%RUN_VRP Summary of this function goes here
%   Detailed explanation goes here

[N,NN]=size(D);%(31*31) %N是节点数
N = N - 1;
farm = zeros(popsize,N+k+1);
farm=inatialize(popsize,N,k);
R=farm(1,:);%一个随机解(个体)->用来存放最优解(最短路径)
evalue=zeros(popsize,1);%存储路径长度
alph = 0.9; %退火衰减系数
counter=0;

while counter < C
    for i = 1:popsize
        evalue(i,1) = myEvalue(D,farm(i,:),k,capacity,original,timewindows,demand); %计算目标函数
    end
    minvalue=min(evalue);%找到当前最优解
    coor=find(evalue==minvalue);%返回的是在len中路径最短的路径坐标(i,1)
    R=farm(coor(1,1),:);%更新最优解
    if counter == 0 %计算初始退火温度
        t = temp_inatial(evalue,popsize);
    end
    farm = select(farm,evalue,popsize,k,D,capacity,original,timewindows,demand,t);%模拟退火+轮盘赌->选择
    farm = crossover(farm,N,k,popsize,Pc);
    farm = variation(farm,N,k,popsize,Pm);
    for i = 1:popsize
        evalue(i,1) = myEvalue(D,farm(i,:),k,capacity,original,timewindows,demand); %计算目标函数
    end

三、运行结果

在这里插入图片描述

四、备注

版本:2014a