Einzelnen Beitrag anzeigen

Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

Baumstruktur aus Daten erzeugen: Eine Herausforderung! ;-)

  Alt 3. Jun 2014, 20:09
Hallo zusammen,

ich habe einen Fahrplan, durch den definiert ist, wo welche Teile in einer Produktion bearbeitet werden dürfen. Dafür werden Quell- und Zielstationen sowie eine Bedingung (nur Gutteile, nur Schlechtteile, ...) festgelegt.

Das sieht z.B. so aus (schematisch dargestellt):
Code:
class FahrplanEintrag
{
    int QuellStation; // -1 = Keine Vorgeschichte, d.h. ZielStation = Start-Station
    int ZielStation;
    int Bedingung;
}

List<FahrplanEintrag> Fahrplan = new List<FahrplanEintrag>()
{
    new FahrplanEintrag()
    {
        QuellStation = -1,
        ZielStation = 1,
        Bedingung = 0, // alle Teile
    },
    new FahrplanEintrag()
    {
        QuellStation = 1,
        ZielStation = 2,
        Bedingung = 1, // nur Gutteile
    },
    new FahrplanEintrag()
    {
        QuellStation = 1,
        ZielStation = 1,
        Bedingung = 2, // nur Schlechtteile (erneute Bearbeitung in Station 1 zulässig)
    },
    new FahrplanEintrag()
    {
        QuellStation = 2,
        ZielStation = 3,
        Bedingung = 1, // nur Gutteile
    },
    // ...
}
Das bedeutet für obiges Beispiel:

In der ZielStation 1 darf jedes Teil bearbeitet werden, das zuvor an keiner Station bearbeitet wurde oder in Station 1 war und schlecht bearbeitet wurde. Es beginnt also mit Station 1.
In Station 2 dürfen alle Teile bearbeitet werden, die zuvor in Station 1 waren und dort gut bearbeitet wurden. Waren die Teile in Station 2 gut, dürfen sie in Station 3 bearbeitet weerden.

Es kann mehrere Start-Stationen geben und mehrere Zielstationen.

Ein Teil dürfte auch z.B. wie folgt durchlaufen:
Code:
1 -> 2 -> 3 -> 4 -> 5 -> 6
      |               |
      |-> 7 ----------|
Das Teil darf also von Station 2 in Station 3 oder in Station 7 kommen.
Von 3 darf es nur in 4 und dann in 5 und dann in 6.
Geht das Teil von 2 nach 7, darf es von 7 nur in 6 weiterbearbeitet werden.

Es kann auch Fälle geben, in denen ein Teil, das in 6 schlecht wurde, wieder zurück nach 2 muss o.ä.

Es gibt also beliebige Verzweigungen und Zusammenführungen.

Anhand der obigen Definitionsliste (List<...>), in der die Einträge beliebig angeordnet sind, möchte ich nun alle möglichen Wege eines Teils bekommen.
Entweder mit einem Baum oder irgendwie anders. So, dass ich das auch visualisieren könnte.

Wie kann ich das denn machen?

Eine Start-Station ist für mich eine, in der die Quell-Station = -1 ist. D.h. damit muss ich vermutlich irgendwie beginnen (wie gesagt, es kann auch mehrere Start-Stationen geben).

Ich dachte evtl. an eine Struktur in der Art, aber vielleicht geht es auch schöner:
Code:
class EinzelneStation
{
    int AktuelleStation; // "Knoten" mit der Station, in der sich das Teil geared befindet
    List<EinzelneStation> NaechsteStationen; // Liste von "Knoten", zu denen das aktuelle Teil als nächstes darf
    List<int> RuecksprungStation; // im Falle, dass das Teil wieder zurück an vorige Stationen darf, steht hier die Nr., damit es keine "Endlosschleife" gibt
    int BedingungFuerBearbeitungsfreigabe;
}

List<EinzelStation> AlleMoeglichenWege
Evtl. mit Rekursion beginnend bei den Start-Staionen (Abbruchbedingungen sind: Rücksprung zu einer vorigen Station bzw. End-Station erreicht).

Ergebnis soll (wie auch immer) etwas in der Art sein, das mir alle möglichen Wege aufzeigt:
Code:
1 (Rücksprung: 1, Bedingung: Wenn Schlechtteil in 1)
2 (Bedingung: nur Gutteil)
3 (Bedingung: nur Gutteil)

ODER

1 (Rücksprung: 1, Bedingung: Wenn Schlechtteil in 1)
2 (Bedingung: nur Gutteil)
4 (Bedingung: nur Schlechtteil)

ODER

...
Konntet ihr's halbwegs nachvollziehen?

Ich möchte aus der Fahrplandefinition ermitteln, welche möglichen Wege ein Teil nehmen kann (mit den entsprechenden Bedingungen).

Grüße
Matze

Geändert von Matze ( 3. Jun 2014 um 20:11 Uhr)
  Mit Zitat antworten Zitat