[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 批处理怎样计算出材料最佳下料方法?

铝材长度 6米 和 5.4米
1.8米*10支
1.5米*20支
2.2米*30支
3.1米*15支

计算出最佳切割方法

注册时间非常早。
题目有意思
努力学习,努力挣分

TOP

神级这个单词小心搞得没人好意思做。
小弟愚昧,连问题都看不懂,囧了……

哦是不是说
1.5米*20支 这样的,  用5跟 6米的钢材分别切割成四份,最适合?

[ 本帖最后由 523066680 于 2010-5-24 20:54 编辑 ]

TOP

代码没有优化:
  1. @echo off
  2. for /f "tokens=1* delims=*" %%a in ('more +30^<"%~fs0"') do call:hanye %%a %%b
  3. pause&exit
  4. :hanye
  5. setlocal enabledelayedexpansion
  6. set n=%1&set m=%2&set n=!n:~0,-1!&set m=!m:~0,-1!&set n=!n:.=!
  7. :s60
  8. set/a n_60+=1
  9. set/a y_60_!n_60!=60-n*n_60,k_60=n_60,x_60_!n_60!=1
  10. if !y_60_%n_60%! geq %n% goto:s60
  11. set/a n_60+=1,y_60_0=y_60_!k_60!,v_60=2
  12. for /l %%a in (%n_60%,1,%m%) do (set/a n_60=%%a,y=%%a%%k_60,w_60+=1
  13. set/a y_60_%%a=y_60_!y!
  14. if !w_60! gtr !k_60! (set/a v_60+=1,x_60_%%a=v_60,w_60=1) else set x_60_%%a=!v_60!)
  15. set/a y_60_0=0,x_60_0=0
  16. :s54
  17. set/a n_54+=1
  18. set/a y_54_!n_54!=54-n*n_54,k_54=n_54,x_54_!n_54!=1
  19. if !y_54_%n_54%! geq %n% goto:s54
  20. set/a n_54+=1,y_54_0=y_54_!k_54!,v_54=2
  21. for /l %%a in (%n_54%,1,%m%) do (set/a n_54=%%a,y=%%a%%k_54,w_54+=1
  22. set/a y_54_%%a=y_54_!y!
  23. if !w_54! gtr !k_54! (set/a v_54+=1,x_54_%%a=v_54,w_54=1) else set x_54_%%a=!v_54!)
  24. set/a y_54_0=0,x_54_0=0
  25. for /l %%a in (0,1,%m%) do (set/a b=m-%%a
  26. set/a z_%%a=y_60_%%a+y_54_!b!)
  27. for /F " tokens=1-3 delims==_" %%a in ('set z_') do if not defined bc (set bc=%%c&set a=%%b) else if %%c lss !bc! set bc=%%c&set a=%%b
  28. set/a b=m-a
  29. echo.%1*%2:需要6米的铝材 !x_60_%a%! 根;需要5.4米的铝材 !x_54_%b%! 根.
  30. Endlocal&goto:eof
  31. 1.8米*10支
  32. 1.5米*20支
  33. 2.2米*30支
  34. 3.1米*15支
复制代码
结果:
1.8米*10支:需要6米的铝材 0 根;需要5.4米的铝材 4 根.
1.5米*20支:需要6米的铝材 5 根;需要5.4米的铝材 0 根.
2.2米*30支:需要6米的铝材 0 根;需要5.4米的铝材 15 根.
3.1米*15支:需要6米的铝材 0 根;需要5.4米的铝材 15 根.

[ 本帖最后由 hanyeguxing 于 2010-5-25 04:27 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 3楼 的帖子

就是这样 要算出最节约材料的方法

TOP

以1.0米分别分割10支、11支、12支、13支时,结果如下:
10支时需要6米的铝材 0 根;需要5.4米的铝材 2 根.
11支时需要6米的铝材 1 根;需要5.4米的铝材 1 根.
12支时需要6米的铝材 2 根;需要5.4米的铝材 0 根.
13支时需要6米的铝材 0 根;需要5.4米的铝材 3 根.

[ 本帖最后由 hanyeguxing 于 2010-5-25 03:10 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

一种考虑的是:6米和5.4米等价,切完4种情况,总舍弃的米数和最少
还有一种考虑的是:假设6米和5.4米的等价,切完4种情况,总使用的根数和最少
虽然我不知道两种结果是否都是一样,但是两种结果的切法都不一样时,按哪一种,比如如下两种情况:
  1. 15根6米切2.2的30根+1.5米15根,丢掉的是15*0.1米,剩余
  2. 1.8 10
  3. 1.5 5
  4. 3.1 15
  5. 15根5.4米切剩下的所有,则舍弃总和是10*0.5+5*0.8+15*0.1=10.5
  6. 使用根数总和是:15+5+10=30根
复制代码

  1. 15根5.4米切3.1的15根+2.2的15根,3根5.4米切1.8的9根,5根6米切1.5米的20根,丢掉的是15*0.1米
  2. 2.2 15
  3. 1.8 1
  4. 7根5.4米切2.2的14根,舍弃7*1米,1根5.4米切2.2的1根+1.8的1根,舍弃1.4米。舍弃总和事7*1+1.4+15*0.1=9.9米。
  5. 使用根数总和是:15+3+5+7+1=31
复制代码

[ 本帖最后由 sgaizxt001 于 2010-5-25 04:58 编辑 ]
努力学习,努力挣分

TOP

回复 7楼 的帖子

4楼的代码仅是分割一种的情况,没有去处理四种情况同时存在。楼主也没做这个说明。

[ 本帖最后由 hanyeguxing 于 2010-5-25 03:21 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 4楼 的帖子

你的算法太简单了 只是计算同样的材料切割需要多少支 BAT如果能写出来 那真是神了

TOP

回复 9楼 的帖子

我感觉答案就是那样啦。
莫非 6 米的钢材可以配合 5.4米的钢材? 但那不是分开的吗……
还是说还有细节,请列举一个“特别处理”“的情况。

批处理算24,平分水,什么的都有呀…… 感觉就算做这道题也没什么称神的。

TOP

楼主,你可否提供正确答案给我参考参考
努力学习,努力挣分

TOP

原帖由 xxx3212 于 2010-5-24 20:41 发表
铝材长度 6米 和 5.4米
1.8米*10支
1.5米*20支
2.2米*30支
3.1米*15支

计算出最佳切割方法

1,楼主没有说明1.8、1.5、2.2、3.1是分别计算,还是统一计算。4楼代码是按分别计算设计的。
2,
原帖由 xxx3212 于 2010-5-25 08:38 发表
你的算法太简单了 只是计算同样的材料切割需要多少支 BAT如果能写出来 那真是神了
楼主这里说的“同样的材料”是什么意思?是第一条里的,还是指4楼的代码没有统一计算6米和5.4米的使用?如果是后者,那推荐楼主还是把4楼的代码看完整了再说。
3,4楼代码的设计思路:

1,定义单根范围内6米的分割余数
2,定义最大范围内6米的分割余数
3,定义单根范围内5.4米的分割余数
4,定义最大范围内5.4米的分割余数
5,统计只使用6米只使用5.4米同时使用6米和5.4米时的余数
6,比较余数
7,获取最小余数时的分割
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

这种题真的是为难批处理了~~~
搞了半天,还是不能通用!!只能就题解答
  1. @echo off&setlocal enabledelayedexpansion
  2. ::////////////////////////
  3. for /f "tokens=1-2 delims=米*支" %%a in (%~nx0) do (
  4.         if "%%a" equ "铝材:" set s=lc&set n=
  5.         if "%%a" equ "切割:" set s=cg&set/a lcx=!n!-1&set n=
  6.         if defined s if defined n set !s!!n!=%%a&set !s!!n!n=%%b&set vars=!vars! !s!!n!
  7.         set /a n+=1
  8. )
  9. set/a cgx=!n!-1
  10. :::://////把数据读入到变量
  11. ::set lc
  12. ::set cg
  13. ::set vars
  14. ::pause
  15. ::////////////////////////
  16. for %%a in (%vars%) do (
  17.         for /f "delims=. tokens=1,2" %%c in ("!%%a!") do (set ver=%%d0)
  18.         set d=0
  19.         for /l %%b in (0,1,10) do (
  20.                 if "!ver:~%%b,1!" neq "" set d=%%b
  21.         )
  22.         set d%%a=!d!
  23.         if !d! gtr !dot! set dot=!d!
  24. )
  25. set ver=0000000000
  26. for %%a in (%vars%) do (
  27.         set /a n=dot-d%%a
  28.         for %%b in (!n!) do set d%%a=!%%a:.=!!ver:~,%%b!
  29. )
  30. ::set d
  31. ::pause
  32. ::////////////小数位调整
  33. ::////////////////////////
  34. for /l %%a in (1,1,!cgx!) do (
  35.         for /l %%b in (1,1,!cgx!) do (
  36.                 if !cg%%a! leq !cg%%b! set /a bcg%%a+=1
  37. ))
  38. set n=0
  39. for /l %%a in (1,1,!cgx!) do (
  40. for %%b in (mum!bcg%%a!) do (
  41.         set /a n+=1
  42.         set %%b=!%%b! cg%%a
  43. ))
  44. for /l %%a in (1,1,!n!) do set vv=!vv! !mum%%a!&set bcg%%a=&set num%%a=
  45. ::echo; !vv!
  46. ::pause
  47. ::///////要切割规格排序
  48. for %%a in (%vv%) do (
  49.         set vvn=!vv:*%%a=!
  50.         set gnn=!d%%a!
  51.         for /l %%b in (1,1,!lcx!) do (
  52.                 set /a nn=dlc%%b %% d%%a
  53.                 if !nn! lss !gnn! set gnn=!nn!&set gxx=lc%%b
  54.                 for %%c in (!vvn!) do (
  55.                         set /a mm=nn %% d%%c
  56.                         if !mm! lss !gnn! set gnn=!mm!&set gxx=lc%%b %%c
  57. ))
  58. rem 首先切规格最长的,并且配合其它规格,选最省切法
  59. for /f "tokens=1,2" %%b in ("!gxx!") do (
  60.         set/a ##v=d%%b/d%%a,##y=d%%b %% d%%a,##y=##y/d%%c
  61.         
  62.         set/a ##s1=%%an/##v,##s2=##s1,##xy=%%an %% ##v
  63.         set gvv=!d%%a!
  64.         if !##xy! neq 0 (
  65.                 set/a ##k=%%an-##s1*##v
  66.                 set/a ##s1+=1,##k=d%%b-##k*d%%a
  67.                 for %%d in (!vvn! lc1) do (
  68.                         set /a mm=##k %% d%%d
  69.                         if !mm! leq !gvv! set gvv=!mm!&set gxx=%%d
  70.                 )
  71.         )
  72.         set/a ##x1=%%an,##x2=##s2*##y,%%an=0
  73.         set/a #d%%b=##s1+#d%%b,%%cn=%%cn-##x2,#lf1=gnn*##s2
  74.         echo;使用!%%b!米铝材 !##s1!根
  75.         set /p =切成:!%%a!米长!##x1!根,还差0根<NUL
  76.          if !##y! neq 0 (echo;,!%%c!米长!##x2!根,还差!%%cn!根<NUL) echo;
  77.         if !gvv! neq !d%%a! (
  78.         for %%d in (!gxx!) do (
  79.                 echo;二次利用:!##k:~,-%d%!.!##k:~-%d%!米 切得:
  80.                 set/a ##k1=##k/d%%d, ##k2=##k %% d%%d,%%dn=%%dn-##k1
  81.                 echo;        !%%d!米长!##k1!根  还差:!%%dn!根,仍剩:0!##k2:~,-%d%!.!##k2:~-%d%!米
  82.                 set/a #lf1=#lf1+##k2
  83.         ))
  84.         echo;本次浪费:0!#lf1:~,-%d%!.!#lf1:~-%d%!米
  85.         echo;
  86.         set/a #lf=#lf+#lf1
  87. )
  88. )
  89. for /l %%a in (1,1,!lcx!) do (
  90.         echo;共用材料:!lc%%a!米,!#dlc%%a!根
  91. )
  92. echo;共浪费材料:!#lf:~,-%d%!.!#lf:~-%d%!米
  93. pause
  94. exit/b
  95. ::数据定义
  96. 铝材:
  97. 6米
  98. 5.4米
  99. 切割:
  100. 1.8米*10支
  101. 1.5米*20支
  102. 2.2米*30支
  103. 3.1米*15支
复制代码

[ 本帖最后由 netbenton 于 2010-5-26 23:01 编辑 ]
1

评分人数

    • more: 五体投地...PB + 30 技术 + 1

TOP

不错,用了29跟材料,共浪费2.7米
不过if !##y! neq 0 (echo;,!%%c!米长!##x2!根,还差!%%cn!根<NUL) echo;这里手误多了个echo;
代码先复制下来慢慢研究
努力学习,努力挣分

TOP

线性规划 来了

TOP

返回列表