Php 框架画家';s画布(优化还是AI?)

Php 框架画家';s画布(优化还是AI?),php,perl,vbscript,artificial-intelligence,mathematical-optimization,Php,Perl,Vbscript,Artificial Intelligence,Mathematical Optimization,我想提出一个问题: 这位画家打算以厘米为单位为其不同尺寸的方形画布装框: 25厘米x35厘米--20件, 50 x 30--30件, 90 x 50--40件, 110 x 60--25件 画家将购买200厘米的木制担架杆,并相应地切割。 条件是“每个框架边缘应为单个连续条,无胶合” 长度为200厘米的无限木制担架杆。 画家应该买多少条(200厘米)? 如何以最少的棒材损耗计算优化的棒材数量 这个问题与优化(数学规划)或人工智能有关吗? 欢迎使用PHP、Perl、vbscript代码 =====

我想提出一个问题: 这位画家打算以厘米为单位为其不同尺寸的方形画布装框:

25厘米x35厘米--20件, 50 x 30--30件, 90 x 50--40件, 110 x 60--25件

画家将购买200厘米的木制担架杆,并相应地切割。 条件是“每个框架边缘应为单个连续条,无胶合”

长度为200厘米的无限木制担架杆。 画家应该买多少条(200厘米)? 如何以最少的棒材损耗计算优化的棒材数量

这个问题与优化(数学规划)或人工智能有关吗? 欢迎使用PHP、Perl、vbscript代码

============== 出于澄清目的,以下是200cm钢筋的确切长度

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*$stretcher\u width

使用严格;
使用警告;
我的$stretcher_长度=200;
my$stretcher_width=0;
my$wasted_每侧=2*$stretcher_宽度;
我的@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},
);
#从最长到最短所需的所有可能的钢筋
my@all=sort{$b$a}映射{
(
($\>{w}+$每侧浪费的_)x2,($\>{h}+$每侧浪费的_)x2
)x$$->{pcs};
}
@sc;
#让我们从200厘米的钢筋上切割
我的休息;
我的$len(@all){
我的美元从;
#我们已经有可以使用的酒吧了吗?
我的$len_have(@rest){
#是的,我们有
如果($len\u have>=$len){$cut\u from=\$len\u have;last;}
}
#不,我们需要另一个200厘米的酒吧
如果(!$cut_from){
打印“使用新的$STRETHER\u长度cm条\n”;
静止时推压,$STRETHER_长度;
$cut\u from=\$rest[-1];
}
#别说了
打印“现在您至少有一个条形图$$cut\u from long和cut-awe$len\n”;
$$cut_from-=$len;
#保持@rest条从最短到最长排序
@rest=sort{$a$b}@rest;
}
打印标量@rest;
#打印“@rest\n”#剩菜

这实际上是一个削减库存的问题

有一个C实现 用135支杆解决上述问题


不幸的是,未能找到Perl实现

这是一个数学编程问题。您需要最小数量为2m的棒材的最佳切割列表。我认为你应该忽略角拐角的额外要求(即,条带的有效宽度为零),因此你的切割列表是40×25cm、60×30cm、40×35cm、140×50cm、50×60cm、80×90cm和50×110厘米。请考虑条零宽度。检查代码。同时,yr代码的结果为116巴。如果我们使用单根长杆,则框架实际需要的长度为26900 cm=134.5杆,无浪费。@user3687431表示无浪费版本。(将$stretcher_width设置为零)@user3687431是的,它总是寻找最小的可重用条。
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