用sets和data解决钢管切割问题(根数最少)

来源:互联网 发布:安卓编程视频 编辑:程序博客网 时间:2024/05/01 01:28

客户除了要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钢管;

 

1 0
原创粉丝点击