alle Möglichkeiten x gegenstände auf y Behälter aufzuteilen

Status
Nicht offen für weitere Antworten.
N

New_Escaflowne

Gast
Hi.
ich habe folgendes Problem:
ich will eine Methode schreiben, die mir alle Möglichkeiten gibt, wie man x Gegenstände auf y Behälter aufteilt, d.h. bei vier Gegenständen (a,b,c,d) und zwei Behälter muss es 16 Möglichkeiten geben: von abcd/- über ab/cd, ad/bc, abd/c zu -/abcd (um nur ein paar zu nennen).

dazu habe ich mir folgendes ausgedacht:
ich habe eine Klasse Moeglichkeit, die aus einem Vector<Vector> (hier mal v genannt) und einigen anderen daten besteht, die aber für mein problem nicht von Relevanz sind. jeder Vector in v steht für einen Behälter und beinhaltet dementsprechen den Inhalt des Behälters.
in einem weiteren Vector speichere ich die einzelnen Möglichkeiten.

meine Methode sieht nun folgendermaßen aus (in pseudocode)

Code:
methode() {
  Vector unbearbeitet; //der Vector enthält alle Objekte
  Vector<Vector> aktVerteilung; //ich speichere diesen Vector erst am Ende der Methode als Möglichkeit mit den anderen Werten
  aktVerteilung wird mit so vielen leeren Vectoren gefüllt, wie es Behälter gibt;
  tmp=unbearbeitet.get(0); //oberstes Objekt aus unbearbeitet
  unbearbeitet.remove(0);  //tmp wird aus unbearbeitet entfernt
  for (int i=0; i<anzahlBehälter; i++) {
    verteilungFinden(unbearbeitet, aktVerteilung, tmp, i);
  }
  ... //rest ist nicht wichtig
}

verteilungFinden(Vector unbearbeitet, Vector<Vector> aktVerteilung, tmp, int pos) {
//unbearbeitet wie vorher, aktVerteilung=aktuelleVerteilung, tmp=aktuellesObjekt, pos=in welchen Behälter soll tmp
  if (unbearbeitet.isEmpty()) {  //Abbruchbedingung
    aktVerteilung.get(pos).add(tmp); //tmp wird in den richtigen Behälter eingefügt
    restliche Werde ermitteln, also die Verteilung bewerten;
    aktVerteilung+Werte als Möglichkeit in den Vector mit allen Möglichkeiten einfügen;
  } else {
    aktVerteilung.get(pos).add(tmp);
    t=unbearbeitet.get(0);
    unbearbeitet.remove(0);
    for (int i=0: i<anzahlBehälter; i++) {
      verteilungFinden(unbearbeitet, aktVerteilung, t, i); //rekursiver Aufruf der Methode
    }
  }
}

wie man sieht, ist es eine rekursive Methode. allerdings funktioniert sie nicht richtig, da ich, z.B. bei der Verteilung von vier Objekten (a,b,c,d) auf zwei Behälter nur 5 Möglichkeiten bekomme, die alle gleich aussehen, nämlich:
Behälter 1: a,b,c,d
Behälter 2: d,c,b,a

ich hoffe ihr könnt mir sagen, wo mein Fehler liegt. ich bedanke mich schonmal für die Hilfe.

mfg
New_Escaflowne
 
N

New_Escaflowne

Gast
sry, für den doppelpost.

kann mir denn keiner helfen?


mfg
New_Escaflowne
 
S

SlaterB

Gast
also dein Code macht praktisch nix, keine echte Rekursion,
da wird das erste Element genommen und auf alle y verteilt,
das zweite verteilt usw,
alle einmal auf alle verteilt und Ende, keine Verzweigung, kein Zurücksetzen,
am Ende sind in allen y alle Elemente drin,

-----

was man stattdessen machen könnte ist die schwierigere Frage,
eine erste Brute-Force-Methode:
für n Elemente in n^n Schritten alle Elemente auf alle denkbaren Weisen verteilen,
von jeder Verteilung einen eindeutigen Code oder sonst was erkennbares bilden und abspeichern um doppelte Verteilungen zu erkennen und auszusortieren
 
N

New_Escaflowne

Gast
erstmal danke für die antwort.

das mit dem eindeutigen code bilden, um doppelte verteilungen auszusortieren, ist erst mal unwichtig. den algorithmus kann ich später noch optimieren.

die frage ist ja, wie diese Brute-Force-Methode aussieht, die alle Möglichkeiten erzeugt. das ist ja mein problem.

mfg
New_Escaflowne
 
S

SlaterB

Gast
Code:
verteilungFinden(i) {
   if (i == ende) {
      alle Felder gesetzt, Auswerung
   } else {
       Schleife über alle x
        setze Feld i mit einem der x
        verteilung(i+1)
   } 
}
es gibt genau ein Array, welches nach und nach alle Kombinationen einmal enthält, das muss dann ausgewertet/ kopiert werden,
bevor es im nächsten Schrit geändert wird

-----------

edit: das mit den verfügbaren x muss auch wieder rein, damit es keine doppelten gibt,
wichtig ist dann aber, die verfügbaren x zurückzulegen:

Code:
verteilungFinden(i) {
   if (i == ende) {
      alle Felder gesetzt, Auswerung
   } else {
       Schleife über alle verfügbaren x
        setze Feld i mit einem der x , das ist dann erstmal nicht mehr verfübar
        verteilung(i+1)
        das gewählte x wieder verfügbar machen
   } 
}

-----------

edit 2:
ach ich bin zu schnell im Antworten, es geht ja auch/ mehr um die Position,
die Elemente selber stehen ja schon fest, also eher die Positionen y verteilen

Code:
verteilungFinden(i) {
   if (i == ende) {
      alle Felder gesetzt, Auswerung
   } else {
       Schleife über alle y
        setze Feld i mit einem der y
        verteilung(i+1)
   } 
}

hier braucht man dann wieder nicht auf doppelte zu achten,

das sieht dann so aus,
x: a, b, c, d steht fest, als y sollen Behälter 1-4 zur Verfügung stehen,

dann ist die erste Kombination
a,b,c,d
1,1,1,1 -> alle in y=1 drin
1,1,1,2 -> drei in 1, nur d in 2
...
1,1,2,1
...
4,4,4,3
4,4,4,4

(evtl. ist das jetzt unnötig inperformant selbst für so ein uninspirierten BruteForce ;) )
 
N

New_Escaflowne

Gast
danke für den Algorithmus ^^

da ich aber morgen und am Freitag Klausuren schreibe, werde ich erst am Wochenende dazu kommen, den Algorithmus zu implementieren. ich melde mich dann und sage bescheid, ob es funktioniert.

mfg
New_Escaflowne
 
N

New_Escaflowne

Gast
also der algorithmus funktioniert. danke dafür.

der thread kann jetzt eigentlich zu gemacht werden. außer jemand hat noch vorschläge, wie man den algorithmus optimieren kann.

mfg
New_Escaflowne
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Methoden Eclipse schlägt mir nicht alle Möglichkeiten vor Java Basics - Anfänger-Themen 4
melisax Alle Möglichkeiten eines Wortes angeben Java Basics - Anfänger-Themen 3
Kirby.exe Alle möglichen Error Möglichkeiten abfangen Java Basics - Anfänger-Themen 33
D Alle Möglichkeiten, n-Anzahl aus Elementen aus einem Array zu wählen, ausgeben? Java Basics - Anfänger-Themen 23
S Suchmaske alle Möglichkeiten effinzent durchgehen Java Basics - Anfänger-Themen 4
N alle "3er" Möglichkeiten aus 10 Buchstaben Java Basics - Anfänger-Themen 6
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
B Alle Strings bis zu einer Maimallänge aufzählen, die Bedingung erfüllen Java Basics - Anfänger-Themen 13
D Apache HTTPClient für alle Fälle Java Basics - Anfänger-Themen 41
missy72 Methoden Alle rekusiven Aufrufe abbrechen Java Basics - Anfänger-Themen 21
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
B Alle Zahlen finden, die 3 bestimmte Ziffern enthalten? Java Basics - Anfänger-Themen 9
K wie kann ich alle Attribute von dem Objekt(pagode) ausgeben lassen ? Java Basics - Anfänger-Themen 3
I Greenscreen, funktioniert nicht zu 100%... nicht alle Pixel werden geändert Java Basics - Anfänger-Themen 1
Butzibu Image Loader lädt nicht alle Bilder: Java Basics - Anfänger-Themen 4
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
E Select nimmt nicht alle Where /AND befehlen an Java Basics - Anfänger-Themen 4
K Erste Schritte Wie schnell ist LinkedHashMap im Vergleich zur ArrayList, wenn alle Entries durchlaufen werden? Java Basics - Anfänger-Themen 47
B Programm, dass alle 3 Tage eine Webseite öffnet? Java Basics - Anfänger-Themen 20
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
J Alle Dateien aus einem Verzeichnis laden Java Basics - Anfänger-Themen 10
Bademeister007 Operatoren Alle Zahlen einer ArrayList die durch 5 teilbar ist Java Basics - Anfänger-Themen 2
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
crrnogorka Letzte Zeile einer Tabelle "überschreibt" alle anderen Zeilen Java Basics - Anfänger-Themen 1
C alle möglichen Kombinationen zweier Ziffern auf drei / vier / und 'n" Stellen Java Basics - Anfänger-Themen 11
H Alle Geraden zahlen bis 10 ausgeben Java Basics - Anfänger-Themen 11
L Alle Ziele in einem Raster abknallen Java Basics - Anfänger-Themen 17
J Alle Werte eines Strings zusammen addieren Java Basics - Anfänger-Themen 15
S Laufzeit Quicksort wenn alle Elemente gleich sind Java Basics - Anfänger-Themen 4
B Alle Links in einem Text suchen und ersetzen mit einem neuen Link Java Basics - Anfänger-Themen 18
K Array alle Werte aufsummieren und ausgeben Java Basics - Anfänger-Themen 6
Dimax Erste Schritte String replace alle Zeichen Java Basics - Anfänger-Themen 10
L Wie vergrößere ich ein Rechteck in alle Richtungen um eins und bekomme dessen Rand? Java Basics - Anfänger-Themen 2
L Breadth-First Search statt einem Pfad, alle Pfade herausfinden Java Basics - Anfänger-Themen 4
X Erste Schritte String: Alle doppelten Leerzeilen entfernen Java Basics - Anfänger-Themen 21
M Regex-Ausdruck: Alle Zeichen bis auf ein bestimmtes erlauben (p{L}) Java Basics - Anfänger-Themen 5
I Alle Elemente von zwei Listen vergleichen Java Basics - Anfänger-Themen 1
M Unterklasse soll nicht alle Methoden erben Java Basics - Anfänger-Themen 3
V Erste Schritte for-Schleife; Ausgabe soll alle 5 Sekunden erfolgen. Java Basics - Anfänger-Themen 4
A Alle true Werte eines boolean Arrays herausfiltern Java Basics - Anfänger-Themen 19
M prüfen ob alle array werte gleich sind Java Basics - Anfänger-Themen 27
F Alle Zeichenkombinationen eines Strings iterativ herausfinden Java Basics - Anfänger-Themen 26
L Classpath Alle Dateien im Classpath finden Java Basics - Anfänger-Themen 4
G Überprüfen ob alle Ziffern von 1-9 in einem Integer vorhanden sind Java Basics - Anfänger-Themen 6
J Erste Schritte Alle möglichen ausgaben von 5 Zahlen als Vector Java Basics - Anfänger-Themen 7
R Methoden Entferne alle identische Knoten (Typ String) aus verkettete Liste Java Basics - Anfänger-Themen 8
D Methoden Eigene Methode um alle Ausgaben aufzurufen Java Basics - Anfänger-Themen 17
F Ordner auf alle Unterdatein abfragen Java Basics - Anfänger-Themen 3
A In einem String alle Eigennamen zählen Java Basics - Anfänger-Themen 6
B Klassen Alle Unter-Objekte durchlaufen in der Hauptklasse Java Basics - Anfänger-Themen 10
W ArrayList löscht alle Elemente bis auf eines Java Basics - Anfänger-Themen 2
B Webservice -> alle parameter bekommen von form Java Basics - Anfänger-Themen 2
das_leon Alle Zeilen einer CSV-Datei auslesen Java Basics - Anfänger-Themen 1
C HashMap - alle keys haben values der letzten put-Anweisung Java Basics - Anfänger-Themen 3
F Eclipse alle Projekt weg Java Basics - Anfänger-Themen 6
V Alle Komponenten eines JPanels Java Basics - Anfänger-Themen 14
I gemeinsame Config-Datei für alle Windows-User Java Basics - Anfänger-Themen 5
H JButton - Wechsel der Textfarbe alle 500ms Java Basics - Anfänger-Themen 10
DaCrazyJavaExpert Alle Zahlenkombinationen aus 9 zahlen finden Java Basics - Anfänger-Themen 17
F Alle Objekte einer Klasse nach Eigenschaft durchsuchen Java Basics - Anfänger-Themen 8
M Alle Instanzen einer Klasse ansprechen Java Basics - Anfänger-Themen 4
S Problem: Array alle Einträge gleich Java Basics - Anfänger-Themen 10
Z Enter Taste alle 0,5 Sekunden ausführen Java Basics - Anfänger-Themen 1
U RegEx alle Kommas bei den Zahlen in Punkt umwandeln Java Basics - Anfänger-Themen 3
K alle Vorkommen einer bestimmten Ziffer in einer Zahl zählen Java Basics - Anfänger-Themen 2
X Minimax-Algorithmus über alle Kanten möglich? - Kanten darstellen Java Basics - Anfänger-Themen 1
C Alle Zweierpotenzen bis 2^10 ausgeben lassen Java Basics - Anfänger-Themen 15
B Alle Attribute von Klasse bekommen und ändern Java Basics - Anfänger-Themen 12
M Input/Output Alle Zeilen auslesen und in Variable speichern Java Basics - Anfänger-Themen 5
W Mozilla Thunderbird email an alle Kontakte Java Basics - Anfänger-Themen 3
F Methode alle 15min ausführen Java Basics - Anfänger-Themen 5
D Alle möglichen Kombinationen in einem Array ausgeben Java Basics - Anfänger-Themen 2
I Alle Laufwerke und deres Pfade ausgeben Java Basics - Anfänger-Themen 6
S Classpath: Alle .jars innerhalb eines Ordners einbinden Java Basics - Anfänger-Themen 4
G Alle Objekte und Variablen automatisch ausgeben Java Basics - Anfänger-Themen 7
I Programm, welches eine Textzeile einliest und alle darin enthaltenen Buchstaben umwandelt Java Basics - Anfänger-Themen 3
G Wie bekomme ich alle Ausgaben von runTime.exec() Java Basics - Anfänger-Themen 7
L Best Practice Alle Kombinationen aus Listenelementen, Anzahl Listen unterschiedlich Java Basics - Anfänger-Themen 6
M Compiler-Fehler Alle Methoden eines Interfaces Implementiert dennoch Fehler Java Basics - Anfänger-Themen 3
I Alle Zeitzonen in Liste speichern Java Basics - Anfänger-Themen 4
F alle 100ms Befehle ausführen Java Basics - Anfänger-Themen 26
M Alle Sublisten einer bestimmten Laenge berechnen Java Basics - Anfänger-Themen 2
F Alle DEMOS fast veraltet...? Java Basics - Anfänger-Themen 13
J Alle Leerzeichen aus String entfernen Java Basics - Anfänger-Themen 13
D Methoden Alle Siebenstelligen Primpalidrome von PI Java Basics - Anfänger-Themen 6
K Durch alle Attribute eines Objektes iterieren Java Basics - Anfänger-Themen 6
P Klassen Alle Strings einer ArrayList<eigeneKlasse> anspre Java Basics - Anfänger-Themen 2
W String von hinten alle drei Zeichen abschneiden und in umgekehrter Reihenfolge ausgeben. Java Basics - Anfänger-Themen 9
M Stürzen alle Rekursive Methoden irgendwann ab? Java Basics - Anfänger-Themen 11
M Alle möglichen Strings Java Basics - Anfänger-Themen 5
J Alle Wörter der Länge n mit 0 und 1 Java Basics - Anfänger-Themen 17
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
G Methoden Alle Objekte der ArrayList ausgeben funktioniert nicht. Java Basics - Anfänger-Themen 12
N Klassen Class nur einmal ausführen und sie speichert daten für alle anderen classes? Java Basics - Anfänger-Themen 3
M Klassen Auf Alle Array Methoden gleichzeitig zugreifen Java Basics - Anfänger-Themen 8
D Frame schließt gleich alle Frames Java Basics - Anfänger-Themen 5
T Wie mache ich einen Timer der alle 2 sekunden aufgerufen wird? Java Basics - Anfänger-Themen 5
G JFileChooser "alle Dateien" unterbinden Java Basics - Anfänger-Themen 3
S Aus zwei Dateipfaden alle Dateien auslesen Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben