列生成算法求解矩形下料问题(Matlab代码)

深切哀悼抗击新冠肺炎疫情斗争牺牲烈士和逝世同胞

这学期接了《运筹学》课程,在国内抗疫的大环境下,勉勉强强当了七周主播,刚刚讲完对偶理论

这里必须要吐槽一下《线性代数》的老师,本科生的课程不要放水好不好?讲单纯形法足足用了三周课,每堂课都要给学生科普或者强化线代基础。

为了强化学生对对偶理论的理解,计划在接下来三周课程里介绍大规模问题的优化方法,Dantzig-Wolfe分解Benders分解ADMM(Alternating direction method of multipliers)。
(想想后面还要讲整数规划、动态规划、网络规划、非线性规划、排队论、……,头都大。)

说到Dantzig-Wolfe分解,不得不提的就是列生成算法,最早用来解决一维下料问题(cutting stock problem)。但一维下料问题似乎太乏味了,怕学生们提不起兴趣,这里就找了一篇解决矩形下料问题的文章,复现了一下。

Cintra G F , Miyazawa F K , Wakabayashi Y , et al. Algorithms for two-dimensional cutting stock and strip packing problems using dynamic programming and column generation[J]. European Journal of Operational Research, 2008, 191(1):61-85.
https://doi.org/10.1016/j.ejor.2007.08.007

同行们一定都很熟悉这篇文章,很好的解决了gcut中13个算例,并且提出了变尺寸母板的解决策略。

这里只实现了最基本的几段代码。

Matlab代码

// 生成离散点集
function P=DPP(D,d)
P=0;
m = length(d);
for j=0:D
    c(j+1)=0;
end
for i=1:m
    for j=d(i):D
        if c(j+1)<c(j-d(i)+1)+d(i)
            c(j+1)=c(j-d(i)+1)+d(i);
        end
    end
end
mind = min(d);
for j=1:D-mind
    if c(j+1)==j
        P=[P,j];
    end
end
P=[P,D];
// 矩形背包问题算法
// 为方便回溯方案,将item修改为三维整数矩阵,前两维对应状态空间,第三维为该状态空间最大价值时满足各订单的数量 
// guillotine 改为整数二维数组,其中0 ———— 不切;1 ———— 对w方向切割;2 ———— 对h方向切割
function [z,V,item,guillotine,position]=DP(W,H,w,h,v)
m=length(w);
P=DPP(W,w);
Q=DPP(H,h);
r=length(P);
s=length(Q);
V=zeros(r,s);
item=zeros(r,s,m);
guillotine=zeros(r,s);
position=zeros(r,s);
for i=1:r
    for j=1:s
        [V(i,j),item(i,j,:)]=inital_dp(w,h,v,P,Q,i,j); //调用第三段程序初始化状态空间
        guillotine(i,j)=0;
    end
end
for i=2:r
    for j
  • 41
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值