用遗传算法求解的tsp问题

用遗传算法求解的tsp问题

对于遗传算法的基本定义及内容笔者就不重复了,这里附上网址供大家去学习参看。遗传算法
大家也可以参看我其他的文章,比如智能算法数学建模专题,里面都有详细的介绍和题目代码,完全够读者学习和使用的,后面笔者也会对这些专题和其他内容进行更新,敬请期待哦。

题目:在一条装配线上用一个机械手去固定待装配部件上的螺母问题。机械手由其初始位置(该位置在第一个要紧固螺母的上方)开始,依次移动到其余的每一个螺母,最后返回到初始位置。机械手移动的路线就是以螺母为结点的一条周游路线。一条最小成本周游路线将使机械手完成工作的时间取最小值。注意:只有机械手移动的时间总量是变化的。
分析:我们要求时间最短的路线,在机械手移动速度不变的情况下,即可以把问题转化为路径最短的问题。而初始位置的信息则告诉我们,机械手出发时已经处在出发螺母的位置了。
关于问题的实现方面,设螺母数量为N,我们生成一个长度为N的向量,向量的每个元素就是依次要到达的螺母编号,比如[1 2 3 4 5 … N]。之后我们采用相对应的遗传算法进行求解即可,具体内容请看Matlab代码。

clear
clc
position = [2 3
    5 7
    7 1
    9 2
    3 5
    4 10
    1 1
    6 8
    7 7
    10 2];
% 计算各点之间的距离矩阵D
[m,n] = size(position);
D = zeros(m);
for i = 1:m
    for j = 1:m
        if i == j
            D(i,j) = 0;
        else
            D(i,j) = sqrt((position(i,1)-position(j,1))^2+(position(i,2)-position(j,2))^2);
        end
    end
end

% 初始参数的设定
len = m;
popsize = 20;
maxgen = 100;
pc = 0.9;
pm = 0.05;
ggap = 0.9;
chrom = initial(popsize,len);
% 画出一个可行解
drawpath(chrom(1,:),position);
title('一可行解的路线');
disp(['路线与路程为:',pathlength(D,chrom(1,:))]);
outputpath(chrom(1,:));

% 开始迭代
global gen;
gen = 1;
track = zeros(maxgen,m);
record = zeros(1,maxgen);
while gen <= maxgen
    [row,~] = size(chrom);
    for i = 1:row
        long(i) = pathlength(D,chrom(i,:));
    end
    fitv = fit(long);
    % 选择
    selch = select5(chrom,fitv,ggap);
    % 交叉
    selch = cross5(pc,selch);
    % 变异
    selch = mutate1(selch,pm);
    % 逆转操作
    selch = reverse5(selch,D);
    % 重插入子代的新种群
    chrom = reins5(chrom,selch,long);
    
    [row,~] = size(chrom);
    temp = zeros(row,1);
    for i = 1:row
        temp(i) = pathlength(D,chrom(i,:));
    end
    [index1,index2] = min(temp);
    record(gen) = index1;
    track(gen,:) = chrom(index2,:);
    gen = gen + 1;
end
[~,index] = min(record);
drawpath(track(index,:),position);
hold on;
xlabel('x轴')
ylabel('y轴')
title('最短路径')
outputpath(track(index,:));
figure
hold on
plot(1:maxgen,record);
xlabel('迭代次数');
ylabel('距离');
title('优化过程');

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原创小白变怪兽

帮助原创小白成为怪兽吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值