数学建模社区-数学中国

标题: 关于lingo解决钢管实际问题 [打印本页]

作者: 数学不烦    时间: 2013-7-27 18:47
标题: 关于lingo解决钢管实际问题
本帖最后由 wujianjack2 于 2013-7-28 12:27 编辑

题目意思:某钢管零售商从钢管厂进货,将钢管按照顾客的要求切割后售出,从钢管厂进货时得到的原料钢管都是19m长。

问题:零售商如果采用的不同切割模式太多,将会导致生产过程的复杂化,从而增加生产和管理成本,所以该零售商规定采用的不同切割模式不能超过3种,此外,该客户需要 50根 4m长、20根6m长、15根8m长、10根5m长 的钢管,应该如何下料最节省?

下面是书上的答案,可是我运行的时候就提示没有可行解?代码我检查过了,没有打错的。麻烦一下各位前辈给出建议或自己的方法解决这个问题。谢谢。
(1)为什么下面的程序没有可行解?关键要点在哪里?应该怎样修改
(2)或者可以发表你的解题过程。

温馨提示:书上的答案是:最优解是:28根。


model:
title 钢管下料-最小化钢管根数的lingo模型;
sets:
!定义基本集合needs及其属性length,num;
needs/1..4/:length,num;
!定义基本集合cuts及其属性x;
cuts/1..3/:x;
!定义派生集合patterns(这是一个稠密集合)及其属性r;
patterns(needs,cuts):r;
endsets

data:
length=4 5 6 8;
num =  50 10 20 25;
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

作者: wujianjack2    时间: 2013-7-28 12:17
  嗯,不错的问题!
  楼主的代码是没有问题的,其实程序中唯一的错误是数据段中NUM=50 10 20 15,楼主误将第四个数据输入成25了,改正后得到如下结果(仅给出部分相关结果):
  Local optimal solution found.
  Objective value:                              28.00000
  Extended solver steps:                          11
  Total solver iterations:                           770


  Model Title: 钢管下料 - 最小化钢管根数的LINGO模型

                       Variable           Value        Reduced Cost
                          X( 1)        10.00000            0.000000
                          X( 2)        10.00000            2.000000
                          X( 3)        8.000000            1.000000

如果楼主还想了解其它方案,可以参见《LINGO和Excel在数学建模中的作用》这本书p52-p53,程序代码如下:

MODEL:
SETS:
CUTFA/1..3/:X;
!切割方法3种,X表示对应每种切割方法的钢管原材料根数;
BUJ/1..4/:L,NEED;
!四种部件,L是部件长度,NEED是每种部件的需求量;
SHUL(CUTFA,BUJ):N;
!第i种切割方法所切割出的第j种部件的数量用Nij表示;
ENDSETS
DATA:
L=4 5 6 8;   NEED=50 10 20 15;
ZL=19;  !ZL是每根钢管原材料的长度;
ENDDATA
MIN=@SUM(CUTFA:X);
!目标函数是3种切割方法所切割的钢管总根数最少;
@FOR(BUJ(J):@SUM(CUTFA(I):N(I,J)*X(I))>=NEED(J));
!切割出的每种部件总数满足需求量;
@FOR(CUTFA(I):@SUM(BUJ(J):N(I,J)*L(J))<=ZL);
!每种切割方法切割出的部件长度之和必须小于19;
@FOR(CUTFA(I):@SUM(BUJ(J):N(I,J)*L(J))>=16);
!每种切割方法切割出的部件长度之各大于15(余料小于4);
@FOR(SHUL:@GIN(N));@FOR(CUTFA:@GIN(X));
!N和X都是整数;
END

运行结果如下(部分重要结果):
  Local optimal solution found.
  Objective value:                              28.00000
  Extended solver steps:                          107
  Total solver iterations:                          2995


                       Variable           Value        Reduced Cost
                             ZL        19.00000            0.000000
                          X( 1)        10.00000            1.000000
                          X( 2)        10.00000            1.000000
                          X( 3)        8.000000            1.000000
                       N( 1, 1)        2.000000            0.000000
                       N( 1, 2)        1.000000            0.000000
                       N( 1, 3)        1.000000            0.000000
                       N( 1, 4)        0.000000            0.000000
                       N( 2, 1)        3.000000            0.000000
                       N( 2, 2)        0.000000            0.000000
                       N( 2, 3)        1.000000            0.000000
                       N( 2, 4)        0.000000            0.000000
                       N( 3, 1)        0.000000            0.000000
                       N( 3, 2)        0.000000            0.000000
                       N( 3, 3)        0.000000            0.000000
                       N( 3, 4)        2.000000            0.000000

另外,楼主在贴代码里最好选用高级模式,勾选右边的“禁用表情”,这样更方便大家阅读代码,谢谢支持!

作者: 数学不烦    时间: 2013-7-28 12:39
wujianjack2 发表于 2013-7-28 12:17
嗯,不错的问题!
  楼主的代码是没有问题的,其实程序中唯一的错误是数据段中NUM=50 10 20 15,楼主误将 ...

好的,非常谢谢你的建议。采纳!
作者: wujianjack2    时间: 2013-7-28 22:09
数学不烦 发表于 2013-7-28 12:39
好的,非常谢谢你的建议。采纳!

哈哈,多谢支持!共勉!
作者: 弹你脑瓜崩    时间: 2019-7-4 15:56
很适合学习





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5