
|
Eine Reise über alle Seitenflächen des Ikosaeders darf nur über benachbarte Flächen erfolgen,
und jede Fläche ist genau einmal zu betreten. Es sind folgende Fälle zu unterscheiden:
A. Zwei Flächen heißen benachbart, wenn sie eine gemeinsame Kante besitzen. B. Zwei Flächen heißen benachbart, wenn sie eine gemeinsame Kante oder einen gemeinsamen Punkt besitzen. Die Kosten K einer Reise werden durch das Skalarprodukt Kosten = 1*F1 + 2*F2 + ... + i*Fi + · · · + 20*F20 erklärt. Dabei ist Fi die Nummer der im i-ten Schritt betretenen Fläche. Gib für die beiden Fälle alle Reisen an, für die die Kosten minimal sind. Sollte es nicht möglich sein, exakte Lösungen zu ermitteln (Zeit- oder Speicherplatzkomplexität der Algorithmen), so sind Algorithmen zum Berechnen von Näherungslösungen zu implementieren." |
![]() |
% Beschreibung der Lage der Flächen
% Jede Fläche hat drei Nachbarn
nachbar(20, [14, 8, 2]).
nachbar(19, [ 9, 3, 1]).
nachbar(18, [ 5, 4, 2]).
nachbar(17, [10, 7, 3]).
nachbar(16, [ 8, 6, 3]).
nachbar(15, [12, 7, 5]).
nachbar(14, [20, 6, 4]).
nachbar(13, [11, 5, 1]).
nachbar(12, [15,10, 2]).
nachbar(11, [13, 9, 4]).
nachbar(10, [17,12, 8]).
nachbar( 9, [19,11, 6]).
nachbar( 8, [20,16,10]).
nachbar( 7, [17,15, 1]).
nachbar( 6, [14,16, 9]).
nachbar( 5, [18,15,13]).
nachbar( 4, [18,14,11]).
nachbar( 3, [19,17,16]).
nachbar( 2, [20,18,12]).
nachbar( 1, [19,13, 7]).
% Ein Zug ist ganz einfach programmiert
zug(Pos, Nachf) :-
nachbar(Pos, Nachbarn),
member(Nachf, Nachbarn).
start :-
nachbar(Startpos, _),
weg([Startpos], Startpos, Loesung, Kosten),
write(Loesung), nl,
write(Kosten), nl,
fail.
% Die Wegsuche als einfache begrenzte Tiefensuche
weg(Pfad, Kosten, Pfad, Kosten) :-
Kosten < 1964,
length(Pfad, 20).
weg([P | Anfang], Kosten, Loesung, Ergebnis) :-
Kosten < 1944, % <=Ist diese Grenze sinnvoll???
zug(P, Nachf),
\+ member(Nachf, Anfang),
length(Anfang, Tiefe),
KostenNeu is Kosten + Nachf*(Tiefe + 2),
weg([Nachf, P | Anfang], KostenNeu, Loesung, Ergebnis).
wieoft :- % zeigt, dass es 3240 Wege gibt.
findall(-,
(nachbar(S,_), weg([S],0,_,_)),
Liste),
length(Liste, N),
write(N).
|