Leser: 14
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
my @hoelzer = (3, 3); my @bretter = (1, 1, 1); my @moegliche_belegungen; my @belegung; for (@hoelzer) { push @belegung, []; } sub summe { my $sum = 0; for my $elem (@_) { $sum += $elem; } return $sum; } sub plaziere_holz { my $bretter = shift; my $belegung = shift; my @bretter = @$bretter; my @belegung = @$belegung; my $holz = shift(@bretter); unless ($holz) { push @moegliche_belegungen, [ map { [ @$_ ] } @belegung ]; return; } for my $i (0..$#hoelzer) { if ($hoelzer[$i] - summe(@{$belegung[$i]}) >= $holz) { push $belegung[$i], $holz; plaziere_holz(\@bretter, \@belegung); pop $belegung[$i]; } } } plaziere_holz(\@bretter, \@belegung); @moegliche_belegungen = sort { my $bewertung_a = 0; my $leerhoelzer_a = 0; for my $i (0..$#hoelzer) { $bewertung_a += ($hoelzer[$i] - summe(@{$a->[$i]})) **2; $leerhoelzer_a++ if summe(@{$a->[$i]}) == 0; } my $bewertung_b = 0; my $leerhoelzer_b = 0; for my $i (0..$#hoelzer) { $bewertung_b += ($hoelzer[$i] - summe(@{$b->[$i]})) **2; $leerhoelzer_b++ if summe(@{$b->[$i]}) == 0; } if ($leerhoelzer_a != $leerhoelzer_b) { return $leerhoelzer_a <=> $leerhoelzer_b; } else { return $bewertung_a <=> $bewertung_b; } } @moegliche_belegungen; for my $bel (@moegliche_belegungen) { say join(" | ", map { join('; ', @$_) } @$bel); }
QuoteDas eindimensionale Zuschnittproblem (englisch one-dimensional cutting stock problem) ist ein NP-schweres ganzzahliges lineares Optimierungsproblem mit dem Ziel, eindimensionale Teile in vorgegebenen Bedarfszahlen aus möglichst wenig Stücken Material gegebener Länge zuzuschneiden.
QuoteSortiere die Objekte nach absteigendem Gewicht
Füge die Objekte der Reihe nach ein,
sodass jedes in den ersten Behälter gegeben wird, in dem noch genug Platz ist.
Falls in keinem der bereits geöffneten Behälter genügend Platz ist, öffne einen neuen