Algorithmus Optimierung

oetzi

Bekanntes Mitglied
Hallo zusammen,

ich plane gerade den Eigenbau einer Theke für meinen Keller. Keine Sorge, ich habe mich nicht im Forum vertan :)
Die Zeichnung für die Unterkonstruktion ist fertig und ich habe jetzt eine Liste mit jeweils der Anzahl von verschiedenen langen Kanthölzer die ich benötige.
Beispiel - Stückverteilung
Code:
Anzahl | cm
2 | 100
1 | 40
2 | 25

Jetzt geht es darum die verschiedenen Stücke optimal auf die verfügbare Kantholzlänge die ich im Baumarkt kriege zu verteilen. Das könnte man natürlich jetzt auf die Schnelle grob auf Papier machen, aber mich hat gerade die Programmierwut ergriffen und ich möchte das per Algorithmus erledigen.

Mein Ansatz ist dabei folgender:
Zunächst muss ich alle möglichen Kombinationen bei einer möglichen gegebenen Kantholzlänge durchspielen.
Beispiel
Code:
Annahme: 
Kantholzlänge = 250 cm
Stückverteilung siehe oben

Mögliche Kombinationen:
1) 100 + 100 + 40 >> 10 cm Verschnitt + 2 x 25 cm für Kantholz 2
2) 100 + 100 + 25 + 25 >> Kein Verschnitt + 40 cm für Kantholz 2
3) 100 + 100 + 25 + 25 >> siehe 2) 
4) 100 + 40 + 100 >> siehe 1)
5) 100 + 40 + 25 + 25 >> 60 cm Verschnitt + 100 cm für Kantholz 2
usw.

Wenn ich also alle Möglichkeiten durchgegangen wäre, hätte ich in jeder Zeile die Angaben "Verschnitt" und "Rest für weitere Kanthölzer".
Ziel ist ja den Gesamtverschnitt zu minimieren.
Und hier hänge ich gerade gedanklich.

Der Ansatz den ich hier habe wäre, dass ich mir die erste Kombination wähle, die den minimalsten Verschnitt hat und dann mit den restlichen Stücken das gleiche Spiel von vorne beginne.
Das Vorgehen ist mir aber noch irgendwie zu zufällig. Vielleicht wähle ich dann als erstes eine Kombination, durch die ich Stücke wegnehme, die später in einer anderen Kombination den Verschnitt weiter verringern würden.

Puh, war das jetzt verständlich genug ausgedrückt? :)

Ich hätte also die Bitte an die Freunde des gepflegten Algorithmus ihre Ideen hier einzubringen.

Schönen Gruß
oetzi
 

Kaibear

Aktives Mitglied
Ayayay, da hast du dir eine (zugegeben sehr interessante) Aufgabe gestellt.

Ich hab ein wenig recherchiert und das Eindimensionale Zuschnittproblem ist anscheinend mal ne heiße Sache gewesen, wo sich ne Menge kluger Köpfe drangesetzt hat.

Ich hoffe der folgende Link hilft dir bei dem Problem weiter, ich hab noch nicht zuende gelesen.

Eindimensionales Zuschnittproblem ? Wikipedia
 

kay73

Bekanntes Mitglied
Ich kann nur eine naive Implementierung anbieten:

Für den Fall, dass im Baumarkt alle Kanthölzer dieselbe Länge haben:

- Bilde alle Permutationen der Menge der Schnitte, die nacheinander ausgeführt werden können. Für Deine Holzstückliste könnte diese so anfangen:
100, 100, 40, 25, 25
40, 100, 100,25, 25
100, 40, 100,25, 25
...

Da die Liste immer 5 Elemente hat, gibt es 5! = 120 Einträge. Etliche sind Duplikate, da 100 und 25 mehrfach vorkommen. Aber das ist erstmal egal.

- Fange an, Hölzer zu zersägen:
Für jedes Element aus [100, 100, 40, 25, 25], [40, 100, 100,25, 25], [100, 40, 100,25, 25], ...:
  1. Erzeuge ein neues Holz und behalte es als Aktuelles.
  2. Für jeden Einzel-Schnitt aus der Liste:.
  3. Falls das aktuelle Holz zu kurz ist, füge es der Liste benutzter Hölzer hinzu, erzeuge ein neues Holz und behalte es als Aktuelles.
  4. Zieh die Länge des Einzel-Schnittes vom aktuellen Holz ab und merke Dir (am Holz) den Einzel-Schnitt in einer Liste.
  • Das Array
    Code:
    permIndices
    in
    Code:
    makeCuts()
    enthält alle Permutation von [0,1,2,3,4] und dient als Liste von Indices in das Array [100, 100, 40, 25, 25].
  • Im Resultat von
    Code:
    makeCuts()
    ist keine Sortierung, man könnte den Typ
    Code:
    List<List<Wood>>
    leicht umbauen und sortieren.
  • Der Gesamtverschnitt ist immer derselbe, das Hauptproblem ist die minimale Anzahl von Hölzern zu erreichen, in dem man jedes einzelne optimal zersägt. Alternativ könne man noch wollen, dass der Verschnitt pro Holzstück minimal ist und wenige aber sehr lange Hölzer übrigbleiben.
Java:
package perm;

import java.util.ArrayList;
import java.util.List;

public class Main {

	class Wood {
		List<Integer> cuts = new ArrayList<>();
		int remainingCm;
		
		Wood(final int length) {
			this.remainingCm = length;
		}

		@Override
		public String toString() {
			return "Wood [" + (cuts != null ? "cuts=" + cuts + ", " : "")
					+ "remainingCm=" + remainingCm + "]";
		}
	};
	
	public static void main(String[] args) {
		
		final List<List<Wood>> compute = new Main().makeCuts(250, 100, 100, 40, 25, 25);
		for (List<Wood> list : compute) {
			System.out.println(list);
		}
	}
	
	public List<List<Wood>> makeCuts(int length, int... sizes) {
		final int numComputations = factorial(sizes.length);
		final int[][] permIndices = quickPerm(sizes.length);

		final List<List<Wood>> result = new ArrayList<>(numComputations);
		for (final int[] perm : permIndices) {
			
			final List<Wood> currentWoods = new ArrayList<>();
			Wood w = new Wood(length);
			currentWoods.add(w);

			for (final int index : perm) {								
				
				final int currentLength = sizes[index];
				
				if( w.remainingCm < currentLength) {
					w = new Wood(length);
					currentWoods.add(w);
				}
				
				w.remainingCm -= currentLength;
				w.cuts.add(currentLength);
			}	
			result.add(currentWoods);
		}

		return result;
	}

	public int factorial(int i) {
		int f = i;
		while (--i > 0) {
			f *= i;
		}

		return f;
	}

	/**
	 * [url=http://www.freewebs.com/permute/quickperm.html]Counting QuickPerm - C++ Linear Array Permutations Without Recursion[/url]
	 */
	public int[][] quickPerm(final int N) {

		int i, j, tmp, index = 0;

		final int[][] result = new int[factorial(N)][N];
		final int a[] = new int[N];
		final int p[] = new int[N];

		for (i = 0; i < N; i++) {
			a[i] = i;
			p[i] = 0;
		}

		System.arraycopy(a, 0, result[index++], 0, N);

		i = 1;
		while (i < N) {
			if (p[i] < i) {
				j = i % 2 * p[i];
				tmp = a[j];
				a[j] = a[i];
				a[i] = tmp;

				System.arraycopy(a, 0, result[index++], 0, N);
				p[i]++;
				i = 1;
			} else {
				p[i] = 0;
				i++;
			}
		}

		return result;
	}
}
 
Zuletzt bearbeitet:

oetzi

Bekanntes Mitglied
@Kaibear: Danke für den Link. Ehrlich gesagt habe ich nach kurzem Lesen aufgehört. Leider findet man in solchen wiki Artikeln die rein akademische Lösung beschrieben. Ich hatte zwar auch Mathekurse in meinem Studium, aber das geht doch weit über meinen Horizont hinaus :)

@kay73:
Ich glaube grob verstanden zu haben, was du meinst.


Ich hatte in der Zwischenzeit ein bisschen weiter getüftelt.
Mittlerweile lasse ich eine Baumstruktur erstellen, die ausgehend von einer Startlänge alle weiteren Kombination darstellt und jeweils den Verschnitt ausgibt.
Das nächste große Problem ist aus den vielen Möglichkeiten die sinnvollste auszuwählen.
Oh man, hätte ich vorher gewusst, was da auf mich zukommt :)
Wenn ich mir nur die Komplexität des Wikiartikels angucke, wird es wohl schwer sein hier eine perfekte Lösung (zumindest auf die Schnelle) zu finden.
Vielleicht lasse ich es auch einfach gut sein. Der Holzhandel meines Vertrauens wird das schon hinkriegen ;-)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Algorithmus für Arbeit mit fehlenden Listenelementen? Allgemeine Java-Themen 1
schegga_B AES-Algorithmus in javax.crypto Allgemeine Java-Themen 3
M Laufzeit des Prim Algorithmus Allgemeine Java-Themen 3
O Newton Algorithmus Java Allgemeine Java-Themen 1
CptK Backpropagation Algorithmus Allgemeine Java-Themen 6
N Google Authenticator Algorithmus (SHA1) Allgemeine Java-Themen 1
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
Zrebna Quicksort-Algorithmus - zufälliges Pivot wählen Allgemeine Java-Themen 6
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
B Algorithmus Warteschlange Ringpuffer wirklich fehlerfrei Allgemeine Java-Themen 8
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
F Q - Learning Algorithmus Bug Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
M Minmax Algorithmus Verständnisproblem Allgemeine Java-Themen 2
H Rundreise frage (Algorithmus) Allgemeine Java-Themen 18
F KMP-Algorithmus Allgemeine Java-Themen 9
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
P MinMax Algorithmus Allgemeine Java-Themen 0
J Abhängigkeit zwischen Rechenzeit und Speicherbedarf in einen Algorithmus Allgemeine Java-Themen 7
K Djikstra-Algorithmus Allgemeine Java-Themen 1
T Minimax/Alphabeta Algorithmus hängt sich auf (?) Allgemeine Java-Themen 2
M Algorithmus zum Zahlen einteilen Allgemeine Java-Themen 8
O Best Practice Hilfe bei Algorithmus gesucht Allgemeine Java-Themen 10
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
S Rucksackproblem und genetischer Algorithmus Allgemeine Java-Themen 9
L Abbruch des Algorithmus Allgemeine Java-Themen 8
D Input/Output Ausgleichen chemischer Reaktionsgleichungen mit dem Gauß-Algorithmus Allgemeine Java-Themen 2
Messoras A*-Algorithmus integrieren Allgemeine Java-Themen 3
S Buchscan 3D Dewarp Algorithmus - Ansätze Allgemeine Java-Themen 1
B Verteilungs-/Vergabe-Algorithmus mit abhängigen Score-Werten Allgemeine Java-Themen 3
Androbin "Shunting Yard"-Algorithmus Allgemeine Java-Themen 6
B Algorithmus - Project Euler Problem 18 Allgemeine Java-Themen 2
N Algorithmus zum bewerten von mathematischen Funktionen Allgemeine Java-Themen 11
Joew0815 Algorithmus - Zahlenfolge in 4 ähnliche Teile aufteilen Allgemeine Java-Themen 0
O Tag Cloud Algorithmus Idee gesucht Allgemeine Java-Themen 2
A Implementierung eines Algorithmus (Farthest Insertion zur Lösung des TSP) in O(n²) Allgemeine Java-Themen 2
C Eclipse Probleme bei selbst erstelltem Algorithmus Allgemeine Java-Themen 2
H Graph-Algorithmus gesucht Allgemeine Java-Themen 21
N Algorithmus durch Workflow Allgemeine Java-Themen 7
M tree-based diff Algorithmus (Code-Vergleiche) Allgemeine Java-Themen 3
S Uhrzeit Algorithmus sale Allgemeine Java-Themen 11
N A*-Algorithmus Allgemeine Java-Themen 5
A Suche Algorithmus zum Erstellen eines planaren Graphen Allgemeine Java-Themen 5
F Methoden Algorithmus zur Gegnerfindung (Turnier) Allgemeine Java-Themen 9
T Algorithmus Graph Allgemeine Java-Themen 10
J Algorithmus gesucht (Stringtransformation) Allgemeine Java-Themen 4
B Algorithmus Krankenhausbelegung Allgemeine Java-Themen 17
S Algorithmus von Dijkstra Allgemeine Java-Themen 2
alex_fairytail OOP Banknoten Algorithmus Teil 2 Allgemeine Java-Themen 13
2 ArrayList aktualisieren Algorithmus Allgemeine Java-Themen 11
alex_fairytail Methoden Banknoten Algorithmus Allgemeine Java-Themen 10
R Codehinweise: Algorithmus Größenvergleich von n Zahlen Allgemeine Java-Themen 5
SuperSeppel13 WTF?! Algorithmus-Geschwindigkeitstest Allgemeine Java-Themen 2
L Algorithmus für kürzesten Weg mit Wegpunkten Allgemeine Java-Themen 21
C Algorithmus Problem in Minesweeper Allgemeine Java-Themen 5
S Algorithmus um Labyrinth zu erzeugen Allgemeine Java-Themen 6
V Problem mit A* Pathfinder-Algorithmus Allgemeine Java-Themen 2
S Algorithmus um nächst folgende Primzahl zu berechnen Allgemeine Java-Themen 7
S Algorithmus Problem. Rechtecke effizient auf Spielfeld anordnen. Allgemeine Java-Themen 7
C Algorithmus-Hilfe Allgemeine Java-Themen 20
J Algorithmus Längenkombinationen? Allgemeine Java-Themen 7
M Kombinationen über rekursiven Algorithmus berechnen? Allgemeine Java-Themen 10
L Algorithmus für Poker-Hände Allgemeine Java-Themen 7
chik 2 return werte für Greedy-Algorithmus (gelöst) Allgemeine Java-Themen 3
D Abstruse Probleme mit eigenem replace Algorithmus Allgemeine Java-Themen 11
P RC4 Algorithmus Allgemeine Java-Themen 3
D RSA Verfahren - Erweiterter Euklidischer Algorithmus Allgemeine Java-Themen 4
C IBAN und Bic Validieren (Algorithmus) Allgemeine Java-Themen 10
P Problem mit A*-Algorithmus Allgemeine Java-Themen 12
M Wörter Algorithmus Allgemeine Java-Themen 7
M Algorithmus für automatische Zeilenumbrüche Allgemeine Java-Themen 12
K Postleitzahlen Algorithmus Allgemeine Java-Themen 12
G Problem mit Algorithmus Allgemeine Java-Themen 3
T Hilfe bei einem Algorithmus Allgemeine Java-Themen 2
S Stemming-Algorithmus gesucht (z.B. Porter) Allgemeine Java-Themen 2
RoliMG präfix zu infix algorithmus Allgemeine Java-Themen 6
Z A*-Algorithmus - Probleme mit offener/geschlossener Liste Allgemeine Java-Themen 7
S Javaimplementierung des MD5 Algorithmus Allgemeine Java-Themen 2
E Container-Pack-Algorithmus Allgemeine Java-Themen 4
G k nearest neighbor algorithmus Allgemeine Java-Themen 7
C HASH Algorithmus 2 Strings ergeben das Selbe. Allgemeine Java-Themen 2
P Page Rank Algorithmus implementieren Allgemeine Java-Themen 7
T Problem RSA-Algorithmus in Java? Allgemeine Java-Themen 2
minzel Hash-Algorithmus Allgemeine Java-Themen 9
Y komprimierung mittels Huffman-Algorithmus, bit-shifting. Allgemeine Java-Themen 2
K Algorithmus Allgemeine Java-Themen 10
C Algorithmus für Array Allgemeine Java-Themen 9
I Verschlüsselung mit Pwd. - User soll Algorithmus wählen Allgemeine Java-Themen 4
J fällt euch ein Algorithmus ein? Allgemeine Java-Themen 4
S Algorithmus für Sudoku Allgemeine Java-Themen 17
N Euklidischer Algorithmus in Java und keine Terminierung. Allgemeine Java-Themen 7
F Algorithmus für Sortierung gesucht Allgemeine Java-Themen 15
T Algorithmus verbessern Allgemeine Java-Themen 10
U Suche Algorithmus zur bestimmung des längsten Wegs Allgemeine Java-Themen 3
U Ford-Fulkerson Algorithmus gesucht Allgemeine Java-Themen 1
U Dijkstra Algorithmus gesucht Allgemeine Java-Themen 4
D Algorithmus für die Erkennung fehlerhafter Eingaben Allgemeine Java-Themen 4
I hash-algorithmus Allgemeine Java-Themen 9
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben