Hallo!
Ich habe eine endliche Anzahl an Elementen die ich aneinander reihen will. Aber bestimmte Elemente dürfen nicht neben anderen Elementen stehen.
zb(pseudo-code):
Element_01.Anzahl = 2
Element_02.Anzahl = 1
Element_03.Anzahl = 3
liste.länge = 6
zb:
liste = [1,1,2,3,3,3]
oder
liste = [1,2,3,1,3,3]
usw
Das heißt, es gibt Zwei Elemente vom 'Element_01' und Ein Element von 'Element_02' usw. Insgesamt gibt es dann 6 Elemente.
Da gibt es jetzt viele unterschiedliche Möglichkeiten diese Elemente anzuordnen. Wieviele Möglichkeiten es gibt hat man ja schon in der Schule mit der Kombinatorik gelernt, aber nicht wie man alle möglichkeiten anzeigen lassen kann.
Weiters gibt es noch Bedinungen:
zb
Element_01 darf neben sich selbst und neben Element_02 stehen
Element_02 darf neben allen elementen stehen.
Element_03 darf neben sich selbst und dem Element_01 stehen.
Wie kommt man am schnellsten zu allen Möglichkeiten?
Habt ihr irgendwelche Hinweise wie ich das lösen kann?
Grüße,
niko
.[/code]
Sortieren mit Bedingungen
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
http://docs.python.org/library/functions.html#sorted
Da musst du wohl deine eigene `cmp` Funktion schreiben.
Da musst du wohl deine eigene `cmp` Funktion schreiben.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
ni-ko-o-kin hat geschrieben:Da gibt es jetzt viele unterschiedliche Möglichkeiten diese Elemente anzuordnen. Wieviele Möglichkeiten es gibt hat man ja schon in der Schule mit der Kombinatorik gelernt, aber nicht wie man alle möglichkeiten anzeigen lassen kann.
Code: Alles auswählen
>>> from itertools import permutations
>>> a = [1,1,2,3,3,3]
>>> ways = sorted(set(permutations(a)))
-
- User
- Beiträge: 12
- Registriert: Samstag 13. Februar 2010, 10:51
vielen dank für die antworten. bin am ausprobieren....
niko
.
niko
.
-
- User
- Beiträge: 12
- Registriert: Samstag 13. Februar 2010, 10:51
Code: Alles auswählen
from itertools import permutations
a=[1,1,2,3,3,3,1,1,2,3,3,3]
ways = sorted(set(permutations(a)))
print ways
Da lautet meine Frage dann: Dauert es länger wenn ich eine Permutation nach der anderen Abfrage ob sie alle Bedinungen erfüllt oder wenn ich eine Funktion schreibe die aus, wahrscheinlich, recht vielen Schleifen bestehen wird, wo von Anfang an die Bedingungen geprüft werden und nur dann weitergerechnet wird wenn sie erfüllt werden. Falls bei dem letzten Element dann rauskommt dass es sich nicht ausgeht weil die Bedinungen nicht erfüllt werden können wird wieder ein Element zurückgegangen und eine andere Variantion ausprobiert. Wenn es da auch nicht geht wieder ein Element zurück, Worst Case: es muss bis zum ersten element gegangen werden.
In zukunft soll das Programm mehrere Hunderte elemente haben (welche objekte einer klasse sein werden) die bestimmte Bedinungen(pro Element 26 Bedinungen die in den Objekten als Felder gespeichert werden) haben werden. Ist das schlau oder sollten die Objekte (=Elemente) nicht 'intelligent' sein(=Die Bedingungen in sich speichern) sondern die irgendwo anders gespeichert werden?
Aber toll das es die Funktion(permutations) gibt. Hab schon begonnen gehabt so eine Funktion selbst zu programmieren. Werd aber jetzt die bereits vorhandene verwenden.
niko
.
-
- User
- Beiträge: 12
- Registriert: Samstag 13. Februar 2010, 10:51
Wieso komme ich mit meinem Ansatz nicht weit? Rechenzeit?
Ich habe in den letzten Monaten einen Teil von den Wiener Gründerzeithäuser nachmodelliert. Es wiederholen sich immer wieder bestimmte Fassadenelemente. Und da dachte ich mir, dass lässt sich doch mit einem Script schneller lösen.
Es soll ein 'Gebäude-Bauer' (Gründerzeithäuser) in Blender (www.blender.org) werden. Ein Element hat zum Beispiel 3m x 3m x 3m und ist ein Fassen-Element. Ein anderes ist ein Wand-Element. Usw. Der Benutzer kann diese Elemente (Mesh-Objekte in Blender) entwerfen und in Beziehung zueinander setzen. Zb.: dass ein Fassaden-Eck-Element nicht in der Mitte einer Fassade stehen darf. Oder bestimmte Fassadenelemente müssen so und so oft vorkommen. Oder die Tür muss in der Mitte sein usw. Die Höhe (Stockwerke) Breite und Länge ist vom Benutzer frei wählbar. Das ist nur mal der Anfang. Ich hab noch sehr viele Ideen.
Und das Projekt ist eigentlich nur der Auftakt zu einem etwas aufwendigeren Projekt das sich über das nächste halbe Jahr strecken wird.
niko
.
Ich habe in den letzten Monaten einen Teil von den Wiener Gründerzeithäuser nachmodelliert. Es wiederholen sich immer wieder bestimmte Fassadenelemente. Und da dachte ich mir, dass lässt sich doch mit einem Script schneller lösen.
Es soll ein 'Gebäude-Bauer' (Gründerzeithäuser) in Blender (www.blender.org) werden. Ein Element hat zum Beispiel 3m x 3m x 3m und ist ein Fassen-Element. Ein anderes ist ein Wand-Element. Usw. Der Benutzer kann diese Elemente (Mesh-Objekte in Blender) entwerfen und in Beziehung zueinander setzen. Zb.: dass ein Fassaden-Eck-Element nicht in der Mitte einer Fassade stehen darf. Oder bestimmte Fassadenelemente müssen so und so oft vorkommen. Oder die Tür muss in der Mitte sein usw. Die Höhe (Stockwerke) Breite und Länge ist vom Benutzer frei wählbar. Das ist nur mal der Anfang. Ich hab noch sehr viele Ideen.
Und das Projekt ist eigentlich nur der Auftakt zu einem etwas aufwendigeren Projekt das sich über das nächste halbe Jahr strecken wird.
niko
.
Wenn du auch nur 100 Elemente hättest, gäbe es schon rund 10^158 Permutationen. Aufgrund der identischen Elemente sind es zwar am Ende (möglicherweise sogar ganz erheblich viel) weniger, aber der von mir gezeigte "Ansatz" erzeugt ja erst einmal ALLE Permutationen.ni-ko-o-kin hat geschrieben:Wieso komme ich mit meinem Ansatz nicht weit? Rechenzeit?
Um mit so vielen Elementen zurecht zu kommen, wirst du dir einen intelligenteren Ansatz als diese "brute-force"-Methode überlegen müssen, die nur für ziemlich kleine Element-Anzahlen brauchbar ist.
-
- User
- Beiträge: 12
- Registriert: Samstag 13. Februar 2010, 10:51
Das war ja mein ursprüngliche Frage: wie schaut so eine intelligente Methode aus? Gibt es da einen Algorithmus der für so was gedacht ist?
Außerdem brauch ich nur eine Lösung die alle Bedingungen erfüllt. Sorted kann sicher auch nur eine Permutation ausgeben, oder?
Anfänglich hab ich ja versucht diese Permutation-Funktion selbst zu schreiben. Der Rechenaufwand war aber sehr hoch.
niko
.
Außerdem brauch ich nur eine Lösung die alle Bedingungen erfüllt. Sorted kann sicher auch nur eine Permutation ausgeben, oder?
Anfänglich hab ich ja versucht diese Permutation-Funktion selbst zu schreiben. Der Rechenaufwand war aber sehr hoch.
niko
.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Klingt für mich nach einem erweiterten Färbeproblem (Wiki Artikel)
Insofern vermute ich mal, dass es genauso NP vollständig ist. Also praktisch nicht lösbar.
Insofern vermute ich mal, dass es genauso NP vollständig ist. Also praktisch nicht lösbar.
Naja, deine ursprüngliche Frage war auch mit einem Beispiel mit 6 Elementen verknüpft. Hättest du gleich gesagt, dass es um >100 geht, hätte ich den Vorschlag mit Permutationen gar nicht erst gemacht.ni-ko-o-kin hat geschrieben:Das war ja mein ursprüngliche Frage: wie schaut so eine intelligente Methode aus? Gibt es da einen Algorithmus der für so was gedacht ist?
Trotz deiner Beschreibung (Fassaden etc.) habe ich noch nicht verstanden, warum du alle denkbaren "echten" Permutationen (d.h. ohne Dubletten) brauchst und inwiefern solche Größenordnungen zustande kommen. Genügt es denn nicht, beim Einfügen jedes neuen Elements dem "Bauherrn" zu sagen, an welche Stellen er es einfügen darf?
-
- User
- Beiträge: 12
- Registriert: Samstag 13. Februar 2010, 10:51
Ich seh schon: Falls ich sehr viele Elemente hab und die Bediungengen haben dann wird es viele Kombinationen geben die nicht funktionieren aber nur wenige die gültig sind. hm......
Aber es müssen doch schon viele, viele Menschen vor mir so ein Problem gehabt haben und eine Lösung gefunden haben???
niko
.
Aber es müssen doch schon viele, viele Menschen vor mir so ein Problem gehabt haben und eine Lösung gefunden haben???
niko
.
-
- User
- Beiträge: 12
- Registriert: Samstag 13. Februar 2010, 10:51
Sorry. My Bad!Naja, deine ursprüngliche Frage war auch mit einem Beispiel mit 6 Elementen verknüpft. Hättest du gleich gesagt, dass es um >100 geht, hätte ich den Vorschlag mit Permutationen gar nicht erst gemacht.
Es gibt halt ganz viele Möglichkeiten:Trotz deiner Beschreibung (Fassaden etc.) habe ich noch nicht verstanden, warum du alle denkbaren "echten" Permutationen (d.h. ohne Dubletten) brauchst und inwiefern solche Größenordnungen zustande kommen. Genügt es denn nicht, beim Einfügen jedes neuen Elements dem "Bauherrn" zu sagen, an welche Stellen er es einfügen darf?
1: ecke
2: fassadenteil
3: tür
zb
1-2-2-2-2-2-3-2-1
oder
1-2-3-2-2-2-2-2-1
usw
[edit] das ding geht dann in 3-Dimensionen, deswegen so viele elemente
und es gibt dann zb noch
4: fenster
5: fassdenteil_x (der zb nur neben fassadenteil y stehen darfs)
6: fassadenteil_y
usw
Ich dachte am Anfang, dass ich alle Möglichkeiten brauch, aber es hat sich herausgestellt dass ich nur eine gültige brauch.
Kennt ihr das Spiel Roller Coaster Tycoon? Da kann man seine Bahnen Auto-vervollständigen lassen:
http://www.youtube.com/watch?v=EMrXLY-addY
Bei dem Video findet er zwar keine Lösung aber im Spiel funktioniert das recht fein.Von der Idee her, sollte mein Programm so etwas werden.
niko
.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Hast Du meinen Beitrag gesehen und mal nachgeforscht? Wie gesagt sieht es für mich auf den ersten Blick wie ein Färbeproblem aus. Und damit wäre es eben NP.ni-ko-o-kin hat geschrieben: Aber es müssen doch schon viele, viele Menschen vor mir so ein Problem gehabt haben und eine Lösung gefunden haben???
-
- User
- Beiträge: 12
- Registriert: Samstag 13. Februar 2010, 10:51
Ja, hab ich gesehen und gelesen, aber verstanden hab ich das nicht. Aber wenn du meinst dass es ein nicht lösbares Problem ist versteh ich das auch nicht. Weil wir ja schon eine Lösung gefunden haben, nur ist leider der Zeitaufwand zu hoch. Also kann es doch sein, dass es auch eine Lösung gibt wo das schneller geht.
Vielen Dank mal an Alle die mir weitergeholfen haben. Ich werd weiter versuchen dafür eine Lösung zu finden. Vielleicht brauch ich einen anderen Ansatz an das Problem.
niko
.
Vielen Dank mal an Alle die mir weitergeholfen haben. Ich werd weiter versuchen dafür eine Lösung zu finden. Vielleicht brauch ich einen anderen Ansatz an das Problem.
niko
.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Das ist ja der Witz an NP-Vollständigkeit Natürlich wird es eine Lösung geben - aber Du kannst sie nicht berechnen.ni-ko-o-kin hat geschrieben:Weil wir ja schon eine Lösung gefunden haben, nur ist leider der Zeitaufwand zu hoch. Also kann es doch sein, dass es auch eine Lösung gibt wo das schneller geht.
Guck mal hier:
http://de.wikipedia.org/wiki/Problem_de ... sreisenden
Das dürftest Du verstehen
Wie gesagt, ich will mich nicht zu 100% festlegen, ob Dein Problem in diese Klasse fällt. Es sieht aber auf den flüchtigen Blick so aus.
-
- User
- Beiträge: 12
- Registriert: Samstag 13. Februar 2010, 10:51
ach so........... hm.......
Danke! Werd ich mir morgen durchlesen!
niko
Danke! Werd ich mir morgen durchlesen!
niko
passend dazu: http://cacm.acm.org/magazines/2009/9/38 ... m/fulltext