SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 3126|回复: 18
打印 上一主题 下一主题

求助:一道比较难的计算题? 后面另附:反推的问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-1-20 01:09:49 | 只看该作者

求助:一道比较难的计算题? 后面另附:反推的问题

一批铁丝,数量不限,每一根铁丝长 1650 mm ,现需要截取下列品种、长度、数量的铁丝:

品种         长度/mm        需要数量/根
a1        303        10
a2        251        10
a3        202        10
a4        151        10
a5        107        10

注:铁丝的长度、品种的个数、品种的长度、需要数量都是变量。

怎样计算,在达到需要截取的品种、长度、数量的前提下,使用的铁丝根数最少,浪费的最小?

求助:怎样用SAS编写这样的计算程序? 哪里有用SAS编写的这方面的资料?


谢谢!!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-1-20 08:47:05 | 只看该作者

Re: 求助:一道比较难的计算题?

这难吗?小学初中的二元一次解方程而已啊。既不需要建模,也不需要运筹,甚至没必要用SAS来做。 <!-- s:shock: --><img src="{SMILIES_PATH}/icon_eek.gif" alt=":shock:" title="Shocked" /><!-- s:shock: -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-1-20 13:07:16 | 只看该作者

Re: 求助:一道比较难的计算题?

data sxl;
input _ROW_$ x1 x2  x3 x4 x5 x6 _TYPE_$ _RHS_;
cards;
object   0 0 0 0 0 1   MIN  .
proc1    303 251 202 151 107 -1650  lE    0
proc2    1 0 0 0 0 0   GE   10
proc3    0 1 0 0 0 0   GE   10
proc4    0 0 1 0 0 0   GE   10
proc5    0 0 0 1 0 0   GE   10
proc6    0 0 0 0 1 0   GE   10
bound    100 100 100 100 100 100 UPPERBD .
inbd     1 2 3 4 5 6 INTEGER .
;
proc print;
proc lp data=sxl;
run;


RESULT:

   Variable                                      Reduced
ol Name     Status Type        Price  Activity      Cost

1 x1       ALTER  INTEGER         0        11         0
2 x2       ALTER  INTEGER         0        11         0
3 x3       ALTER  INTEGER         0        12         0
4 x4       ALTER  INTEGER         0        11         0
5 x5       BASIC  INTEGER         0        10         0
6 x6                  INTEGER         1         7         1

最少需要7根。

你用lingo或者lindo CHECK 一下,应该没问题。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-1-20 20:34:26 | 只看该作者

Re: 求助:一道比较难的计算题?

谢谢sxlion 老师的解答!!!!!!
   
      真是“难者不会,会者不难”!真羡慕您们!

我是想问?怎样编程得到截取的方法,也就是怎样在每根铁丝上合理地截取哪些品种,截多少根,这样使每根铁丝的浪费最小?

例如:我一个品种一个品种地套,套出了一种截取方法:
第1根  303截取4根  202截取2根  用去长度1616  浪费34mm
第2根  303截取4根  202截取2根  用去长度1616  浪费34mm
第3根  303截取2根  251截取3根  151截取1根  107截取1根  用去长度1617  浪费33mm
第4根  251截取5根  202截取1根  151截取1根  用去长度1608 浪费42mm
第5根  251截取2根  202截取4根  151截取2根  用去长度1612 浪费38mm
第6根  202截取1根  151截取6根  107截取5根  用去长度1643 浪费7mm
第7根  107截取4根  用去长度428  还剩1222mm       
这样5个品种都截取了10根,用去7根,共计浪费了188mm,第7根还剩1222mm,

如果品种多,数量大,就没法套了。所以求助高人帮助!!  谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-1-23 21:59:43 | 只看该作者

Re: 求助:一道比较难的计算题?

求助高人:帮帮忙!!
如何让程序循环 , 排列出所有在每根铁丝上截取的方法?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-1-24 02:48:52 | 只看该作者

Re: 求助:一道比较难的计算题?

to tianlai888
楼主您的贴已经很成功啦,已经套住总管(当然不能总管可能是发明新的算法,您可能要花钱跟他买)和sxlion了,就不要再有别的奢求啦。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-1-28 20:52:09 | 只看该作者

Re: 求助:一道比较难的计算题?

这道题目是钢管下料问题。可以做的。
解决方法如下 1首先取得钢管长度1650米
四种需求长度,求得所有钢管的可行策略
算法如下首先取最多的a1钢管数x1,然后取x1-1,然后x2-2直到0
对内层算在1650-x1*a1下最多a2的钢管数,a2-1,a2-2
枚举的算出所有可行的策略。
求y1+y2 +.....yn的最小数目(代表策略n的钢管根数)
设策略n的带来a1的钢管数为yvn1
那么sum(yn*yvn1)&gt;=10(就是每种策略可以带来a1钢管的数,和采取这种策略的钢管数目的乘积之和大于10)
同理sum(yn*yvn2)&gt;=10
sum(yn*yvn3)&gt;=10
sum(yn*yvn4)&gt;=10 yn&gt;=0
然后问题转化为每种策略用几根钢管的整数规划问题。y大于等于0,然后通过lindo的整肃规划编程就可以求出yn了,把大于o的钢管数目的策略和yn求出就可以了。整数规划已经是运筹学中可以解决的问题了,lindo也不难学,而且解决规划问题lindo要比sas专业。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-1-29 10:56:28 | 只看该作者

Re: 求助:一道比较难的计算题?

我是老昏了头,给苦根煮了这么多豆子,我老得又笨又蠢,害死了苦根。
我一直还以为整数规划只是在机缘巧合的情况下才能在我老死之前算出来呢,却不知现代高科技已精进如斯。
恳请楼主原谅一个庄稼人的胡说八道。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-1-29 14:06:26 | 只看该作者

Re: 求助:一道比较难的计算题?

先给各位老师拜个年! 祝各位老师牛年身体健康!万事如意!!
徐福贵老师,您好! 千万别这样说,您的回复我感谢还来不急呢。

   我也觉得您说的有道理(这样的程序可能一辈子也跑不完)。
在长度1650米的钢管上,截取五个品种的需求长度,如果按每根允许浪费30mm的情况下,我枚举了所有的可行策略。

data  aa (drop=a1-a5 w);
a1=int(1650/303);
a2=int(1650/251);
a3=int(1650/202);
a4=int(1650/151);
a5=int(1650/107);
w=1650-30; /*每根允许浪费30mm*/
  do c=0 to a1;
  do d=0 to a2;  
  do e=0 to a3;  
  do f=0 to a4;  
  do g=0 to a5;
x=303*c+251*d+202*e+151*f+107*g;
y=1650-x;
if x&gt;w and x&lt;=1650 then
  output;
end;   
end;
end;
end;
end;
run;
proc sort data=aa out=aa1;
by y ;
run;

这样在每根上有95种截取方式,现在有五个品种每种都要10根,就需要1650mm的钢管至少7根。
如果再枚举所有的排列方式(95^7),将是一个天文数字可能一辈子也跑不完。所以我也是个又笨又蠢的人。我实在想不出其他方法。

再想请教 xgghxkhuang 和各位老师:
   接下来如何应用运筹学的整数规划或者用其他思路,解决在7根钢管上,每根截取哪些品种,多少根。这样既完成任务,又节约材料。
它需要枚举所有的可行策略吗?能不能稍微讲详细点。
谢谢!!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2009-2-2 15:26:18 | 只看该作者

Re: 求助:一道比较难的计算题?

楼主千万别随便叫人老师,泥巴腿子消受不起。我就没有老师,要有也早给我气死啦。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 08:52 , Processed in 0.096915 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表