Prolog Aufgabe Hilfe!

Doc.Murphy

Redshirt
Mitglied seit
27.01.2006
Beiträge
1
Renomée
0
Hallo liebe Gemeinde.

Dies ist mein erster Beitrag und hoffe auf eure Hilfe.

Ich habe eine Übungsaufgabe zu lösen komme aber damit nicht weiter. Wäre nett wenn mir dabei einer helfen könnte. die Aufgabe sieht folgendermaßen aus:

Gegeben sei der folgende Ausschnitt aus dem Streckennetz der Deutschen Bahn AG mit folgender Faktentabelle:


verbindung(ice, nuernberg, bayreuth, 47).
verbindung(ice, bayreuth, hof, 54).
verbindung(ice, hof, plauen, 29).
verbindung(ice, plauen, zwickau, 28).
verbindung(ice, zwickau, chemnitz, 44).
verbindung(ice, wuerzburg, nuernberg, 52).
verbindung(ice, nuernberg, bamberg, 33).
verbindung(ice, bamberg, lichtenfels, 19).
verbindung(ice, lichtenfels, saalfeld, 48).
verbindung(re, wuerzburg, bamberg, 55).
verbindung(re, wuerzburg, nuernberg, 75).
verbindung(re, bamberg, lichtenfels, 18).
verbindung(re, lichtenfels, hof, 73).
verbindung(re, nuernberg, bamberg, 46).
verbindung(re, bamberg, lichtenfels, 26).
verbindung(re, nuernberg, bayreuth, 61).
verbindung(re, bayreuth, hof, 38).
verbindung(re, hof, zwickau, 57).
verbindung(re, sallfeld, erfurth, 61).


Der Fahrer fährt mit einem Typ (ICE, RE) von A nach B mit der Zeit, die er dafür benötigt.

Nun zur Aufagbe:

Entwickeln Sie ein Expertensystem in Prolog, das Reisende bei ihrer Streckenplanung unterstützt. Dabei ist zu beachten, dass die jeweilige Fahrtdauer die gesamte Fahrtdauer in Minuten darstellt. Bei der Erfassung der Fakten mÄussen also die Fahrtdauern zwischen den einzelnen Stationen ausgerechnet werden. Also müssen beispielsweise für die Verbindung Nürnberg - Chemnitz folgende Fakten in die Datenbasis aufgenommen werden:

verbindung(ice, nuernberg, bayreuth, 47).
verbindung(ice, bayreuth, hof, 54).
...
So können die gesamte Fahrtdauer und die dabei durchlaufenen Stationen rekursiv ermittelt werden.
Folgender Beispieldialog veranschaulicht, wie das Expertensystem arbeiten soll:


1 ?- run.
Expertensystem zur Streckenplanung
----------------------------------
Bitte Startbahnof eingeben: nuernberg
Bitte Zielbahnof eingeben: plauen
Bitte gewuenschten Zugtyp eingeben: ice
Weg mit jeweiligen Stationen: [nuernberg, bayreuth, hof, plauen]
Gesamtfahrdauer in min.: 130
Yes


Verwenden tue ich SWI-Prolog.

Einen Code habe ich schon der wie folgt aussieht, aber leider noch nicht richtig ist und auch noch einiges fehlt. Faktentabelle hab ich ja schon oben gepostet...die steht bei mir ganz am Anfang:

verbunden(A,B) :- verbindung(_,A,B,_).
verbunden(A,B) :- verbindung(_,B,A,_).

kostet(A,B,Kosten) :-verbindung(_,A,B,Kosten).
kostet(A,B,Kosten) :-verbindung(_,B,A,Kosten).

art(Typ,A,B,_) :-verbindung(Typ,A,B,_).
art(Typ,A,B,_) :-verbindung(Typ,B,A,_).

bewerte_heuristisch(KnotenA,KostenA,KnotenN,KostenN):-
kostet(KnotenA,KnotenN,KantenKosten),
KostenN is KostenA+KantenKosten.

sortiere_gefPfade_ein([],Liste,Liste).
sortiere_gefPfade_ein([K|R],Liste1,Liste3):-
sortiere_Pfad_ein(K,Liste1,Liste2),
sortiere_gefPfade_ein(R,Liste2,Liste3).

sortiere_Pfad_ein(Pfad,[],[Pfad]).
% Pfade mit kleineren Kosten stehen weiter vorne
sortiere_Pfad_ein(Pfad1,[Pfad2|Rest],[Pfad1,Pfad2|Rest]):-
Pfad1=pfad(_,K1),Pfad2=pfad(_,K2),K1=<K2,!.
% hierher kommt man wegen des Cuts nur im Fall K1>K2
sortiere_Pfad_ein(Pfad1,[Pfad2|Rest1],[Pfad2|Rest2]):-
sortiere_Pfad_ein(Pfad1,Rest1,Rest2).

heuristischeSuche(Start,Ziel,Loesung):-
heuristischeSuche(pfad([Start],0),[],Ziel,Loesung).

heuristischeSuche(Pfad,Pfade,Ziel,Loesung):pfad=pfad([Ziel|_],_),
Pfad=Loesung,!.

heuristischeSuche(Pfad,Pfade,Ziel,Loesung):-
Pfad=pfad([KnotenA|RestPfadA],KostenA),
findall(pfad([KnotenN,KnotenA|RestPfadA],KostenN),
(verbunden(KnotenA,KnotenN),
not(member(KnotenN,[KnotenA|RestPfadA])),
bewerte_heuristisch(KnotenA,KostenA,KnotenN,KostenN)),
GefundenePfade),
sortiere_gefPfade_ein(GefundenePfade,Pfade,NeuePfade),
NeuePfade=[PfadN|RestPfade],
heuristischeSuche(PfadN,RestPfade,Ziel,Loesung).


So da la....langer Beitrag. Hoffe es kann mir einer helfen, da ich schon am 5.2 damit fertig sein muss. :)

Grüße
Murphy
 
Zurück
Oben Unten