背包重量>最大尺寸

时间:2018-03-06 17:04:02

标签: algorithm perl knapsack-problem

我目前正在查询结果如此

A,B,C,D,E =项目

数字 =重量

  1. A 15
  2. B 23
  3. C 10
  4. D 8
  5. E 88

    use Algorithm::Bucketizer;
    
    my $b = Algorithm::Bucketizer->new( bucketsize => 30);
    for my $i (1..10) {
        $b->add_item($i, 30+$i);
    }
    
    for my $bucket ($b->buckets()) {
        for my $item ($bucket->items()) {
            print "Bucket ", $bucket->serial(), ": Item $item\n";
        }
        print "\n";
    }
    
  6. http://search.cpan.org/~mschilli/Algorithm-Bucketizer-0.13/Bucketizer.pm

    使用此模块我正在应用背包算法尝试将项目的权重分配到存储桶

    my $bucketizer = Algorithm::Bucketizer->new(bucketsize => $size);
    

    问题在于,当体重较大时,我正在搜索该体重的大小被排除在外。

    示例:

    bucketsize => 30

    1. E 88 这将被排除在外
    2. 是否有其他算法可以解决这种情况?或者有没有办法修改这个不排除大于大小的权重?

      是否可以将其调整为这样工作?

      如果重量>尺寸然后只填充具有该重量的桶

2 个答案:

答案 0 :(得分:3)

只需传递铲斗尺寸而不是铲斗尺寸上任何物品的实际尺寸。

use Algorithm::Bucketizer qw( );
use List::Util            qw( min );

my @items = ...;
my $bucket_size = 30;

my $bzer = Algorithm::Bucketizer->new( bucketsize => $bucket_size );
for my $i (0..$#items) {
    $bzer->add_item( $i => min($items[$i], $bucket_size) );
}

my @bucketed_items = map { [ $bucket->items() ] } $bzer->buckets();

或者,因为您知道超大值将占用整个存储桶,请将其过滤掉并将其添加回结果。

use Algorithm::Bucketizer qw( );

my @items = ...;
my $bucket_size = 30;

my $bzer = Algorithm::Bucketizer->new( bucketsize => $bucket_size );
my @bucketed_items;
for my $i (0..$#items) {
    if ($items[$i] >= $bucket_size) {
        push @bucketed_items, [ $i ];
    } else {
        $bzer->add_item( $i => $items[$i] );
    }
}

push @bucketed_items, map { [ $bucket->items() ] } $bzer->buckets();

答案 1 :(得分:2)

我看不到你被困在哪里。您只需在现有算法中添加预处理步骤。你对权重进行一次传递。当您找到一个>= bucketsize时,只需用一个重量填充一个桶即可。然后从问题集中移除该重量和铲斗,并照常继续。

在上面的示例中,您将从

开始
bucket[0] = 88
weights = [15, 23, 10, 8]

继续使用常规解决方案,在返回后添加88公斤桶。