客户除了要50根4m长、20根6m长、15根8m长,还需要10根5m长的钢管,应该如何下料最节省?
解:这里以总根数最少为标准。
用lingo12解决如下:
model:
!钢管下料问题,以钢管根数最少为目标;
sets:
!定义基本集合Needs,及其属性length、num;
Needs/1..4/:length,num;
Cuts/1..3/:x;
!定义派生集合Pattern,及其属性R;
Patterns(Needs,Cuts):R;
endsets
data:
length= 4 5 6 8;
num= 50 10 20 15;
capacity= 19;
enddata
min=@sum(Cuts(i):x(i));
!满足需求约束;
@for(Needs(i): @sum(Cuts(j):x(j)*R(i,j))>num(i));
!满足切割模式约束;
@for(Cuts(j): @sum(Needs(i):length(i)*R(i,j))<capacity);
@for(Cuts(j):@sum(Needs(i):length(i)*R(i,j))>capacity
-@min(Needs(i):length(i)));
@sum(Cuts(i): x(i))>26; @sum(Cuts(i): x(i))<31;
@for(Cuts(i)| i #lt# @size(Cuts): x(i)>x(i+1));
@for(Cuts(j): @gin(x(j)));
@for(Patterns(i,j): @gin(R(i,j)));
end
--------------------------------------------------------------------------------------
结果如下:
-----------------------------------------------------------------------------------------------------------
解释如下:
即按照模式1、2、3分别切割10、10、8根原料钢管,使得原料钢管总根数是28根。
第一种切割模式下,1根原料钢管,切割成2根4m钢管、1根5m钢管、1根6m钢管;
第二种切割模式下,1根原料钢管,切割成3根4m钢管、1根6m钢管;
第三种切割模式下,1根原料钢管,切割成2根8m钢管;