精华内容
下载资源
问答
  • 很好的基于遗传算法的多旅行商问题matlab代码
  • 【路径规划】基于遗传算法求解多旅行商问题matlab
  • 【TSP问题】基于遗传算法求解多旅行商问题matlab源码含GUI.md
  • 寻求多旅行商问题matlab代码很棒的星星 我的GitHub明星精选清单! 产生者 :house: 内容 动作脚本 名称 描述 作者 星星 1个 VVVVVV的源代码! 特里·卡瓦纳(TerryCavanagh) 6028 2个 申请开源Flash和Shockwave规范 ...
  • 寻求多旅行商问题matlab代码 Awesome Stars A curated list of my GitHub stars! Generated by :house: Contents Agda Name Description Author Stars 1 Lecture notes on univalent foundations of mathematics ...
  • 寻求多旅行商问题matlab代码约翰·伯卡德(John Burkardt)的许多Fortran 90代码分类 聚类分析。 组合,特征值,图形算法,图形,内插和逼近,线性代数,线性方程,非线性方程和非线性最小二乘,非均匀随机数生成,...
  • 经过计算机验证,很好用。 function varargout = mtsp_ga(xy,dmat,salesmen,min_tour,pop_size,num_iter,show_prog,show_res)
  • 旅行商问题matlab实现

    2020-04-27 16:05:40
    旅行商问题matlab实现
  • 旅行商问题matlab程序

    2018-09-11 21:12:19
    使用matlab编程实现的遗传算法,解决旅行商问题。。。。
  • 多旅行商问题Matlab程序,数学建模竞赛时可能会用到
  • 各种遗传算法解决旅行商问题matlab代码大合集,其中英文注释5种方法,中文注释一种方法。
  • Matlab多旅行商实验

    2018-04-17 11:41:33
    Matlab多旅行商实验 Matlab多旅行商实验 Matlab多旅行商实验
  • 复制来的,浏览器关掉之后找不到原文链接了,非常抱歉。... %初始温度 乘上n是考虑城市越迭代次数应该越?iter=100; %内部蒙特卡洛循环迭代次数%随机初始化城市坐标city=struct([]);for i=1:nci...

    复制来的,浏览器关掉之后找不到原文链接了,非常抱歉。例子非常的简单,很容易理解。

    clear;

    clc;

    n=200; %城市个数

    temperature=120*n; %初始温度 乘上n是考虑城市越多迭代次数应该越多?

    iter=100; %内部蒙特卡洛循环迭代次数

    %随机初始化城市坐标

    city=struct([]);

    for i=1:n

    city(i).x=floor(1+100*rand());

    city(i).y=floor(1+100*rand());

    end

    l=1; %统计迭代次数

    len(l)=computer_tour(city,n); %每次迭代后的路线长度

    netplot(city,n); %初始旅行路线

    while temperature>0.001 %停止迭代温度

    for i=1:iter %多次迭代扰动,一种蒙特卡洛方法,温度降低之前多次实验

    len1=computer_tour(city,n); %计算原路线总距离

    tmp_city=perturb_tour(city,n); %产生随机扰动

    len2=computer_tour(tmp_city,n); %计算新路线总距离

    delta_e=len2-len1; %新老距离的差值,相当于能量

    if delta_e<0 %新路线好于旧路线,用新路线代替旧路线

    city=tmp_city; %???结构体可以直接相等复制吗

    else %温度越低,越不太可能接受新解;新老距离差值越大,越不太可能接受新解

    if exp(-delta_e/temperature)>rand() %以概率选择是否接受新解

    city=tmp_city; %可能得到较差的解

    end

    end

    end

    l=l+1;

    len(l)=computer_tour(city,n); %计算新路线距离

    temperature=temperature*0.99; %温度不断下降

    end

    figure;

    netplot(city,n); %最终旅行路线

    figure;

    plot(len)

    function len=computer_tour(city,n) %计算路线总长度,每个城市只计算和下家城市之间的距离。

    len=0;

    for i=1:n-1

    len=len+sqrt((city(i).x-city(i+1).x)^2+(city(i).y-city(i+1).y)^2);

    end

    len=len+sqrt((city(n).x-city(1).x)^2+(city(n).y-city(1).y)^2);

    end

    function city=perturb_tour(city,n)

    %随机置换两个不同的城市的坐标

    %产生随机扰动

    p1=floor(1+n*rand());

    p2=floor(1+n*rand());

    while p1==p2

    p1=floor(1+n*rand());

    p2=floor(1+n*rand());

    end

    tmp=city(p1);

    city(p1)=city(p2);

    city(p2)=tmp;

    end

    function netplot(city,n) %连线各城市,将路线画出来

    hold on;

    for i=1:n-1

    plot(city(i).x,city(i).y,'r*');

    line([city(i).x city(i+1).x],[city(i).y city(i+1).y]); %只连线当前城市和下家城市

    end

    plot(city(n).x,city(n).y,'r*');

    line([city(n).x city(1).x],[city(n).y city(1).y]); %最后一家城市连线第一家城市

    hold off;

    end

    93a5fcac822e

    初始旅行路线

    93a5fcac822e

    最终路线

    93a5fcac822e

    随着迭代次数路线总长的变化

    展开全文
  • 201801最近邻法与模拟退火算法求解TSP旅行商问题Matlab程序.pdf
  • 遗传算法解决5种多旅行商问题(mtsp)的matlab程序 从不同起点出发回到起点(固定旅行商数量) 从不同起点出发回到起点(旅行商数量根据计算可变) 从同一起点出发回到起点 从同一起点出发不会到起点
  • 使用蚁群算法解决旅行商问题,求路径最短问题
  • 遗传算法 求解旅行商 TSP 问题matlab代码

    万次阅读 多人点赞 2016-11-02 01:24:11
    学习启发式算法时,旅行商问题是一个经典的例子。其中,遗传算法可以用来求解该问题。遗传算法是一种进化算法,由于其启发式算法的属性,并不能保证得到最优解。求解效果与初始种群选取,编码方法,选择方法,交叉...

    学习启发式算法时,旅行商问题是一个经典的例子。其中,遗传算法可以用来求解该问题。遗传算法是一种进化算法,由于其启发式算法的属性,并不能保证得到最优解。求解效果与初始种群选取,编码方法,选择方法,交叉变异规则有关。

    上课时,老师不知从哪里找了一个非常粗糙的程序,自己将不少错误修正,增加了一些注释方便理解,并增加了一些代码使程序更完美。该代码可以动态显示每一代的路线,非常直观! (备注:对于一般的 TSP 问题,发现通过将其构造成整数规划问题,利用数学规划求解软件 Gurobi 中的 Callback 方法求解,即使大规模问题 (75 个城市)也可以在 1 秒钟内得到最优解。就没必要用启发式算法了。参看网址:https://www.gurobi.com/resource/traveling-salesman-problem/ )

    本程序的显示效果:

     

     

    代码:

    function GaTSPChen
    
    % mainly amended by Chen Zhen, 2012~2016
    
    CityNum = 30; % 城市数目,可以选 10, 30, 50, 75
    [dislist, Clist] = tsp(CityNum); % dislist 为城市之间相互的距离,Clist 为各城市的坐标
    
    inn = 30; % 初始种群大小
    gnMax = 500;  % 最大代数
    crossProb = 0.8; % 交叉概率
    muteProb = 0.8; % 变异概率
    
    % 随机产生初始种群
    population = zeros(inn, CityNum); % population 为初始种群,包括多条染色体
    for i = 1 : inn
        population(i,:) = randperm(CityNum);
    end
    [~, cumulativeProbs] = calPopulationValue(population, dislist); % 计算种群每条染色体的累计概率
    
    generationNum = 1;
    generationMeanValue = zeros(generationNum, 1); % 每一代的平均距离
    generationMaxValue = zeros(generationNum, 1);  % 每一代的最短距离
    bestRoute = zeros(inn, CityNum); % 最佳路径
    newPopulation = zeros(inn, CityNum); % 新的种群
    while generationNum < gnMax + 1
       for j = 1 : 2 : inn
          selectedChromos = select(cumulativeProbs);  % 选择操作,选出两条需要交叉编译的染色体,即父亲母亲
          crossedChromos = cross(population, selectedChromos, crossProb);  % 交叉操作,返回交叉后的染色体
          newPopulation(j, :) = mut(crossedChromos(1, :),muteProb);  % 对交叉后的染色体进行变异操作
          newPopulation(j + 1, :) = mut(crossedChromos(2, :), muteProb); % 对交叉后的染色体进行变异操作
       end
       population = newPopulation;  %产生了新的种群
       [populationValue, cumulativeProbs] = calPopulationValue(population, dislist);  % 计算新种群的适应度
       % 记录当前代最好和平均的适应度
       [fmax, nmax] = max(populationValue); % 因为计算适应度时取距离的倒数,这里面取最大的倒数,即最短的距离
       generationMeanValue(generationNum) = 1 / mean(populationValue); 
       generationMaxValue(generationNum) = 1 / fmax;   
       bestChromo = population(nmax, :);  % 前代最佳染色体,即对应的路径
       bestRoute(generationNum, :) = bestChromo; % 记录每一代的最佳染色体
       drawTSP(Clist, bestChromo, generationMaxValue(generationNum), generationNum, 0);
       generationNum = generationNum + 1;
    end
    [bestValue,index] = min(generationMaxValue);
    drawTSP(Clist, bestRoute(index, :), bestValue, index,1);
    
    figure(2);
    plot(generationMaxValue, 'r');  
    hold on;
    plot(generationMeanValue, 'b'); 
    grid;
    title('搜索过程');
    legend('最优解', '平均解');
    fprintf('遗传算法得到的最短距离: %.2f\n', bestValue);
    fprintf('遗传算法得到的最短路线');
    disp(bestRoute(index, :));
    end
    
    %------------------------------------------------
    % 计算所有染色体的适应度
    function [chromoValues, cumulativeProbs] = calPopulationValue(s, dislist)
    inn = size(s, 1);  % 读取种群大小
    chromoValues = zeros(inn, 1);
    for i = 1 : inn
        chromoValues(i) = CalDist(dislist, s(i, :));  % 计算每条染色体的适应度
    end
    chromoValues = 1./chromoValues'; % 因为让距离越小,选取的概率越高,所以取距离倒数
    
    % 根据个体的适应度计算其被选择的概率
    fsum = 0;
    for i = 1 : inn
        % 乘以15次方的原因是让好的个体被选取的概率更大(因为适应度取距离的倒数,若不乘次方,则个体相互之间的适应度差别不大),换成一个较大的数也行
        fsum = fsum + chromoValues(i)^15;   
    end
    
    % 计算单个概率
    probs = zeros(inn, 1);
    for i = 1: inn
        probs(i) = chromoValues(i)^15 / fsum;
    end
    
    % 计算累积概率
    cumulativeProbs = zeros(inn,1);
    cumulativeProbs(1) = probs(1);
    for i = 2 : inn
        cumulativeProbs(i) = cumulativeProbs(i - 1) + probs(i);
    end
    cumulativeProbs = cumulativeProbs';
    end
    
    %--------------------------------------------------
    %“选择”操作,返回所选择染色体在种群中对应的位置
    % cumulatedPro 所有染色体的累计概率
    function selectedChromoNums = select(cumulatedPro)
    selectedChromoNums = zeros(2, 1);
    % 从种群中选择两个个体,最好不要两次选择同一个个体
    for i = 1 : 2
       r = rand;  % 产生一个随机数
       prand = cumulatedPro - r;
       j = 1;
       while prand(j) < 0
           j = j + 1;
       end
       selectedChromoNums(i) = j; % 选中个体的序号
       if i == 2 && j == selectedChromoNums(i - 1)    % 若相同就再选一次
           r = rand;  % 产生一个随机数
           prand = cumulatedPro - r;
           j = 1;
           while prand(j) < 0
               j = j + 1;
           end
       end
    end
    end
    
    %------------------------------------------------
    % “交叉”操作
    function crossedChromos = cross(population, selectedChromoNums, crossProb)
    length = size(population, 2); % 染色体的长度
    crossProbc = crossMuteOrNot(crossProb);  %根据交叉概率决定是否进行交叉操作,1则是,0则否
    crossedChromos(1,:) = population(selectedChromoNums(1), :);
    crossedChromos(2,:) = population(selectedChromoNums(2), :);
    if crossProbc == 1
       c1 = round(rand * (length - 2)) + 1;  %在[1,bn - 1]范围内随机产生一个交叉位 c1
       c2 = round(rand * (length - 2)) + 1;  %在[1,bn - 1]范围内随机产生一个交叉位 c2
       chb1 = min(c1, c2);
       chb2 = max(c1,c2);
       middle = crossedChromos(1,chb1+1:chb2); % 两条染色体 chb1 到 chb2 之间互换位置
       crossedChromos(1,chb1 + 1 : chb2)= crossedChromos(2, chb1 + 1 : chb2);
       crossedChromos(2,chb1 + 1 : chb2)= middle;
       for i = 1 : chb1 % 看交叉后,染色体上是否有相同编码的情况(路径上重复出现两个城市)。若有,则该编码不参与交叉
           while find(crossedChromos(1,chb1 + 1: chb2) == crossedChromos(1, i))
               location = find(crossedChromos(1,chb1 + 1: chb2) == crossedChromos(1, i));
               y = crossedChromos(2,chb1 + location);
               crossedChromos(1, i) = y;
           end
           while find(crossedChromos(2,chb1 + 1 : chb2) == crossedChromos(2, i))
               location = find(crossedChromos(2, chb1 + 1 : chb2) == crossedChromos(2, i));
               y = crossedChromos(1, chb1 + location);
               crossedChromos(2, i) = y;
           end
       end
       for i = chb2 + 1 : length
           while find(crossedChromos(1, 1 : chb2) == crossedChromos(1, i))
               location = logical(crossedChromos(1, 1 : chb2) == crossedChromos(1, i));
               y = crossedChromos(2, location);
               crossedChromos(1, i) = y;
           end
           while find(crossedChromos(2, 1 : chb2) == crossedChromos(2, i))
               location = logical(crossedChromos(2, 1 : chb2) == crossedChromos(2, i));
               y = crossedChromos(1, location);
               crossedChromos(2, i) = y;
           end
       end
    end
    end
    
    %--------------------------------------------------
    %“变异”操作
    % choromo 为一条染色体
    function snnew = mut(chromo,muteProb)
    length = size(chromo, 2); % 染色体的的长度
    snnew = chromo;
    muteProbm = crossMuteOrNot(muteProb);  % 根据变异概率决定是否进行变异操作,1则是,0则否
    if muteProbm == 1
        c1 = round(rand*(length - 2)) + 1;  % 在 [1, bn - 1]范围内随机产生一个变异位
        c2 = round(rand*(length - 2)) + 1;  % 在 [1, bn - 1]范围内随机产生一个变异位
        chb1 = min(c1, c2);
        chb2 = max(c1, c2);
        x = chromo(chb1 + 1 : chb2);
        snnew(chb1 + 1 : chb2) = fliplr(x); % 变异,则将两个变异位置的染色体倒转
    end
    end
    
    % 根据变异或交叉概率,返回一个 0 或 1 的数
    function crossProbc = crossMuteOrNot(crossMuteProb)
    test(1: 100) = 0;
    l = round(100 * crossMuteProb);
    test(1 : l) = 1;
    n = round(rand * 99) + 1;
    crossProbc = test(n);
    end
    
    %------------------------------------------------
    % 计算一条染色体的适应度
    % dislist 为所有城市相互之间的距离矩阵
    % chromo 为一条染色体,即一条路径
    function chromoValue = CalDist(dislist, chromo)
    DistanV = 0;
    n = size(chromo, 2); % 染色体的长度
    for i = 1 : (n - 1)
        DistanV = DistanV + dislist(chromo(i), chromo(i + 1));
    end
    DistanV = DistanV + dislist(chromo(n), chromo(1));
    chromoValue = DistanV;
    end
    
    %------------------------------------------------
    % 画图
    % Clist 为城市坐标
    % route 为一条路径
    function drawTSP(Clist, route, generationValue, generationNum,isBestGeneration)
    CityNum = size(Clist, 1);
    for i = 1 : CityNum - 1
        plot([Clist(route(i), 1),Clist(route(i + 1), 1)], [Clist(route(i),2),Clist(route(i+1),2)],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g');
        text(Clist(route(i), 1),Clist(route(i), 2), ['  ', int2str(route(i))]);
        text(Clist(route(i+1), 1),Clist(route(i + 1), 2), ['  ', int2str(route(i+1))]);
        hold on;
    end
    plot([Clist(route(CityNum), 1), Clist(route(1), 1)], [Clist(route(CityNum), 2), Clist(route(1), 2)],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g');
    title([num2str(CityNum),'城市TSP']);
    if isBestGeneration == 0 && CityNum ~= 10
        text(5, 5, ['第 ',int2str(generationNum),' 代','  最短距离为 ', num2str(generationValue)]);
    else
        text(5, 5, ['最终搜索结果:最短距离 ',num2str(generationValue),', 在第 ',num2str(generationNum),' 代达到']);
    end
    if CityNum == 10  % 因为文字显示位置不一样,所以将城市数目为 10 时单独编写
        if isBestGeneration == 0
            text(0, 0, ['第 ',int2str(generationNum),' 代','  最短距离为 ', num2str(generationValue)]);
        else
            text(0, 0, ['最终搜索结果:最短距离 ',num2str(generationValue),', 在第 ', num2str(generationNum),' 代达到']);
        end
    end
    hold off;
    pause(0.005);
    end
    
    %------------------------------------------------
    %城市位置坐标
    function [DLn, cityn] = tsp(n)
    DLn = zeros(n, n);
    if n == 10
        city10 = [0.4 0.4439;0.2439 0.1463;0.1707 0.2293;0.2293 0.761;0.5171 0.9414;
            0.8732 0.6536;0.6878 0.5219;0.8488 0.3609;0.6683 0.2536;0.6195 0.2634];%10 cities d'=2.691
        for i = 1 : 10
            for j = 1 : 10
                DLn(i, j) = ((city10(i,1)-city10(j,1))^2 + (city10(i,2)-city10(j,2))^2)^0.5;
            end
        end
        cityn = city10;
    end
    if n == 30
        city30 = [41 94;37 84;54 67;25 62;7 64;2 99;68 58;71 44;54 62;83 69;64 60;18 54;22 60;
            83 46;91 38;25 38;24 42;58 69;71 71;74 78;87 76;18 40;13 40;82 7;62 32;58 35;45 21;41 26;44 35;4 50]; % 30 cities d' = 423.741 by D B Fogel
        for i = 1 : 30
            for j = 1 : 30
                DLn(i,j) = ((city30(i,1)-city30(j,1))^2+(city30(i,2)-city30(j,2))^2)^0.5;
            end
        end
        cityn = city30;
    end
    
    if n == 50
        city50 = [31 32;32 39;40 30;37 69;27 68;37 52;38 46;31 62;30 48;21 47;25 55;16 57;
            17 63;42 41;17 33;25 32;5 64;8 52;12 42;7 38;5 25; 10 77;45 35;42 57;32 22;
            27 23;56 37;52 41;49 49;58 48;57 58;39 10;46 10;59 15;51 21;48 28;52 33;
            58 27;61 33;62 63;20 26;5 6;13 13;21 10;30 15;36 16;62 42;63 69;52 64;43 67];%50 cities d'=427.855 by D B Fogel
        for i = 1 : 50
            for j = 1:50
                DLn(i, j) = ((city50(i,1) - city50(j,1))^2 + (city50(i,2) - city50(j,2))^2)^0.5;
            end
        end
        cityn = city50;
    end
    
    if n == 75
        city75 = [48 21;52 26;55 50;50 50;41 46;51 42;55 45;38 33;33 34;45 35;40 37;50 30;
            55 34;54 38;26 13;15 5;21 48;29 39;33 44;15 19;16 19;12 17;50 40;22 53;21 36;
            20 30;26 29;40 20;36 26;62 48;67 41;62 35;65 27;62 24;55 20;35 51;30 50;
            45 42;21 45;36 6;6 25;11 28;26 59;30 60;22 22;27 24;30 20;35 16;54 10;50 15;
            44 13;35 60;40 60;40 66;31 76;47 66;50 70;57 72;55 65;2 38;7 43;9 56;15 56;
            10 70;17 64;55 57;62 57;70 64;64 4;59 5;50 4;60 15;66 14;66 8;43 26]; % 75 cities d'=549.18 by D B Fogel
        for i = 1 : 75
            for j = 1 : 75
                DLn(i,j) = ((city75(i,1)-city75(j,1))^2 + (city75(i,2)-city75(j,2))^2)^0.5;
            end
        end
        cityn = city75;
    end
    end
    

     

     

     

     

    展开全文
  • 用蚁群算法解决旅行商问题MATLAB代码
  • %多旅行商问题matlab程序 function varargout = mtspf_ga(xy,dmat,salesmen,min_tour,pop_size,num_iter,show_prog,show_res) % MTSPF_GA Fixed Multiple Traveling Salesmen Problem (M-TSP) Genetic Algorithm ...
  • MATLAB下,用遗传算法解决旅行商问题(TSP)、多旅行商问题(MTSP)及其变体(共计39种情况)的代码,具体说明详见README
  • 【TSP问题】基于蚁群算法求解带时间窗旅行商问题matlab源码.md
  • 【TSP问题】基于灰狼算法求解旅行商问题matlab源码 1 算法介绍 1.1 TSP介绍 “旅行商问题”(Traveling Salesman Problem,TSP)可简单描述为:一位销售商从n个城市中的某一城市出发,不重复地走完其余n-1个城市并...

    【TSP问题】基于灰狼算法求解旅行商问题matlab源码

    1 算法介绍

    1.1 TSP介绍见这里

    1.2 灰狼算法求解tsp模型

    灰狼算法(greywolfoptimizer,gwo)是澳大利亚学者seyedalimirjalili于2014年根据灰狼种群的习性提出的一种元启发式算法。该算法根据灰狼喜欢群居的特性引入了社会统治阶层。在种群中,将其分为四个阶层:α狼(负责对种群发出命令的优势狼,即领头狼);β狼(辅助头狼做出决策等活动的优势狼);δ狼(侦察、站岗、狩猎和看护幼崽等相关活动是这种狼的主要活动,是服从于前两种狼的优势狼。);ω狼(服从于前三种优势狼,是位于统治阶级中最底端的狼)。算法利用根据灰狼种群在搜寻、围捕猎物的行为构建算法的数学描述公式,通过迭代获取最优解。通过基准函数的仿真结果表明,灰狼算法能够比遗传算法、粒子群算法等更快更好地完成最优解的搜寻。虽然灰狼算法在连续空间表现出了较好地应用效果,但是应对tsp问题时,在离散空间下的表现不是十分满意。因此,需要对传统的灰狼算进行改进,来更有效地处理tsp问题。

    2 部分代码

    clc;
    clear;
    ​
    %% TSP问题设置
    % 产生问题模型
    model = CreateModel('Oliver30.txt');    
    % 城市分布图
    figure(1);
    plot(model.x, model.y, 'ms', 'LineWidth', 2, 'MarkerEdgeColor', 'k', 'MarkerFaceColor', 'g')
    legend('城市位置')
    title('城市分布图', 'fontsize', 12)
    xlabel('km', 'fontsize', 12)
    ylabel('km', 'fontsize', 12)
    grid on
    % 适应度函数句柄
    Fun = @(tour) TourLength(tour, model); 
    % TSP参数
    M = model.n;                % 城市个数     
    % GWO参数
    N = 50;       % 灰狼个数
    Max_iter = 1000;            % 最大迭代次数
    lb = -10;   % Lower Bound
    ub = 10;   % Upper Bound
    dim = M;                        % 维数
    ​
    % 初始化alpha, beta, and delta_pos
    Alpha_pos = zeros(1,dim);
    Alpha_score = inf; 
    ​
    Beta_pos = zeros(1,dim);
    Beta_score = inf; 
    ​
    Delta_pos = zeros(1,dim);
    Delta_score = inf; 
    % 初始化种群位置
    Positions = rand(N, dim).*(ub-lb)+lb;
    ​
    Length_best = zeros(1, Max_iter);
    Length_ave = zeros(1, Max_iter);
    ​
    l = 1;   % 迭代计数器
    ​
    %% 迭代寻优
    while l < Max_iter+1
        for i = 1:N
            % 边界处理
            Flag4ub = Positions(i, :) > ub;
            Flag4lb = Positions(i, :) < lb;
            Positions(i, :) = (Positions(i, :).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;             
            % 按行升序排列产生城市序列
            [~, sol] = sort(Positions, 2);      
            
            % 计算目标函数值(即路径距离)
            fitness = Fun(sol(i, :));
            Length_ave(l) = Length_ave(l)+fitness;
            % 更新Alpha, Beta, and Delta
            if fitness < Alpha_score 
                Alpha_score = fitness; 
                Alpha_pos = Positions(i, :);
            end
            
            if fitness > Alpha_score && fitness < Beta_score 
                Beta_score = fitness; 
                Beta_pos = Positions(i, :);
            end
            
            if fitness > Alpha_score && fitness > Beta_score && fitness < Delta_score 
                Delta_score = fitness; 
                Delta_pos = Positions(i, :);
            end
        end
        
        
        a = 2-l*((2)/Max_iter); % a从2线性减到0
        
        % 更新所有个体位置
        for i = 1:N
            for j = 1:dim 
                           
                r1 = rand(); % r1 is a random number in [0,1]
                r2 = rand(); % r2 is a random number in [0,1]
                
                A1 = 2*a*r1-a;        % Equation (3.3)
                C1 = 2*r2;              % Equation (3.4)
                
                D_alpha = abs(C1*Alpha_pos(j)-Positions(i, j)); % Equation (3.5)-part 1
                X1 = Alpha_pos(j)-A1*D_alpha; % Equation (3.6)-part 1
                           
                r1 = rand();
                r2 = rand();
                
                A2 = 2*a*r1-a;    % Equation (3.3)
                C2 = 2*r2;          % Equation (3.4)
                
                D_beta = abs(C2*Beta_pos(j)-Positions(i, j));   % Equation (3.5)-part 2
                X2 = Beta_pos(j)-A2*D_beta;                        % Equation (3.6)-part 2       
                
                r1 = rand();
                r2 = rand(); 
                
                A3 = 2*a*r1-a;      % Equation (3.3)
                C3 = 2*r2;             % Equation (3.4)
                
                D_delta = abs(C3*Delta_pos(j)-Positions(i, j));      % Equation (3.5)-part 3
                X3 = Delta_pos(j)-A3*D_delta;                            % Equation (3.5)-part 3             
                
                Positions(i, j) = (X1+X2+X3)/3;        % Equation (3.7)
            end
        end  
        Length_best(l) = Alpha_score;               % 最短距离
        Length_ave(l) = Length_ave(l)/dim;       % 平均距离
        disp(['Iteration ' num2str(l) ': Best Fitness = ' num2str(Alpha_score)]);
        l = l + 1;
        
        [~, BestSol] = sort(Alpha_pos);
        figure(2);
        PlotSolution(BestSol, model, Alpha_score);
        pause(0.01); 
    end
    ​
    %% 进化曲线
    figure(3);
    t = 1:Max_iter;
    plot(t, Length_best, 'r', t, Length_ave, 'b--', 'LineWidth', 2);
    xlabel('Iteration');
    ylabel('Best Cost');
    legend('最短距离','平均距离')
    xlabel('迭代次数')
    ylabel('距离')
    title('各代最短距离与平均距离对比')

    3 仿真结果

    4 参考文献

    [1]高珊. 基于贪婪随机自适应灰狼优化算法求解TSP的研究与应用[D]. 太原理工大学.

    [2]李延柯, 原慧琳. 一种基于灰狼算法的路径规划方法:, CN110675004A[P]. 2020.

    5 代码下载

    展开全文
  • 中国科学院大学智能控制作业,使用Matlab,包含模拟退火遗传算法,普通遗传算法,自适应遗传算法,附有注释和代码说明txt
  • 5种多旅行商问题MATLAB实现方法 1.从不同起点出发回到起点(固定旅行商数量) 2.从同一起点出发回到起点 3.从同一起点出发回到同一终点(与起点不同) 4.从同一起点出发不回到起点 5.从不同起点出发回到起点...
  • Matlab多旅行商.zip

    2019-09-18 12:05:24
    解决了算法导论中的多旅行商问题,采用matlab进行编写。
  • 【TSP】基于改进的遗传算法求解旅行商问题matlab源码含GUI.md
  • 【TSP问题】基于遗传算法求解旅行商问题matlab源码 1 算法介绍 1.1 TSP介绍 “旅行商问题”(Traveling Salesman Problem,TSP)可简单描述为:一位销售商从n个城市中的某一城市出发,不重复地走完其余n-1个城市并...

     【TSP问题】基于遗传算法求解旅行商问题matlab源码

    1 算法介绍

    模型介绍见这里

    2 部分代码

    nn=40; % number of cities
    asz=10; % area size   asx x asz
    ​
    ​
    ps=3000; % population size
    ng=5000; % number of generation
    ​
    pm=0.01; % probability of mutation of exchange 2 random cities in the path (per gene, per genration)
    pm2=0.02; % probability of mutation of exchange 2 peices of path (per gene, per genration)
    pmf=0.08; % probability of mutation  of flip random pece of path
    ​
    r=asz*rand(2,nn); % randomly distribute cities
    % r(1,:) -x coordinaties of cities
    % r(2,:) -y coordinaties of cities
    ​
    % % uncomment to make circle:
    % % circle
    % al1=linspace(0,2*pi,nn+1);
    % al=al1(1:end-1);
    % r(1,:)=0.5*asz+0.45*asz*cos(al);
    % r(2,:)=0.5*asz+0.45*asz*sin(al);
    ​
    dsm=zeros(nn,nn); % matrix of distancies
    for n1=1:nn-1
        r1=r(:,n1);
        for n2=n1+1:nn
            r2=r(:,n2);
            dr=r1-r2;
            dr2=dr'*dr;
            drl=sqrt(dr2);
            dsm(n1,n2)=drl;
            dsm(n2,n1)=drl;
        end
    end
    ​
    % start from random closed pathes:
    G=zeros(ps,nn); % genes, G(i,:) - gene of i-path, G(i,:) is row-vector with cities number in the path
    for psc=1:ps
        G(psc,:)=randperm(nn);
    end
    ​
    figure('units','normalized','position',[0.05 0.2 0.9 0.6]);
    ​
    subplot(1,2,1);
    ​
    % to plot best path:
    hpb=plot(NaN,NaN,'r-');
    ht=title(' ');
    ​
    hold on;
    ​
    % plot nodes numbers
    for n=1:nn
        text(r(1,n),r(2,n),num2str(n),'color',[0.7 0.7 0.7]);
    end
    ​
    plot(r(1,:),r(2,:),'k.'); % plot cities as black dots
    ​
    ​
    ​
    axis equal;
    xlim([-0.1*asz 1.1*asz]);
    ylim([-0.1*asz 1.1*asz]);
    ​
    subplot(1,2,2);
    hi=imagesc(G);
    title('color is city number');
    colorbar;
    xlabel('index in sequence of cities');
    ylabel('path number');
    ​
    pthd=zeros(ps,1); %path lengths
    p=zeros(ps,1); % probabilities
    for gc=1:ng % generations loop
        % find paths length:
        for psc=1:ps
            Gt=G(psc,:);
            pt=0; % path length summation
            for nc=1:nn-1
                pt=pt+dsm(Gt(nc),Gt(nc+1));
            end
            % last and first:
            pt=pt+dsm(Gt(nn),Gt(1));
            pthd(psc)=pt;
        end
        ipthd=1./pthd; % inverse path lengths, we want to maximize inverse path length
        p=ipthd/sum(ipthd); % probabilities
        
        [mbp bp]=max(p); 
        Gb=G(bp,:); % best path 
        
        % update best path on figure:
        if mod(gc,5)==0
            set(hpb,'Xdata',[r(1,Gb) r(1,Gb(1))],'YData',[r(2,Gb) r(2,Gb(1))]);
            set(ht,'string',['generation: ' num2str(gc)  '  best path length: ' num2str(pthd(bp))]);
            set(hi,'CData',G);
            drawnow;
        end
        
        
        % crossover:
        ii=roulette_wheel_indexes(ps,p); % genes with cities numers in ii will be put to crossover
        % length(ii)=ps, then more probability p(i) of i-gene then more
        % frequently it repeated in ii list
        Gc=G(ii,:); % genes to crossover
        Gch=zeros(ps,nn); % childrens
        for prc=1:(ps/2) % pairs counting
            i1=1+2*(prc-1);
            i2=2+2*(prc-1);
            g1=Gc(i1,:); %one gene
            g2=Gc(i2,:); %another gene
            cp=ceil((nn-1)*rand); % crossover point, random number form range [1; nn-1]
            
          
            % two childrens:
            g1ch=insert_begining(g1,g2,cp);
            g2ch=insert_begining(g2,g1,cp);
            Gch(i1,:)=g1ch;
            Gch(i2,:)=g2ch;
        end
        G=Gch; % now children
        
        
        % mutation of exchange 2 random cities:
        for psc=1:ps
            if rand<pm
                rnp=ceil(nn*rand); % random number of sicies to permuation
                rpnn=randperm(nn);
                ctp=rpnn(1:rnp); %chose rnp random cities to permutation
                Gt=G(psc,ctp); % get this cites from the list
                Gt=Gt(randperm(rnp)); % permutate cities
                G(psc,ctp)=Gt; % % return citeis back
             end
        end
        
        % mutation of exchange 2 peices of path:
        for psc=1:ps
            if rand<pm2
                cp=1+ceil((nn-3)*rand); % range [2 nn-2]
                G(psc,:)=[G(psc,cp+1:nn) G(psc,1:cp)];
            end
        end
        
        % mutation  of flip randm pece of path:
        for psc=1:ps
            if rand<pmf
                n1=ceil(nn*rand);
                n2=ceil(nn*rand);
                G(pscs,n1:n2)=fliplr(G(psc,n1:n2));
            end
        end
        
        
    ​
        
        G(1,:)=Gb; % elitism
        
        
            
    end
    ​

    3 仿真结果

    4 参考文献

    [1]谢胜利, 唐敏, 董金祥. 求解TSP问题的一种改进的遗传算法[J]. 计算机工程与应用, 2002, 38(008):58-60.

    [2]文艺, and 潘大志. "用于求解TSP问题的改进遗传算法." 计算机科学 43.0z1(2016):90-92.

    5 代码下载

    展开全文
  • 多旅行商问题matlab代码,一共五种类型,可以直接使用。固定起点终点任意旅行商,返回起点的旅行商,任意起点终点旅行商,等。
  • 遗传算法解决5种多旅行商问题(mtsp)的matlab程序 分别为以下5中情况: 1.从不同起点出发回到起点(固定旅行商数量) 2.从不同起点出发回到起点(旅行商数量根据计算可变) 3.从同一起点出发回到起点 4.从同一起点...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,514
精华内容 605
关键字:

多旅行商问题matlab

matlab 订阅