2019-mathorcupB题-环形穿梭机调度模型(代码篇)

全程代码用matlab实现,用最近原则算法求解第一问的主函数代码如下。在(思路篇)中已经提到过,若考虑车子本身长度,则只需要修改回溯函数即可。

clc;clear;
%求最短距离
S=[0	23.5	0	0	0	0	0	0	0	0	0	0	0
0	0	23.5	0	0	0	0	0	0	0	0	0	0
0	0	0	23.5	0	0	0	0	0	0	0	0	0
0	0	0	0	23.5	0	0	0	0	0	0	0	0
0	0	0	0	0	6	0	0	0	0	0	0	0
0	0	0	0	0	0	13.4285714	0	0	0	0	0	0
0	0	0	0	0	0	0	13.4285714	0	0	0	0	0
0	0	0	0	0	0	0	0	13.4285714	0	0	0	0
0	0	0	0	0	0	0	0	0	13.4285714	0	0	0
0	0	0	0	0	0	0	0	0	0	13.4285714	0	0
0	0	0	0	0	0	0	0	0	0	0	13.4285714	0
0	0	0	0	0	0	0	0	0	0	0	0	13.4285714
0	0	0	0	0	0	0	0	0	0	0	0	0
];
Dajk=[2	4
1	4
4	2
3	1
1	3
4	2
3	1
3	2
1	3
4	2
3	4
2	1
2	3
2	1
1	4
3	4
4	1
1	3
3	3
4	3
2	3
3	2
2	3
4	3
2	3
1	2
3	4
3	1
3	2
1	4
1	4
1	3
1	3
3	4
4	3
4	3
1	3
1	3
3	2
3	1
3	3
3	1
3	1
2	3
3	4
1	3
2	3
1	4
3	3
3	3
3	1
3	2
2	3
3	2
4	1
3	3
3	4
3	1
1	2
3	4
3	1
1	4
4	3
2	3
2	1
4	3
4	1
2	3
3	4
2	1
1	2
3	1
3	3
4	3
1	3
2	4
3	4
2	4
1	4
3	4
3	1
3	4
2	1
2	3
3	3
1	2
1	3
3	3
2	3
2	3
3	1
3	1
3	4
3	2
3	3
4	1
1	4
4	3
3	4
1	3
];
wzqlovecr=[1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
1	0	0	1
];
msum=sum(wzqlovecr);
m=[1,1,1,1];
for i=1:100
    for j=1:2
        if Dajk(i,j)==1
            Dajk(i,j)=6;
        end
        if Dajk(i,j)==2
            Dajk(i,j)=8;
        end
        if Dajk(i,j)==3
            Dajk(i,j)=10;
        end
        if Dajk(i,j)==4
            Dajk(i,j)=12;
        end
    end
end
k1=1;
k2=1;
i=1;
j=3;
while j-i<13
    S(i,j)=S(i,j-1)+S(j-1,j);
    if j<13
        j=j+1;
        i=i+1;
    else
        j=j-i+2;
        i=1;
    end
end
for i=1:13
    for j=1:13
        if S(i,j)==0&&i~=j
            S(i,j)=94*2+6*2-S(j,i);
        end
    end
end
%init
v=1.5;
UPA=[4,5];
UPB=[7,9,11,13];
DOWNA=[1,2,3];
DOWNB=[6,8,10,12];
status=[4,11.75,4;4,11.74,4;4,11.73,4];
status=[status;status;status];
N=9;
next=ones(1,N)*4;
TSUM=0;
wzqcr=0;
while 1
    wzqcr=wzqcr+1;
[status2,T] = FF(status,next,S,v );%状态转移
status = FF2(status,status2,S,v);
[next,k1,k2,m] = updata(next,status, k1,k2,Dajk,UPA,UPB,S,m,DOWNA);%对下一个停靠窗口进行确定
if k1>=100
     S(:,4)=1000000;
end
if k2>=100
     S(:,5)=1000000; 
end
if(m(1)>=msum(1))
    S(:,7)=10000000;
end
if(m(2)>=msum(2))
    S(:,9)=10000000;
end
if(m(3)>=msum(3))
    S(:,11)=10000000;
end
if(m(4)>=msum(4))
    S(:,13)=10000000;
end
 status = jc( status,k1,k2,m,msum,UPA,UPB,S,v );
status
TSUM=TSUM+T;

if (k1>=100)&&(k2>=100)&&(m(1)>=msum(1))&&(m(2)>=msum(2))&&(m(3)>=msum(3))&&(m(4)>=msum(4))
    break
end
end
disp('总共用时间:')
TSUM
disp('总共循环次数:')
wzqcr

单个穿梭车状态转移函数定义如下

function statusout = f( statusin,i,next,S,v)
%对每一个i的status考虑next是整个的
a=statusin(1);
b=statusin(2);
c=statusin(3);
if a==1
    statusout(1)=3;
    statusout(2)=S(c,next(i))/v;
    statusout(3)=next(i);
end
if a==2
    statusout(1)=4;
    statusout(2)=S(c,next(i))/v;
    statusout(3)=next(i);
end
if a==3
    statusout(1)=2;
    statusout(2)=10;%上下料时间
    statusout(3)=statusin(3);
end
if a==4
    statusout(1)=1;
    statusout(2)=10;%上下料时间
    statusout(3)=statusin(3);
end
end


对下一次停靠窗口进行确定函数如下:

function [next,k1out,k2out,mout] = updata(nextin,status,k1in,k2in,Dajk,UPA,UPB,S,minn,DOWNA)
%Dajk,k1,k2
%最近原则决策算法
N=length(nextin);
k1out=k1in;
k2out=k2in;
mout=minn;
next=nextin;
for i=1:N
    if status(i,1)==1&&status(i,3)==UPA(1)&&status(i,2)==10
        next(i)=Dajk(k1in,1);
        k2out=k2in;
        k1out=k1in+1;
    end
    if status(i,1)==1&&status(i,3)==UPA(2)&&status(i,2)==10
        next(i)=Dajk(k2in,2);
        k1out=k1in;
        k2out=k2in+1;
    end
    if status(i,1)==1&&ismember(status(i,3),UPB)
        smin=199999;
        xmin=1;
        for x=1:length(DOWNA)
            if S(status(i,3),DOWNA(x))<smin
                smin=S(status(i,3),DOWNA(x));
                xmin=DOWNA(x);
            end
        end
        next(i)=xmin;
        k1out=k1in;
        k2out=k2in;
        mout(find(UPB==status(i,3)))= mout(find(UPB==status(i,3)))+1;
    end
    if status(i,1)==2
        smin=199999;
        UPAUPB=[UPA,UPB];
        xmin=1;
        for x=1:length(UPAUPB)
            if S(status(i,3),UPAUPB(x))<smin
                smin=S(status(i,3),UPAUPB(x));
                xmin=UPAUPB(x);
            end
        end
        next(i)=xmin;
        k1out=k1in;
        k2out=k2in;
    end
    
        
end

end


整体状态转移函数如下:

function [statusout,T] = FF(  statusin,next,S,v )
%整个status(N*3)
[N,three]=size(statusin);
cr=statusin(:,2);
cr=cr(end:-1:1);
[T,mini]=min(cr);
mini=N-mini+1;
for i=1:N
    if i~=mini
        statusout(i,:)=[statusin(i,1),statusin(i,2)-T,statusin(i,3)];
    else
          statusout(i,:)=f(  statusin(i,:),i,next,S,v);
    end
end

end

额。。。忘了jc干啥的了~~

function [ statusout ] = jc( statusin,k1,k2,m,msum,UPA,UPB,S,v )
N=length(statusin);
statusout=statusin;
for i=1:N
    if((statusin(i,3)==UPA(1)&&k1>100)||((statusin(i,3)==UPA(2)&&k2>100))||(statusin(i,3)==UPB(1)&&m(1)>msum(1))||(statusin(i,3)==UPB(2)&&m(2)>msum(2))||(statusin(i,3)==UPB(3)&&m(3)>msum(3))||(statusin(i,3)==UPB(4)&&m(4)>msum(4)))
        if(statusin(i,1)==1||statusin(i,1)==2)
            smin=199999;
        UPAUPB=[UPA,UPB];
        xmin=1;
        for x=1:length(UPAUPB)
            if S(statusin(i,3),UPAUPB(x))<smin
                smin=S(statusin(i,3),UPAUPB(x));
                xmin=UPAUPB(x);
            end
        end
        statusout(i,3)=xmin;
        statusout(i,1)=4;
        statusout(i,2)=smin/v;
        end
        if(statusin(i,1)==4)
            smin=199999;
        UPAUPB=[UPA,UPB];
        xmin=1;
        for x=1:length(UPAUPB)
            if S(statusin(i,3),UPAUPB(x))<smin
                smin=S(statusin(i,3),UPAUPB(x));
                xmin=UPAUPB(x);
            end
        end
        statusout(i,3)=xmin;
        statusout(i,1)=4;
        statusout(i,2)=smin/v+statusin(i,2);
        end
    end
        


end


回溯函数如下:

function statusout = FF2(statusin,statusin2,S,v)
%statusin1是原状态,statusin2是转移后的状态
[N,three]=size(statusin);
k=1;
R=[];
statusout=statusin2;
for i=1:N
    R=[];
    if(statusin(i,1)==3||statusin(i,1)==4)
        for j=1:N
            if (S(statusin(j,3),statusin(i,3))~=0&&statusin(j,1)==1||statusin(j,1)==2)&&(statusin(i,2)*v>S(statusin(j,3),statusin(i,3)))%阻塞窗口在i的下一次路径上
                %计算超过的时间
                %当前剩余时间-到达时间
                uptime=statusin(j,2)-(statusin(i,2)-S(statusin(j,3),statusin(i,3))/v);
                if(uptime>0)
                    R=[R,j];
                end
            end
        end
        if ~isempty(R)
            statusout(i,1)=statusin(i,1);
            statusout(i,2)=S(min(R),statusin(i,3))/v;
            statusout(i,3)=statusin(i,3);
        end
    end
    if(statusin2(i,1)==2||statusin2(i,1)==1)&&statusin(i,2)==10
    for j=1:N
            if (i~=j&&(statusin(j,1)==1||statusin(j,1)==2)&&(statusin(i,3)==statusin(j,3)))
                statusout(i,1)=statusin(i,1);
                statusout(i,2)=10;
            end
        end
       
    end
    
end
end

  • 16
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 50
    评论
2019年MathorCup高校数学建模挑战赛D 2019年第九届MathorCup高校数学建模挑战赛 竞赛信息 竞赛简介 为了培养学生的创新意识及运用数学方法和计算机技术解决实际问的能力,中国优选法统筹法与经济数学研究会决定主办2019年第九届MathorCup高校数学建模挑战赛,欢迎各高等院校按照竞赛章程及有关规定组织同学报名参赛。 组织机构 主办单位:中国优选法统筹法与经济数学研究会 【中国优选法统筹法与经济数学研究会是在中国科学技术协会直接领导下的学术性社会团体,是国家一级学会。学会由华罗庚教授于1981年发起成立,至今成立了评价方法与应用、项目管理、计算机模拟、统筹、管理决策与信息系统、工业工程、高等教育管理、数学教育、经济数学与管理数学、 应急管理、灰色系统研究,复杂系统研究等十余个专业分会】 竞赛时间 报名时间:即日起至2019年 4 月 10日 12:00 竞赛时间:2019年4 月 11 日08:00至2019年 4 月 15 日08:00 参赛对象 普通高校全日制在校生(研究生、本科生、专科生)以队为单位参赛,每队不超过3人,不允许跨校组队参赛。 参赛费用 每支队伍需缴纳200元的报名费用。 奖项设置 参赛队伍:全国一等奖(约5%)、全国二等奖(约15%)、全国三等奖(约30%),从一等奖队伍中经过决赛答辩决出4支队伍获得“MathorCup”荣誉奖杯; 组织单位:优秀组织单位、优秀组织社团、优秀组织个人; 其它奖励政策:参见《 MathorCup高校数学建模挑战赛奖励细则》( 可从官方主页下载)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 50
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值