Idee für Optimierungsalgorithmus gesucht (ähnlich Rucksackproblem)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von SKeks.

    Idee für Optimierungsalgorithmus gesucht (ähnlich Rucksackproblem)

    Hallo zusammen,

    ich suche eine Idee, wie ich mich folgendem Problem der Flächenoptimierung nähern könnte:
    Wir haben ein Diagramm A mit mehreren Balken unterschiedlicher Höhe; letztendlich eigentlich nur eine Liste mit ganzzahligen Werten. Das ist die zu füllende Fläche.
    Dann gib es das ganze noch mehrfach (hier 3 x) in klein (B, C und D).


    Ich möchte jetzt die kleinen Flächen in die Fläche A integrieren (ggf. die Balken stapeln) und zwar so, dass möglichst wenig drüberraussteht - ein Optimierungsproblem also.
    Das könnte dann ungefähr so aussehen (die beiden roten Balken oben stehen jetzt etwas drüber raus):


    Statt Flächen kann man A-D auch als Tupel beschreiben, z.B. A = (10,12,11,12,15,10...), B = (4,5,3,4) usw. - das hilft vielleicht, einen nichtgraphischen Ansatz zu finden.

    Ich habe schon beim Rucksackproblem geschaut, das geht ja in die Richtung, hier kommt als Besonderheit dazu, dass die farbigen Blöcke nicht aufgetrennt werden dürfen und man sehr wohl in einzelnen (oder auch allen, wenn A zu klein für B+C+D ist) Balken über das Ziel hinausschießen darf - das ziel ist einfach, in Summe möglichst wenig über die Balkenhöhen von A hinausgegangen zu sein.
    Integrale sind mir auch schon eingefallen, das wäre dann wohl eher die numerische Annäherung an integrale, aber da wüsste ich mathematisch/algorithmisch nicht weiter, wie ich quasi mehrere Integrale in ein großes Integral reinbringen soll.

    Was natürlich immer geht, ist brute-force - einfach sämtliche möglichen Kombinationen durchrechnen. Der Aufwand steigt aber exponenziell (erst recht, wenn die zu verteilenden Tupel zahlreich oder A lang werden) und daher ist das eigentlich keine Lösung.
    Vielleicht hat ja jemand ein Buzzword, das mich in die richtige Richtung lenken könnte - auch dieses Rad wurde sicher schon mehrfach vorher erfunden...

    Vielen Dank im Voraus
    Micha
    Da du das Problem schon mit dem Rucksackproblem in Verbindung bringst: KNAPSACK ist NP-hart. Soll heißen: Du musst alles durchprobieren, um die optimale Lösung zu finden bzw. zu verifizieren. Es gibt einfach keinen Algorithmus, der KNAPSACK "schnell" lösen kann. Je nachdem, wie mathematisch bewandert du bist, solltest du zunächst versuchen, eine Transformation in ein anderes NP-vollständiges Problem zu finden (KNAPSACK bietet sich geradezu an). Wenn du das schaffst, kannst du dir die algorithmische Lösung inkl. deren Programmierung gleich sparen. Was du hier postest, ist kein Programmierproblem, sondern ein ziemlich mathematisches.
    Gruß
    hal2000
    Falls du dich doch weiterhin mit Optimierung beschäftigen wollen würdest, bietet sich hier entweder ein evolutionärer Algorithmus oder Ameisenalgorithmus an. Beide Algorithmen lassen sich entweder leicht implementieren bzw sind bereits als dll zu finden und sind gut im Netz dokumentiert. Soweit ich weiß ist ein Evolutionärer Algorithmus zur Optimierung auch zB in Matlab enthalten.
    Die Objektfunktion lässt sich bei deinem Problem leicht aufstellen bzw hast du bereits getan: Minimiere die Fläche, die übersteht, und bestrafe dementsprechende Überstände.
    Zu beachten ist, dass diese Algorithmen metaheuristisch sind und das Finden der absoluten Lösung nicht garantiert werden kann, soll heißen, es kann sein, dass bei jedem Run deines Algorithmus ein anderes Ergebnis rauskommen kann, welches mehr oder minder gut deine Vorgaben erfüllt. Probleme stellen hierbei vor allem lokale Minima und vorzeitige Konvergenz dar.
    Mit Vergleichen zwischen den unterschiedlichen Runs kann man aber gut abschätzen was die Lösung sein könnte.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SKeks“ ()