Jemand zu Hause?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); }
Ganzzahligen lineare Optimierung sein. Zu minimieren ist die Anzahl der Hölzer, der Lösungsvektor gibt dann die Nummer des Holzes an, aus dem ein Brett zu sägen ist.
Eindimensionale Zuschnittproblem genauer: 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.
Behälterproblem, und dort findet man auch eine Näherungslösung mit Laufzeit O(n*log(n)):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
use strict; use warnings;