禁忌搜索算法原理步骤、matlab实现算例及相关代码

4 篇文章 7 订阅
1 篇文章 0 订阅

一、原理步骤

参考:禁忌搜索算法(Tabu Search)的基本原理与算法流程总结_Chauncy__xu的博客-CSDN博客_禁忌搜索算法

注意其中存在两个对象:

禁忌对象:禁忌表中被禁的那些变化元素

禁忌长度:禁忌的步数,决定禁忌表的长度

二、算例,以tsp问题为例,数据随机生成

代码:

clc
clear
p=rand(10,2)*10;
plot(p(:,1),p(:,2),'ok')
title('生成点')
save p p

三、禁忌搜索算法matlab代码及效果

 迭代过程:                                                     路线结果:

 代码:子函数点赞收藏关注后私聊获得,码字不易感谢支持!

clc
clear
close all
p=[8.14723686393179,1.57613081677548;9.05791937075619,9.70592781760616;1.26986816293506,9.57166948242946;9.13375856139019,4.85375648722841;6.32359246225410,8.00280468888800;0.975404049994095,1.41886338627215;2.78498218867048,4.21761282626275;5.46881519204984,9.15735525189067;9.57506835434298,7.92207329559554;9.64888535199277,9.59492426392903];
%% 初始化
popus=randperm(size(p,1));
%% 禁忌搜索
max_ge=50;%搜索步数
J_ch=[];%禁忌表
J_T=[];
T=5;%禁忌长度
Pf=inf;
for gen=1:max_ge
    num=50;
    pop=cell(1,num);
    %选出候选集
    for i=1:num
        pop{i}=Randk(popus);
    end
    f=fit(pop,p);
    for i=1:num
        for j=1:size(J_ch,2)
            if sum(abs(J_ch{j}-pop{i}))==0
                f(i)=inf;
                break
            end
        end
    end
    [~,index]=min(f);
    %将禁忌长度-1
    if ~isempty(J_T)
        J_T=J_T-1;
        ch=find(J_T==0);
        J_T(ch)=[];
        J_ch(ch)=[];
    end
    %将其加入禁忌表
    J_ch=[J_ch,pop(index(1))];
    J_T=[J_T,T];
    Pop{gen}=pop{index(1)};
    Pf(gen)=min([min(f),Pf]);
    popus=pop{index(1)};
end
[~,index]=min(Pf);
popus=Pop{index(1)};
figure(1)
plot(1:size(Pf,2),Pf,'-k')
title('迭代过程')
xlabel('X')
ylabel('Y')
figure(2)
plot(p(:,1),p(:,2),'ok')
hold on
plot([p(popus(1),1) p(popus(end),1)],[p(popus(1),2) p(popus(end),2)],'-b')
hold on
for i=1:size(popus,2)-1
    plot([p(popus(i),1) p(popus(i+1),1)],[p(popus(i),2) p(popus(i+1),2)],'-b')
hold on
end
title('路线图')

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

墨叔叔(下载前请私聊)

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值