框架画家的画布(优化或AI?)

时间:2014-05-29 12:16:26

标签: php perl vbscript artificial-intelligence mathematical-optimization

这是一个我想制定的问题: 画家打算用厘米来画出不同大小的方形画布:

25cm x 35cm - 20个,    50 x 30 - 30个,    90 x 50 - 40个,    110 x 60 - 25个,

画家将购买200厘米的木质担架,并相应地切割。 条件是"每个边框边缘应该是单个连续条。没有粘合"。

无限长木制担架,长度为200厘米。 画家应该买多少(200厘米)的酒吧? 如何计算优化的棒数,最少浪费吧?

这个问题与优化(数学编程)还是AI有关? PHP,Perl,vbscript代码欢迎。

============== 为了清楚起见,这里是从200厘米棒生产的确切长度。

LENGTH      PIECES        TOTAL LENGTH 
110  cm      50   pcs      5500   cm
90   cm      80   pcs      7200   cm
60   cm      50   pcs      3000   cm
50   cm      140  pcs      7000   cm
35   cm      40   pcs      1400   cm
30   cm      60   pcs      1800   cm
25   cm      40   pcs      1000   cm
===========================================
            ALL TOTAL:     26900   cm
如果我们允许粘合剩余的小块,它等于134.5巴。

指导画家应该从每个条形切割的长度是切实可行的。 否则他将不知道如何处理所提供的酒吧。

2 个答案:

答案 0 :(得分:1)

你需要宽度的担架条来计算角度的长度(为canavas的每一边花费额外的2*$stretcher_width

use strict;
use warnings;

my $stretcher_length = 200;
my $stretcher_width = 0;
my $wasted_per_side = 2*$stretcher_width;
my @sc = (
   {w=> 25,  h=> 35, pcs=> 20},
   {w=> 50,  h=> 30, pcs=> 30},
   {w=> 90,  h=> 50, pcs=> 40},
   {w=> 110, h=> 60, pcs=> 25},
);
# all possible bars needed from longest to shortest
my @all = sort { $b <=> $a } map {
  (
    ($_->{w}+$wasted_per_side) x2, ($_->{h}+$wasted_per_side) x2
  )x $_->{pcs};
}
@sc;

# lets cut from 200cm bars
my @rest;
for my $len (@all) {

  my $cut_from;
  # do we already have bar which can be used?
  for my $len_have (@rest) {
    # yes, we have
    if ($len_have >= $len) { $cut_from = \$len_have; last; }
  }
  # no, we need another 200cm bar
  if (!$cut_from) {
    print "Taking new $stretcher_length cm bar\n";
    push @rest, $stretcher_length;
    $cut_from = \$rest[-1];
  }
  # cut it
  print "Now you have at least one bar $$cut_from long and cut away $len\n";
  $$cut_from -= $len;

  # keep @rest bars sorted from shortest to longest
  @rest = sort { $a <=> $b } @rest;
}

print scalar @rest;
# print "@rest\n"; # left overs

答案 1 :(得分:0)

实际上它正在减少库存问题 Wikipedia article

有一个C实现 CPSOL 用135支装解决上述问题。

遗憾的是,未能找到Perl实现