Autor Beitrag
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 26.12.08 16:26 
Moin!

Hier also die Lösung zur LAN-Party. :)

Das grundlegende Problem wird in der Literatur als "Das Problem der stabilen Ehe" ("stable marriage problem" oder "stable match") bezeichnet. Es existiert eine sehr effiziente Referenzlösung von Gale und Shapley aus dem Jahre 1962, die einen linearen Aufwand hat. :shock: Aus diesem Grund haben wir die Basis-Lösung für kombinatorische Probleme - Backtracking (=exponentieller Aufwand!) - ausgeschlossen. 8) Das ist hier schließlich eine Paranuss... :angel:

Die Idee besteht darin, jeden Wichtel der Reihe nach einen »Bewerber« werden und ein Engelchen suchen zu lassen. Offensichtlich besteht der erste Schritt der Suche darin, dem ersten Engelchen auf seiner Liste einen Antrag zu machen. Falls dieses bereits mit einem Wichtel im Team ist, den es bevorzugt, muß unser Wichtel das nächste Engelchen auf seiner Liste ansprechen und damit fortfahren, bis er ein Engelchen findet, das nicht im Team ist oder ihn ihrem gegenwärtigen Teampartner vorzieht. Falls dieses Engelchen nicht in einem Team ist, so bildet es mit dem Bewerber ein Team, und der nächste Wichtel wird Bewerber. Falls das Engelchen bereits im Team ist, so löst es das Team auf und bildet ein Neues mit dem Bewerber (den es bevorzugt). Dadurch bleibt dem alten Teampartner-Wichtel nichts weiter übrig, als nochmals Bewerber zu werden, wobei er in seiner Liste wieder dort beginnt, wo er aufgehört hatte. Eventuell findet er einen neuen Teampartner, doch dazu muß vielleicht ein anderes Team aufgelöst werden. Wir fahren in dieser Weise fort, wobei wir, wenn nötig, Teams auflösen, bis ein Bewerber ein Engelchen findet, das noch nicht im Team ist.

Die Wichtel gehen ihre Präferenzlisten einfach der Reihe nach durch, so daß jede Implementation linearer Listen verwendet werden kann. Da die Präferenzlisten alle die gleiche Länge haben, ist es am besten, eine einfache Implementation als zweidimensionales Feld zu benutzen. Zum Beispiel bezeichnet prefer[m,w] das w-te Engelchen auf der Präferenzliste des m-ten Wichtels. Außerdem müssen wir registrieren, wie weit jeder Wichtel auf seiner Liste gekommen ist. Dies kann mit einem eindimensionalen Feld next realisiert werden, das mit 0 initialisiert wird, wobei next[m]+1 der Index des nächsten Engelchens auf der Präferenzliste des m-ten Wichtels ist; der Bezeichner ist in prefer[m,next[m]+1] zu finden.

Für jedes Engelchen müssen wir den Teampartner registrieren (fiancee[w] bezeichnet den Wichtel, der mit Engelchen w im Team ist), und wir müssen in der Lage sein, die Frage »Ist Wichtel s dem Wichtel fiancee[w] vorzuziehen?« zu beantworten. Dies könnte getan werden, indem die Präferenzliste sequentiell durchsucht wird, bis entweder s oder fiancee[w] gefunden wird, doch diese Methode wäre sehr ineffizient, wenn sich beide nahe dem Ende befinden. Was benötigt wird, ist die zur Präferenzliste »inverse« Liste: rank[w,s] ist der Index des Wichtel s auf der Präferenzliste des Engelchens w.

Die Eignung des Bewerbers s kann sehr schnell bestimmt werden, indem geprüft wird, ob rank[w,s] kleiner als rank[w,fiancee[w]] ist. Diese Felder lassen sich leicht unmittelbar aus den Präferenzlisten erzeugen. Abschließend benötigen wir noch einen als »Marke« dienenden Wichtel 0 als anfänglichen Bewerber und setzen diesen an das Ende der Präferenzlisten aller Engelchen.

Mit den in dieser Weise initialisierten Datenstrukturen ist die Implementation, so wie sie oben beschrieben wurde, sehr einfach:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
for m := 1 to N do begin
  s := m;
  repeat
    next[s] := next[s] +1;
    w := prefer[s,next[s]];
    if (rank[w,s] < rank[w,fiancee[w]]) then begin
      t := fiancee[w];
      fiancee[w] := s;
      s := t;
    end;
  until (s = 0);
end;
Jede Iteration beginnt mit einem Wichtel, der nicht im Team ist, und endet mit einem nicht im Team befindlichen Engelchen. Die repeat-Schleife muß abbrechen, da die Liste jedes Wichtels jedes Engelchen enthält und jede Iteration der Schleife die Liste irgendeines Wichtels inkrementiert; dazu muss folglich ein nicht im Team befindliches Engelchen gefunden werden, ehe die Liste aller Wichtel abgearbeitet ist. Die durch den Algorithmus erzeugte Menge der Teams ist stabil, da jedes Engelchen, das irgendeinen Wichtel gegenüber seinem Team-Partner bevorzugt, mit jemandem im Team ist, den es ihm gegenüber bevorzugt.

Im Anhang befindet sich eine Musterlösung, die nach diesem Ansatz arbeitet. Eine sehr ausführliche, deutsche Beschreibung findet sich in: Sedgewick, Robert: Algorithmen, Addison Wesley (1992), ISBN-10: 3893194029, ISBN-13: 978-3893194025

Wir wünschen allen Mitspielern viel Glück bei der Auswertung! ;)

cu
Narses
Einloggen, um Attachments anzusehen!
_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 26.12.08 17:08 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Eine sehr ausführliche, deutsche Beschreibung findet sich in: Sedgewick, Robert: Algorithmen, Addison Wesley (1992), ISBN-10: 3893194029, ISBN-13: 978-3893194025
*Umdreht* *in Schrank starrt* *ein Buch fixiert* :autsch: :autsch: :autsch:
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Fr 26.12.08 19:11 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Eine sehr ausführliche, deutsche Beschreibung findet sich in: Sedgewick, Robert: Algorithmen, Addison Wesley (1992), ISBN-10: 3893194029, ISBN-13: 978-3893194025
*Umdreht* *in Schrank starrt* *ein Buch fixiert* :autsch: :autsch: :autsch:

*Auch in Regal guck*

Links, 2. Fach, 2. Buch. :autsch:


Das doofe ist, dass wir sogar das Heiratsproblem als Idee hatten, aber das hab ich abgelehnt, weil darin keine Priorisierung vorkommt. Dass man die *so* einbauen kann, hätt ich net gedacht.
So ein Mist, ich bin Schuld dass mindestens 2 Leute das nicht raushaben. Hm, muss man da jetzt ne Krise kriegen?

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 26.12.08 19:13 
Ich habe nicht so sehr darüber nachgedacht, aber eigentlich hätte ich auch keinen fertigen Algorithmus verwenden wollen. :D
Und für genaueres Nachdenken hab ich nie die Zeit gehabt.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 26.12.08 21:52 
*gfg* Ich hatte einen Algorithmus zum Heiratsproblem schon gefunden... Aber nicht wirklich gedacht, dass der auf das Problem passt. WTF :autsch: !

@Linearer Aufwand: Das bezweifel ich, da im Worstcase jegliche gebildeten Paare noch einmal aufgelöst werden müssen: Quadratisch würd ich akzeptieren, u.U. n*log(n) als Mean Case ... Aber linear ist höchstens Best Case ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Fiete
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 601
Erhaltene Danke: 339

W7
Delphi 6 pro
BeitragVerfasst: So 28.12.08 13:24 
Moin,
mir hat Narses Hinweis geholfen, daß die Lösung von Horst zu meiner 44-er Tabelle nicht stimmt. Denn diese Minimumsuche hatte ich auch erst angedacht. Dann habe ich zei Tage gesucht, bin über stabile Heirat dann auf Gale Shapley gestoßen. Der Rest war dann leicht.

It's a long way to tipp a rary :wink:

Gruß an alle Tüftler und die Rätselerfinder
Fiete

_________________
Fietes Gesetz: use your brain (THINK)
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: So 28.12.08 13:36 
Hallo,

ich habe schon gewusst, das meine Lösung falsch war, weil ich einfach Paranuss 3 darauf angesetzt habe, bei mir der PRIM-Algo.Das wäre auch zu einfach gewesen ;-)
Ich wollte anschliessend mit Mengen arbeiten, indem ich einen Engel auswählte, und beginnend bei dem Wichtel, der die geringste Zuneigung empfand, dann aufsteigend schaute, ab wann die Schnittmege der bevorzugten leer war.
Da habe ich mich dann verzettelt. Die Dämmung vom Dach war auch wichtiger...

Gruß Horst