Matlab基于遗传算法的海岛路径优化

1 背景介绍

假定某群岛海域有20个小岛,每个岛屿各产不同种类的海鲜,现需对各岛屿的海鲜进行外向运输,选取一个中心岛屿作为中心枢纽,(以下称其为中心岛);各个岛屿的货物运送到中心枢纽岛屿,然后从中心岛运往大陆,其中参考各方因素确定最优的运送路线,各个岛屿到中心岛运送的船只有两种船型;并对船只进行选择。运用matlab编程,禁忌搜索方法。

鉴于偏远岛屿的地理特点,其交通网络一般由三个节点组成:大陆港口、中心岛和卫星岛。大陆港口是海岛依托大陆的物流运输通道;中心岛是收集周围岛屿输送物资的枢纽;卫星岛是供应生产物资到中心岛物资的末端岛屿。

首先,由于海上航行受台风影响很大,需要防止岛间运输物资中断,分析了该地区台风发生的统计资料,并结合各岛的生活资料,通过数据拟合得到台风影响时间的概率分布曲线。在一定的保证率下,每个岛屿的日平均生产量在不腐坏的前提下,建立运输模型。那么,对中心岛的位置和交通的优化是必须的。其中运输系统结构包括航线数量、运输组织形式及到达顺序、每条航线的船型及时刻表、各岛码头规模等;建立和优化存储系统(包括存储容量和周期性供应等)。

显然,运输系统成本和存储系统是优化目标统一成本的两个矛盾方面,即如果某一航线的船舶尽可能满载,则可以延长运输计划的间隔,从而降低运输计划运输成本,但同时也会增加货物储存和仓库建设成本;如果船型不变,增加航线上的供应岛它可以减少航线数量和船舶采购、集货周期和库存成本,以及库存引起的货物存储成本和仓库建设的成本,但是运输距离的增加和路线的延长会导致运输成本的增加,从而导致系统总成本的变化。此外,中心岛的位置将直接影响路径规划和运输组织形式的选择,从而间接影响仓储系统的优化。

在优化远洋集团货物海运系统的过程中,除了上述传统的LIRP问题外,还应考虑选址、运输和仓储的决策问题。除了相互作用外,我们还需要考虑航运系统本身的特点:①由于船舶的负荷一般远大于岛上的日生产量,所以双向装货路线与单方向运输相比,双向运输可以延长装货周期,大大降低运输频率。虽然运输距离有所增加,但运输成本可能会相对降低。即使库存和由此产生的货物储存成本和仓库建设成本增加,最终系统的总成本也可能降低。具体运输组织形式的选择应根据线路岛屿的数量和距离确定。

② 与小船型相比,如果选择航线,应根据航线中岛屿的数量和距离确定,大型船型可以成倍定期装货,延长输送周期,减少运输次数,降低运输成本,但船舶采购成本和码头总建设成本、库存及由此产生的货物储存成本和仓库建设成本都会增加,导致系统总成本的变化。

在运输系统中,无论有多少条线路,所有卫星岛的终端总数都是固定的,但由于不同航线的船型不同,所以卫星岛码头的规模不同和由此带来的码头建设成本也不尽相同,而且每增加一种船型,中心岛都需要配备更多相应的船型的码头。因此,它对码头的建设成本有很大的影响。综上所述,离岛海运物流系统的优化应基于以上特点选出中心岛,为卫星岛运输划分路线组,建立各条线路(循环运输)的运输组织形式,配置不同船型,制定航次。在线路换班时设置各岛的存储容量,以便在台风等影响下求得偏远岛屿的整个群岛物流系统总成本得最低。

2建立模型

Matlab基于遗传算法的海岛路径优化_第1张图片
Matlab基于遗传算法的海岛路径优化_第2张图片
Matlab基于遗传算法的海岛路径优化_第3张图片

3问题分析

编码模式:数字编码
个体设计:Chrom包含5个字段,储存初始岛序列,路径数量,各路径具体序列,各路径船型,各路径长度;
交叉:两个路线进行节点交换;
变异1:路线内部节点顺序变异;
变异2:两条路线进行节点交换;

4代码实现

下面展示一些 内联代码片

clc
close all
clear all
%% 模型参数
n=20;
Axes=[35,44;13,36;22,59;30,79
    39,60;31,26;25,21;40,16;52,38
    63,17;66,71;62,50;41,29;71,35
    91,37;25,33;82,74;52,80;49,11
    22,11];
Land=[-8,65];
Dom=((Axes(1,1)-Land(1))^2+(Axes(1,2)-Land(2))^2)^0.5;
Dist=getdist(Axes);
Output=[122,77,75,68,87,96,90,110,127,...
    155,141,135,103,163,170,81,147,145,129,95];
Ship.Cp=[1300000,2100000,1e15];
Ship.Ctr=[65,90,1e15];
Ship.V=[18,14,1e15];
T.all=15*365-1;
T.main=7;
%% Ga参数
GenMax=200;
Pc=0.5;
Pv=0.5;
Gen=0;
Popnum=100;
Chrom=struct;
NewChrom=struct;
%% 生成初始种群
for i =1:Popnum
    Chrom(i).Index=randperm(n-1)+1;
    Chrom(i).RouteNum=randi(n-1,1);
    Chrom(i).Routes=getdivide(Chrom(i).RouteNum,Chrom(i).Index,n);
end
while Gen < GenMax
Gen=Gen+1;
NewChrom=Chrom;
for i=1:Popnum
TempChrom=struct;
TempChrom=Chrom(i);
% %% 交叉
rate1=rand;
if rate1=2
                temppoint=randperm(L-1)+1;
                tempc1=R(2:temppoint(1));
                tempc2=R(temppoint(1)+1:L+1);
                R=[1 tempc2 tempc1 1];
            end
            NewChrom(i).Routes(j)={R};
        end
       end
end
% 变异
rate2=rand;
if rate21
        temproute=randperm(TempChrom.RouteNum);
        R1=TempChrom.Routes{temproute(1)};
        R2=TempChrom.Routes{temproute(2)};
        L1=length(R1)-2;
        L2=length(R2)-2;
        Lv=min(L1,L2);
        tempv=R1(Lv+1);
        R1(Lv+1)=R2(Lv+1);
        R2(Lv+1)=tempv;
        NewChrom(i).Routes{temproute(1)}=R1;
        NewChrom(i).Routes{temproute(2)}=R2;
    end
    %type2
    for j=1:TempChrom.RouteNum
                    rate22=rand;
        if rate222
                temppoint=randperm(L)+1;
                tempv=R(temppoint(1));
                R(temppoint(1))=R(temppoint(2));
                R(temppoint(2))=tempv;
            end
            NewChrom(i).Routes(j)={R};
        end
    end
end
end
Chrom_all=[Chrom,NewChrom];
for i=1:size(Chrom_all,2)
    ship=[];
    RouteL=[];
    ShipNum=Chrom_all(i).RouteNum;
    for j=1:ShipNum
        EachL=0;
        Route=Chrom_all(i).Routes{j};
        EachOutput(j)=sum(Output(Route(2:end-1)));
        if EachOutput(j)<=300
            ship(j)=1;
        elseif EachOutput(j)<=500
            ship(j)=2;
        else
            ship(j)=3;
        end
        for k=1:length(Route)-1
            EachL=EachL+Dist(Route(k),Route(k+1));
        end
        RouteL(j)=EachL;
    end
    Chrom_all(i).Ship=ship;
    Chrom_all(i).Length=RouteL;
end  
[bestC,ind]=getbest(Chrom_all,Ship,Dom,T);
Chrom=Chrom_all(ind(1:Popnum));
Best(Gen).Gen=Chrom_all(ind(1));
Best(Gen).C=bestC(1);
end
%% 结果展示
plot([Best.C])
title('总成本进化曲线');
xlabel('迭代次数')
ylabel('总成本')


%%%%%%%%%
%getdist  计算岛间距离
%getdivide 分割卫星岛序列形成循环路线
%getbest  计算每代的最优个体
%有需要可以私信

















5结果分析

Matlab基于遗传算法的海岛路径优化_第4张图片
根据进化曲线可以发现,很好的实现了路径总成本的优化,并在100代左右达到了收敛。

你可能感兴趣的:(优化算法,算法,经验分享,程序人生,其他)