Forum: PC-Programmierung C# - Schwere Fragestellung - Wie ermittelt man unbekannte "Zwischenfunktionen" ?


von Marco K. (mbc)


Lesenswert?

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 ?

von Michael (Gast)


Lesenswert?

Hat irgendjemand verstanden, wovon er redet und kann das mal ins 
deutsche übersetzen?

von Peter (Gast)


Lesenswert?

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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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 
;)

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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.

von Marco K. (mbc)


Lesenswert?

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

von zwieblum (Gast)


Lesenswert?

und was hat das ganze mit "objekten" zu tun ?

von Läubi .. (laeubi) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von Marco K. (mbc)


Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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 ;)

von D. I. (Gast)


Lesenswert?

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

von Daniel (root) (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.