Tja, ich weis nicht mal wie ich den Betreff formulieren kann. Also ich habe als Beispiel 2 "Objekte": Objekt "A" und Objekt "D" Nun habe ich noch zwei "Hilfsobjekte" "B" und "C". Mein Vorhaben: Ich möchte Objekt "A" in Objekt "D" "umwandeln", dies geht aber nicht direkt, sondern nur über das Objekte "B" und danach dann "C". Es muß also eine betimmte Reihenfolge eingehalten werden. Die Buchstaben hier dienen nur als Beispiel, später gibt es keine so schön nachvollziehbare "Reihenfolge". Grob gesagt: Ich habe zwei Bekannte und dazwischen einen unbekannten Raum. Es kann z.B. aber auch sein, das ich Objekt "A" und "R" habe und zum umwandeln nur Objekt "F" benötige, weil Objekt "F" das Objekt "A" direkt nach "R" umwandeln kann. Was die Objekte von was nach was umwandeln können ist mir bekannt. Als Beispiel: Ich habe eine MP3 und will ein FLAC draus machen Ich habe also nun einen MP3 dekoder, der aber nur nach WAV dekodieren kann. FLAC nimmt jedoch auch nur WAV an. Eine direkte Umwandlung von MP3 nach WAV ist nicht möglich, ich benötige also WAV als Zwischenschritt. Zu meinem Beispiel wäre dann: Objekt "A" = MP3, Objekt "C" = FLAC Da ich ein Objekt "B" habe welches MP3 nach WAV dekodieren kann und FLAC WAV als Eingang akzeptiert bräuchte ich als nur ein Zwischenobjekt, nämlich "B" als Verbindung. Wie erwähnt ... manchmal kann es sein dass zwei Zwischenobjekte nötig sind, das muß halt anhand der bekannten Ein-Ausgabe jeder Objekte "ausgepuzzelt" werden können. Mein Problem nun: Wie ermittelt man programmiertechnisch welche "Zwischenobjekte" benötigt werden. Hier benötige ich ja jetzt Objekt "B" und "C", hätte ich jedoch nur "A" und "C" würde ich ja nur "B" benötigen. Ich habe keine Plan wie man sowas macht oder die Sache angeht, auch nicht wonach ich suchen müßte. Wie ermittelt man die benötigten Zwischenschritte ? Man kann das sicherlich fest kodieren, aber alle möglichen Kombinationen fest zu kodieren dürfte unmöglich sein. Deshalb müßte es irgendwie "automatisch" gehen. Kann jemand helfen ?
Hat irgendjemand verstanden, wovon er redet und kann das mal ins deutsche übersetzen?
ich würde das ganze ohne das Object zeugt betrachten, wie du es schon mit den Musikformaten gemacht hast. Du brauchst dann einen Alghorithmus welche aus jedem Konverter das input und output Format ausliest. Dann baust du dir alle Kombinationen die möglich sind zusammen. A (input WAV, output MP3) B (input MP3, output FLAC) erster schritt: WAV -> MP3 (ausgelesen aus A) MP3 -> FLAC (ausgelesen aus B) zweiter schritt: suche alle input formate die jemand anders als output hat -> MP3 gefunden also Tabelle erweitern WAV -> MP3 (ausgelesen aus A) WAV -> MP3 -> FLAC ( logische konzequenz ) MP3 -> FLAC (ausgelesen aus B) dies machst du solange bisst du nichts mehr erweitern kannst, musst aufpassen das du kein Ring baust!. Am sinnvollsten wird sein abzubrechen wenn man ein format hat welches in der kette schon vorhanden ist. WAV -> MP3 -> WAV -> abbruch weil sinnlos Wenn du jetzt von WAV nach FLAC wandeln willst, dann musst du in der Tabelle suchen ob es ein INPUT mit WAV und ein output mit FLAC gibt, wenn ja hast du eine Lösung. Kannst ja weiter suchen ob es nicht noch weiter lösungen gibt, eventuell kürzere.
Du kannst auch eine Menge aus (gerichteten) Graphen erzeugen als Knoten dann den gültigen Output und von wo nach wo gewandelt werden kann. Dann verschmilzt du jeden Output Knoten mit einem passenden Input Knoten solange bis keine verschmelzungen mehr möglich sind. Das Ergebnis ist dan ein Graph in dem du mit verschiedenen Algorithmen prüfen kannst ob es einen Möglichen weg gibt, ob es einen Kürzesten gibt, und wenn du auch noch Gewichte verteilst welches der "günstigste" Weg ist... Vieleicht wäre es aber besser wenn du erstmal versuchst in knappen verständlichen Worten zu formulieren welches dein eigentliches Ziel ist ;)
Ist das nicht im Prinzip nichts anderes als ein Pathfinder-Algorithmus? Unter diesem Begriff dürfte sich bestimmt einiges finden lassen, wie man das Problem (evtl. näherungsweise) löst.
Ja, tut mir leid das ich es nicht besser beschreiben kann, ich tappe da vollkommen im Dunkeln ... Also es ist richtig, ich suche einen "Pfad". Ich versuche mal ein anderes Beispiel: Ich fahre in Urlaub und brauche eine andere Geldwährung. Ich habe: Euro Ich brauche: Dollar In der Stadt habe ich nun 10 verschiede Banken die mir Geld umtauschen können. Problem: Nicht jede dieser Banken nimmt Euro an, oder gibt Dollar raus. Im idealsten Fall suche ich also eine Bank die Euro annimmt und mir direkt Dollar rausgibt. Dann wäre ich mit einer einzigen Bank bedient. Im schlechtesten Fall (wenn ich keine Bank finde die Euro annimmt und Dollar rausgibt) muß ich zuerst eine Bank finden die mir meine Euro in z.B. Franken umwandelt, damit ich diese Franken dann bei wiederrum einer anderen Bank nach Dollar umtauschen kann. Hier wären dann zwei Banken für den Umtausch notwendig. Ich denke mal das dieses Beispiel eindeutiger sein sollte. Ich suche also den Pfad um von Euro nach Dollar zu kommen. Genau das soll mein Programm machen. Ich weis, was die Banken annehmen und was sie rausgeben können, ebenso weis ich, was ich habe und was ich brauche. Den Kram dawischen möchte ich jetzt "automatisch" auspuzzeln lassen. Mit den "gerichteten Graphen" und dem "Pathfinder" klingt schon mal ganz gut, ich hab aber noch keine Ahnung was die machen und ob ich da eine möglichst Noob-freundliche Erklärung zu finde. MFG
und was hat das ganze mit "objekten" zu tun ?
Marco K. schrieb: > Mit den "gerichteten Graphen" und dem "Pathfinder" klingt schon mal ganz > gut, ich hab aber noch keine Ahnung was die machen und ob ich da eine > möglichst Noob-freundliche Erklärung zu finde. Hab dir mal nen Bild gemalt von einem gerichteten Graphen Ein Pfeil von einem A Knoten zu einem Knoten B bedeutet einfach: A kann in B umtauschen (als Beispiel). Was dir jezt noch fehlt ist ein Weg von eimen Start (z.B. 1) zum Ziel (z.B. 9) Diesen kann man recht einfach bestimmen: 1) lese alle Nachfolger von (A) 2) Für jeden Nachfolger wenn Nachfolger = Ziel --> Fertig wenn Nachfolger != Ziel --> Prüfe die Nachfolger des Nachfolgers Das einzige Problem ist der Weg 1-->6-->4-->7-->6 ... da bewegst du dich im Kreis. Deshalb merkst du dir zusätzlich noch welche Knoten du schon untersucht hast, triffst du auf so einen verfollgst du den Weg nicht weiter. Nennt sich Tiefensuche und ist relativ einfach. Für unser Beispiel also: 1) besucht = {1}; 2) Nachfolger = 6 3) 6 != 9 --> Nachfolger von 6 bestimmen, 6 als besucht markieren 4) besucht = {1, 6} 5) Nachfolger = 4 6) 4 != 9 --> Nachfolger von 4 bestimmen, 4 als besucht markieren 7) besucht = {1, 6, 4} 8) Nachfolger = 7 9) ... 10) .. 11) 7 hat die Nachfolger 6 und 9, 6 war schon besucht wird also übersprungen, 9 ist unser Ziel wir haben einen Weg gefunden. Du brauchst also: Eine Datenstruktur die einen gerichteten Graphen darstellt (das geht bei n Knoten z.B. über eine n x n boolean matrix) Und eine Funktion die dir alle Nachfolger gibt (das ist dann eine Zeile/Spalte in dieser Matrix) Und schon kann es losgehen... Haben wir im 3ten Semester mal im Softwarepraktikum programmieren müssen mit GUI und Animation, ist also kein Hexenwerk.
Naja, ... "Objekte" halt mit "" ... kann halt alles sein. Mir gings ja um den Algorithmus um zu wissen was ich da dann in welcher Reihenfolge aufrufen müßte. @ Läubi: Schon nicht schlecht :-))) hat mich hier rauf gebracht: http://www.hann3mann.de/web-artikel/28/Dijkstra-Algorithmus-in-C-csharp.html Nennt sich "Dijkstra Algorithmus" ... Wenn ich jetzt als nichtstudierter und nichtprogrammierer den Code seoweit lauffähig kriege bin ich glücklich, klingt nach genau dem, was ich suchte ... Start eingeben, Ziel eingeben --> kürzester Weg wird ausgesucht ... klingt perfekt. Meine Stationen sind dann halt keien Städte sondern Funktionen bzw. Programme ... Dankeschön ! MFG
Marco K. schrieb: > @ Läubi: > > Schon nicht schlecht :-))) hat mich hier rauf gebracht: > Nennt sich "Dijkstra Algorithmus" ... Jo das geht natürlich auch ich wollte dich nur nicht gleich mit sowas verschecken und für den Anfang reicht es ja vieleicht auch erstmal irgeneinen Weg zu finden, verbessern kann man das immer noch ;)
Wenn deine Kantengewichte alle 1 sind dann reicht auch eine einfache Breitensuche (= Dijkstra auf ungewichteten Graphen) Und fuer die Graphdarstellung nimmst du lieber Adjazenzlisten als Matrizen
ehm: dein Betreff enthällt jede Menge irrelevantes Zeug. 1) C# 2) Schwere Fragestellung zu 1) Manchmal ist Sprache wichtig, aber bei dir geht es um das Konzept bzw Algorithmus zu 2) das ist sehr subjektiv
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.