Forum: PC-Programmierung Algorithmus Ideen gesucht


von Michal P. (michal)


Lesenswert?

Hallo liebe Community,

X Fussballspieler haben Bewertungen z.B. von 1 bis 10.

Sie sollen random aber ausgeglichen in Y Teams aufgeteilt werden.

Brainstorming start :)

Danke in Voraus

Michal

von Stefan P. (form)


Lesenswert?

- Spieler nach Bewertung sortieren
- Der Reihenfolge nach auf die verschiedenen Teams verteilen
- Bei jedem Durchgang die Richtung umkehren
- Profit

von Fabian H. (hdr)


Lesenswert?

Ich fühle mich zurück in meine Schulzeit versetzt, wie ich stets als 
letzter bei der Teamverteilung auf der Bank gesessen habe und dann durch 
den Lehrer einem Team zugewiesen wurde... :(

von Michal P. (michal)


Lesenswert?

Stefan P. schrieb:
> - Der Reihenfolge nach auf die verschiedenen Teams verteilen
> - Bei jedem Durchgang die Richtung umkehren


Meinst du das so?
1. Reihenfolge aufsteigend
2. Team 1: + Spieler 1., Team 2: + Spieler 2., Team 3: + Spieler 3. usw?
3. Ausgewählten Spieler von der Liste entfernt
3. Reihenfolge absteigend
4. Team 1: + Spieler 1. (von den Verbleibenden), Team 2: + Spieler 2., 
Team 3: + Spieler 3. usw?
5. Ausgewählten Spieler wieder von der Liste entfernt
6. Reihenfolge wieder aufsteigend
7. Team 1: + Spieler 1. (von den Verbleibenden), Team 2: + Spieler 2., 
Team 3: + Spieler 3. usw?

von Michal P. (michal)


Lesenswert?

Das würde funktionieren allerdings bei gleichen Anwesenheiten immer die 
gleichen Teams erstellen. Wir möchten noch etwas Zufall dazu haben...

von Michal P. (michal)


Lesenswert?

Da könnte ich beim Punkt 2. randomly so +/- 2...3 Spieler schwenken

von Michal P. (michal)


Lesenswert?

Ich weiss schon, bei dem Punkt 2. die Teams-Reihenfolge randomisieren

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Ich fühle mich zurück in meine Schulzeit versetzt, wie ich stets
> als letzter bei der Teamverteilung auf der Bank gesessen habe und
> dann durch den Lehrer einem Team zugewiesen wurde... :(
Schlechter Lehrer, solche Leute lässt man die Teams wählen, dann sind 
sie automatisch mit drin und keiner kann meckern.

> X Fussballspieler haben Bewertungen z.B. von 1 bis 10.
> Sie sollen random aber ausgeglichen in Y Teams aufgeteilt werden.
Könnte man mit einem Monte-Carlo-Algorithmus lösen. Einfach alle Spieler 
zufällig verteilen, die Spielerwerte zu Teamwerten addieren und 
anschließend bewerten, ob das Ergebnis ausgeglichen genug ist. Wenn 
nicht, Vorgang wiederholen bis man ein Ergebnis erhält, was gut genug 
ist. Alternativ so viele Durchläufe wie in bestimmter Zeit möglich und 
die ausgeglichenste Verteilung ausgeben.

Edit: Man könnte auch probieren, passende Spieler zwischen dem höchst- 
und niedrigstbewertetem Team zu tauschen bis alle Teams den gleichen 
Score haben (oder ausreichend nahe beieinander liegen).

Dabei fällt mir auf, die Aufgabenstellung ist noch zu ungenau. Soll 
immer das optimalste bzw. ausgeglichenste Ergebnis gefunden werden, auch 
wenn dieses keinen Zufall mehr zulässt (weil es evtl. nur eines gibt) 
oder ist Zufall wichtiger und man braucht nur ein beliebiges Ergebnis 
oberhalb eines Grenzwertes?

: Bearbeitet durch User
von Michal P. (michal)


Lesenswert?

Hi Ben,

good point, das würde ich mit einem "Schiebeparameter" den User 
bestimmen lassen, zwischen "optimal ausgeglichen" und "möglichst 
zufällig".

Danke für deine Inputs

Michal

von Wolfgang S. (wolfgang_s278)


Lesenswert?

Hier ist eine rekursive Routine sinnvoll.

Prinzip:
...
1.-füge nächsten Spieler hinzu
2.-Spieler als ausgewählt kennzeichnen
3.-Prüfe alle Bedingungen
4.Fertig, dann Return, sonst ...
5.-alle Bedingungen erfüllt, dann Prozedur erneut aufrufen
6.-sonst Spieler freigeben und 1. aufrufen

von U. B. (Gast)


Lesenswert?

> Ich fühle mich zurück in meine Schulzeit versetzt, wie ich stets als
> letzter bei der Teamverteilung auf der Bank gesessen habe und dann
> durch den Lehrer einem Team zugewiesen wurde... :(

Ich hätte Dich aber immer zuerst gewählt, ehe dass ich selbst
ins Tor gemusst hätte.     ;-)

von MaWin O. (mawin_original)


Lesenswert?

Werden Hausaufgaben heute nicht mehr selbstständig erledigt?

von Gustl B. (-gb-)


Lesenswert?

Michal P. schrieb:
> Ich weiss schon, bei dem Punkt 2. die Teams-Reihenfolge randomisieren

Dann kannst du gleich von Anfang an zufällig zuweisen.

Stefan P. schrieb:
> - Bei jedem Durchgang die Richtung umkehren

Ist tatsächlich besser. Würde man das nicht umkehren würde ein Team 
immer den jeweils besseren Spieler und ein Team den jeweils schlechteren 
Spieler bekommen. So bekommen die Teams "am Rand" abwechselnd einen 
besseren und schlechteren Spieler als der Durchschnittsspieler in dem 
jeweiligen Aufteilungsdurchlauf.

von Michal P. (michal)


Lesenswert?

MaWin O. schrieb:
> Werden Hausaufgaben heute nicht mehr selbstständig erledigt?

Seit guten 20 Jahren nicht mehr! Wir optimieren eine App für unseren 
kleinen Betriebssportverein

von Michal P. (michal)


Lesenswert?

> Dann kannst du gleich von Anfang an zufällig zuweisen.
 Nicht ganz. Ich sammle mal alles in ein Stück:

1. Absteigend sortieren.
2. Von den besten je 1en Spieler zufällig je 1em Team zuweisen
3. Aufsteigend sortieren
4. Von den schlechtesten je 1en Spieler zufällig je 1em Team zuweisen
5. Zurück zu 1. bis alle Spieler verteilt sind.

Ein „Schiebeparameter“ im 2. und 4. regelt, in wie vielen Durchläufen 
(prozentuell) ein purer Zufall, und in wie vielen Durchläufen 
(prozentuell) „eine Ergänzung des schwächsten Teams“ als 
Zuweisungskriterium genommen wird.

So ist die App je nach Wunsch einstellbar.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Selbst ohne Zufall und wenn eine gerechte Lösung existiert, wird diese 
nicht unbedingt gefunden.

Beispiel: 5, 4, 3, 2, 1, 1 und Zuordnung nach dem Schema

A→max, B→max, A→min, B→min, ...

A→5, B→4, A→1, B→1, A→3, B→2.

Ergebnis ist also:

Team A = ( 5, 3, 1 ), Σ = 9
Team B = ( 4, 2, 1 ), Σ = 7

obwohl eine ausgewogene Lösung mit A = B = 8 existiert.  Es lässt sich 
sogar erreichen, dass A die 3-fache Bewertung von B erhält, etwa mit 2, 
1, 1, 0, 0, 0.  Der Algorithmus liefert A = ( 2, 1, 0 ) und B = ( 1, 0, 
0 ) obwohl eine gerechte Aufteilung A = ( 2, 0, 0 ) und B = ( 1, 1, 0 ) 
existiert.

Für den allgemainen Fall, dass die Team-Größen unterschiedlich sein 
dürfen, ist das Problem NP-vollständig und entspricht dem 
Rucksackproblem

https://de.wikipedia.org/wiki/Rucksackproblem

Im Falle gleich großer Teams und unter der Voraussetzung, dass eine 
gerechte Aufteilung existiert, bin ich mir nicht ganz sicher.

Im allgemainen Fall mit 2n Spielern kann man 2^(2n) = 4^n verschiedene 
Teilmengen aus diesen bilden.

Im Fall |A| = |B| = n sind n-elementige Teilmengen aus einer Gesamtheit 
von 2n Elementen zu betrachten, und von diesen gibt es
nach Stirling.  Also ist die Anzahl möglicher Unterteilungen nicht 
wesentlich kleiner als im allgemeinen Fall.

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.