【问题标题】:knapsack weight > max size背包重量 > 最大尺寸
【发布时间】:2018-03-06 17:04:02
【问题描述】:

我目前的查询结果如下

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";
    }
    

http://search.cpan.org/~mschilli/Algorithm-Bucketizer-0.13/Bucketizer.pm

使用这个模块,我正在应用背包算法来尝试将物品的重量分配到桶中

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

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

例子:

桶大小 => 30

  1. E 88 这将被排除在外

是否有另一种算法可以解决这种情况?或者有没有办法修改这个不排除大于尺寸的重量?

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

如果重量 > 尺寸,则只用该重量填充一个桶

【问题讨论】:

  • 这个问题令人困惑。也许我缺少背景信息。你想要什么输出?
  • 对不起,我试图不排除大于桶大小的权重。如果权重大于桶大小,则排除该权重。我尽量不排除那个重量,而是只用那个重量装满一个桶。
  • 这没有帮助。我仍然不知道你想要什么输出。你想解决什么问题?这很像是一个 XY 问题:xyproblem.info
  • 提示:避免使用 $b 以避免与 sort 和类似的 subs 冲突。

标签: algorithm perl knapsack-problem


【解决方案1】:

对于超过桶大小的任何项目,只需传递桶大小而不是实际大小。

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();

【讨论】:

  • (第二种方案和Prune的一样)
【解决方案2】:

我看不出你卡在哪里了。您只需在现有算法中添加一个预处理步骤。你只通过重量一次。当您找到一个>= bucketsize 时,只需将一个桶装满该重量即可。然后从问题集中移除该重量和桶并照常继续。

在上面的示例中,您将从

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

继续您通常的解决方案,返回后附加 88 公斤的桶。

【讨论】:

    猜你喜欢
    • 2012-01-31
    • 2011-05-02
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多