免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 7659 | 回复: 31
打印 上一主题 下一主题

求解不等式算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-28 22:00 |只看该作者 |倒序浏览
我需要解决一个线材切割问题,例如一根钢材10m,我要切割2.5m,2.6m,1.9m三种尺寸,剩下的废料要小于最小的尺寸。有以下11种切割方案。
        x1        x2        x3        x4        x5        x6        x7        x8        x9        x10        x11
2.5        4        3        2        2        1        1        1        0        0        0        0
2.6        0        0        1        0        2        0        1        3        2        1        0
1.9        0        1        1        2        1        3        2        1        2        3        5
sum        10        9.4        9.5        8.8        9.6        8.2        8.9        9.7        9        8.3        9.5
remain        0        0.6        0.5        1.2        0.4        1.8        1.1        0.3        1        1.7        0.5

表述为数学形式就是,10-(2.5a+2.6b+1.9c)<1.9;10-(2.5a+2.6b+1.9c)>=0;a,b,c=0,1,2,3....。
我想要写一个程序,求出这种算法的所有方案,即a,b,c的所有组合。实际使用中,可能不止三种尺寸,视输入而定。输出格式类似于表格,也可以转置成纵向表格,这样方便输出。求大侠给些编程思路。

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
2 [报告]
发表于 2013-11-28 23:30 |只看该作者
实际使用中,可能不止三种尺寸,视输入而定。
这是难点,尺寸的数目决定循环的个数。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
3 [报告]
发表于 2013-11-29 00:30 |只看该作者
本帖最后由 rubyish 于 2013-12-01 19:30 编辑

No Optimization!
看看:
  1. #!/usr/bin/perl
  2. my $length = 10;
  3. my @cut = qw/2.5 2.6 1.9/;
  4. @cut = sort { $b <=> $a } @cut;
  5. my ( $max, $count ) = ( $length - $cut[-1], '001' );

  6. sub try {
  7.     @_ ? map { my $h = $_; map [ $h, @$_ ], try(@_) } @{ +shift } : [];
  8. }

  9. print join( "\t", '     sum', 'rem', @cut ), $/;
  10. print $count++, '| ', join( "\t", @$_ ), $/
  11.   for sort { $b->[0] <=> $a->[0] } map {
  12.     my ( $gimme, $sum ) = $_;
  13.     $sum += $cut[$_] * $gimme->[$_] for 0 .. $#{$gimme};
  14.     $max < $sum && $sum <= $length
  15.       ? [ sprintf( "%.1f", $sum ), sprintf( "%.2f", $length - $sum ), @$gimme ]
  16.       : ()
  17.   } try map [ 0 .. $length / $_ ], @cut;
复制代码
  1.      sum        rem     2.6     2.5     1.9
  2. 001| 10.0       0.00    0       4       0
  3. 002| 9.7        0.30    3       0       1
  4. 003| 9.6        0.40    2       1       1
  5. 004| 9.5        0.50    0       0       5
  6. 005| 9.5        0.50    1       2       1
  7. 006| 9.4        0.60    0       3       1
  8. 007| 9.0        1.00    2       0       2
  9. 008| 8.9        1.10    1       1       2
  10. 009| 8.8        1.20    0       2       2
  11. 010| 8.3        1.70    1       0       3
  12. 011| 8.2        1.80    0       1       3
复制代码

论坛徽章:
0
4 [报告]
发表于 2013-11-29 16:55 |只看该作者
本帖最后由 cujeson 于 2013-11-29 16:56 编辑

回复 3# rubyish


    大神,完全看不懂啊!有空能否给小白解析一下(主要第7行及以后的不懂)?你写的代码实在太高深了

论坛徽章:
0
5 [报告]
发表于 2013-11-30 09:39 |只看该作者
谢谢!没读大骆驼,完全看不懂,只能惊呼大神了!

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
6 [报告]
发表于 2013-12-01 02:57 |只看该作者
本帖最后由 rubyish 于 2013-12-01 19:35 编辑

回复 4# cujeson

line 8: recursive cartesian product sub, 只可意会,不可以言传也。
千言万语,都不能说清楚了。
http://tv.sohu.com/20130711/n381345559.shtml

usage:
  1. my @a = try [ 1, 2 ], [ 'a', 'b' ], [ 'A', 'B' ];
  2. say join ' | ', map "@$_", @a;
  3. # 1 a A | 1 a B | 1 b A | 1 b B | 2 a A | 2 a B | 2 b A | 2 b B
复制代码
a simple version: try2
perldoc -f glob
  1. sub try2 {
  2.     my ( $head, $tail ) = qw[{ }];
  3.     my @param = @_;
  4.     my @body  = map { join( '|,', @$_) .'|' } @param;
  5.     my $body  = join '}{', @body;
  6.     my @all   = glob $head . $body . $tail;
  7.     my @ret   = map { [ split /\|/, $_ ] } @all;
  8.     return @ret;
  9. }
复制代码
try2_oneline = try2
  1. sub try2_oneline {
  2.     map [ split /\|/ ], glob '{' . join( '}{', map join( '|,', @$_ ) . '|', @_ ) . '}';
  3. }
复制代码
line 12-19: 句型 print ... for @A

  • @A: 句型 sort {...} @B
  • @B: 句型 map {...} @C
  • @C: 句型 try @D
  • @D: 句型 map {...} @cut


line 12-19 =
  1. print ... for sort {...} map {...} try map {...} @cut
复制代码
EQV
  1. my @D = map {...} @cut;
  2. my @C = try @D;
  3. my @B = map {...} @C;
  4. my @A = sort {...} @B;

  5. print ... for @A;
复制代码
  • @D: [ 0, 1, 2, 3, 4 ], [ 0, 1, 2, 3 ], [ 0, 1, 2, 3, 4, 5 ]
  • @C: [ 0, 0, 0 ], [ 0, 0, 1 ], [ 0, 0, 2 ] ...  [ 4, 3, 5 ]
  • @B: [ 9.5, 0.50, 0, 0, 5 ], [ 8.3, 1.70, 0, 1, 3 ] ...  [ 10, 0.00, 4, 0, 0 ]
  • @A: [ 10, 0.00, 4, 0, 0 ], [ 9.7, 0.30, 0, 3, 1 ] ...  [ 8.2, 1.80, 1, 0, 3 ]


line15: sum = 2.5 * a + 2.6 * b + 1.9 * c ....

line 17-18: true ? A : B
  1. my @even = map {  $_ % 2 == 0 ? "E$_" : () } 1 .. 10;
  2. my @eve2 = map { "E$_" } grep { $_ % 2 == 0 } 1 .. 10;

  3. say join '|', @even;
  4. # E2|E4|E6|E8|E10

  5. say join '|', @eve2;
  6. # E2|E4|E6|E8|E10
复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
7 [报告]
发表于 2013-12-01 10:05 |只看该作者
切割算法是一种非常有用的算法, 可广泛用于板材切割,钢结构制作领域,三维的堆积算法,可用于货物装箱,集装箱配载领域.

通常是给定一个面积或体积,按照一个原则,计算出空间利用率最高的方案.

希望大家都来尝试一下这个算法.我曾经做过这个算法,但比较复杂.

这个算法如果证明效率高, 正确,可以成为了一个有用的产品项目.

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
8 [报告]
发表于 2013-12-01 11:49 |只看该作者
回复 7# 104359176
那你评价一下rubyish的那个算法如何?

   

论坛徽章:
0
9 [报告]
发表于 2013-12-01 11:51 |只看该作者
回复 6# rubyish


    无论如何,先感谢再拜读

论坛徽章:
0
10 [报告]
发表于 2013-12-01 23:03 |只看该作者
回复 6# rubyish


    解释的好详细,我还有一点不明白,@$_这是什么意思?形似数组引用,但好像不是的。谢谢大神细心解答!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP