matlab改进变邻域搜索算法求解路径优化。

Posted 张叔zhangshu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab改进变邻域搜索算法求解路径优化。相关的知识,希望对你有一定的参考价值。

变邻域搜索算法求解旅行商问题

旅行商问题( Traveling Salesman Problem,TSP)是经典的组合优化问题。现在假设有若干个城市,任意两个城市之间的距离已知,则TSP可以简单地描述为:一个旅行商人从任意一个城市出发,在访问完其余城市后(每个城市只被访问一次,不允许多次访问),最后返回出发城市,找到旅行商人所行走的最短路线变邻域搜索( Variable Neighborhood Search,VNS)算法通过搜索若干个不同邻域以求得问题最终的解,其已经被广泛应用于求解组合优化问题。
只能先尝试随便为旅行商人设计出一条一个城市只能访问一次的行走路线。假设这条路线不是最短的那条路线,那么这条路线一定还可以通过调整旅行商人访间城市的顺序,从而达到缩短行走总距离目的。因此,调整旅行商人访问城市顺序的方法就显得尤为重要,不同的调整方法对于缩短行走总距离的效果是不同的,这条路线的行走总距离为414km。因为在知最短总距离为3.3km,所以1243这条路线一定还有调整的空间。那究竟如何调整1243路线呢?
一个容易想到的策略是对调相邻城市的访问顺序。因此采用该策略对1243路线调整后的路线分别如下。
调整路线1:2143(将1和2对调),此时总距离为333m调整路线2:1423(将2和4对调),此时总距离为33km。
调整路线3:1234(将4和3对调),此时总距离为333k调整路线4:3241(将3和1对调),此时总距离为339km这里需要注意的一点是,3和1其实也是相邻城市,因此也可以进行对调。接下来从上述4条路线中选择最短的一条路线,因为调整路线1和调整路线3总距离是相等的,这里在经过随机选择后,假的是调整路线因为此时不知道1234这条路线是否为最短路线,所以还会继续对这条路线进行调整。此时用种新的策略调整1234这条路线,即对调中间间隔一个城市的两个城市的访问顺序。采用该策略对1234路线调整后的路线分别如下调整路线5:3214(将1和3对调),此时总距离为33.3k虽然这2条路线总距离都为333km,但是此时依然不确定是否找到最短路线。因此,还会从调整路线5和调整路线6这2条路线中随机选择一条路线,然后继续对该路线进行调整,一直达到初始设定的条件为止,才会停止继续调整与寻找更短的路线。假设最初设定只允许调整路线3次,那么在调整3次路线后,就会自动停止寻找更短路线,此规则,记为规则1;对调中间间隔一个城的两个城市的访问顺序也是一个规则,记为规则2.第12、3、4条调整路线实际上表示一个集合,记为集合1;第5.6条调整路线实际上也表示一个集合,记为集合2.只有按照规则对原始路线进行操作此,引出“变邻域搜索”的概念。
应搜索。变域搜索就是在不同的领域中不断地搜中的变,从集合中找出比原索更优的解。VNS算法求解组合优化问题

tic
clear
clc
%% 输入数据
dataset=importdata('input.txt');                %数据中,每一列的含义分别为[序号,x坐标,y坐标]
x=dataset(:,2);                                 %x坐标
y=dataset(:,3);                                 %y坐标
vertexes=dataset(:,2:3);                        %提取各个城市的xy坐标
N=size(dataset,1);                              %城市数目
h=pdist(vertexes);                              %计算各个城市之间的距离,一共有1+2+......+(n-1)=n*(n-1)/2个
dist=squareform(h);                             %将各个城市之间的距离转换为n行n列的距离矩阵
%% 参数初始化
MAXGEN=50;                                      %外层最大迭代次数
M=50;                                           %最多进行M次邻域操作
n=3;                                            %邻域数目
%% 构造初始解
[init_route,init_len]=construct_route(dist);    %贪婪构造初始解
disp(['初始路线总距离为',num2str(init_len)]);
cur_route=init_route;
best_route=cur_route;
best_len=route_length(cur_route,dist);
BestL=zeros(MAXGEN,1);                          %记录每次迭代过程中全局最优个体的总距离
%% 主循环
gen=1;                                          %外层计数器
while gen<=MAXGEN
    k=1;
    while(1)
        switch k
            case 1
                cur_route=shaking(cur_route,dist,k);
                [swap_route,swap_len]=swap_neighbor(cur_route,dist,M);
                cur_len=swap_len;
                if cur_len<best_len
                    cur_route=swap_route;
                    best_len=cur_len;
                    best_route=swap_route;
                    k=0;
                end
            case 2
                cur_route=shaking(cur_route,dist,k);
                [reversion_route,reversion_len]=reversion_neighbor(cur_route,dist,M);
                cur_len=reversion_len;
                if cur_len<best_len
                    cur_route=reversion_route;
                    best_len=cur_len;
                    best_route=reversion_route;
                    k=0;
                end
            case 3
                cur_route=shaking(cur_route,dist,k);
                [insertion_route,insertion_len]=insertion_neighbor(cur_route,dist,M);
                cur_len=insertion_len;
                if cur_len<best_len
                    cur_route=insertion_route;
                    best_len=cur_len;
                    best_route=insertion_route;
                    k=0;
                end
            otherwise
                break;
        end
        k=k+1;
    end
    disp(['第',num2str(gen),'代最优路线总距离为',num2str(best_len)]);
    BestL(gen,1)=best_len;
    %% 计数器加1
    gen=gen+1;
end
%% 画出优化过程图
figure;
plot(BestL,'LineWidth',1);
title('优化过程')
xlabel('迭代次数');
ylabel('总距离');
%% 画出全局最优路线图
plot_route(best_route,x,y);
toc


%% 计算swap操作后与操作前路线route的总距离的差值
%输入route:            一条路线
%输入dist:             距离矩阵
%输入i,j:             交换点i,j
%输出delta1:           swap后路线的总距离-swap前路线的总距离
function delta1=cal_delta1(route,dist,i,j)
N=numel(route);         %城市数目
if (i==1)&&(j==N)
    delta1=-(dist(route(i),route(i+1))+dist(route(j-1),route(j)))+...
        (dist(route(j),route(i+1))+dist(route(j-1),route(i)));
elseif (i==1)&&(j==2)
    delta1=-(dist(route(N),route(i))+dist(route(j),route(j+1)))+...
        (dist(route(N),route(j))+dist(route(i),route(j+1)));
elseif i==1
    delta1=-(dist(route(N),route(i))+dist(route(i),route(i+1))+...
        dist(route(j-1),route(j))+dist(route(j),route(j+1)))+...
        (dist(route(N),route(j))+dist(route(j),route(i+1))+...
        dist(route(j-1),route(i))+dist(route(i),route(j+1)));
elseif (i==N-1)&&(j==N)
    delta1=-(dist(route(i-1),route(i))+dist(route(j),route(1)))+...
        (dist(route(i-1),route(j))+dist(route(i),route(1)));
elseif j==N
    delta1=-(dist(route(i-1),route(i))+dist(route(i),route(i+1))+...
        dist(route(j-1),route(j))+dist(route(j),route(1)))+...
        (dist(route(i-1),route(j))+dist(route(j),route(i+1))+...
        dist(route(j-1),route(i))+dist(route(i),route(1)));
elseif abs(i-j)==1
    delta1=-(dist(route(i-1),route(i))+dist(route(j),route(j+1)))+...
        (dist(route(i-1),route(j))+dist(route(i),route(j+1)));
else
    delta1=-(dist(route(i-1),route(i))+dist(route(i),route(i+1))+...
        dist(route(j-1),route(j))+dist(route(j),route(j+1)))+...
        (dist(route(i-1),route(j))+dist(route(j),route(i+1))+...
        dist(route(j-1),route(i))+dist(route(i),route(j+1)));
end
end

代码下载地址

以上是关于matlab改进变邻域搜索算法求解路径优化。的主要内容,如果未能解决你的问题,请参考以下文章

matlab改进大规模邻域搜索算法求解路径优化

matlab改进大规模邻域搜索算法求解路径优化

matlab改进大规模邻域搜索算法求解路径优化

优化PID基于matlab混沌改进的蚁群算法求解船舶锅炉压力控制PID优化问题含Matlab源码 2303期

优化PID基于matlab混沌改进的蚁群算法求解船舶锅炉压力控制PID优化问题含Matlab源码 2303期

matlab改进灰狼算法求解路径优化