[Python/wiskunde] omgekeerde gewogen kans berekenen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • XhaiKhaL
  • Registratie: Januari 2005
  • Laatst online: 05-05 21:05
Voor een avondje vriendschappelijk tennis dubbels wil ik graag willekeurig 4 spelers (voor een 2 vs 2 wedstrijdje) uit een lijst van 8 tot 25 spelers selecteren (afhankelijk van de opkomst die avond). Zodra de wedstrijd voorbij is wil ik weer willekeurig 4 spelers selecteren voor de volgende wedstrijd, enzovoort.

De kanttekening hierbij is dat ik de voorkeur wil geven aan de spelers die de minste wedstrijden gespeeld hebben, zodat die een grotere kans hebben om geselecteerd te worden voor de eerstvolgende wedstrijd. De selectie moet dus niet werkelijk willekeurig gebeuren.

Ik geloof dat ik dit kan doen met de NumPy Python library, en wel als volgt:
code:
1
numpy.random.choice(spelers, size=4, replace=False, p=kans)

Waarbij spelers een list van alle aanwezige spelers is en kans een list met per speler de kans om gekozen te worden, waarvan de som 1 moet zijn.

Mijn vraag is nu, wat is een wiskundig verantwoordelijke manier om het aantal gespeelde wedstrijden te wegen en daar een kans om geselecteerd te worden van af te leiden (waarbij meer gespeelde wedstrijden dus moet leiden tot een kleinere kans).

Ik heb momenteel de volgende oplossing waarbij gespeelde_wedstrijden een lijst is met het aantal gespeelde wedstrijden per speler.
code:
1
2
gespeelde_wedstrijden_omgekeerd = [1 / (x + 0.1) for x in gespeelde_wedstrijden]
kans = [x / sum(gespeelde_wedstrijden_omgekeerd) for x in gespeelde_wedstrijden_omgekeerd]

Wat ik dus doe is per speler 1 delen door het aantal gespeelde wedstrijden om het omgekeerde te krijgen, daarbij tel ik altijd 0.1 op bij het aantal gespeelde wedstrijden om te voorkomen dat ik door 0 ga delen, maar dat stukje zit mij dwars. Het voelt als een lelijke hack en ik vroeg mij af of er een betere manier is om het omgekeerde te berekenen én rekening te houden met 0 (gespeelde wedstrijden).

Vervolgens bereken ik per speler het percentage van het omgekeerde aantal gespeelde wedstrijden ten opzichte van de som van het omgekeerde aantal gespeelde wedstrijden van alle spelers. Dit percentage gebruik ik regelrecht als kans per speler om "willekeurig" geselecteerd te worden.

Ik sta ook open voor een andere methode om dit probleem aan te pakken trouwens, ook als dit zonder NumPy kan bijvoorbeeld.

Alle reacties


Acties:
  • 0 Henk 'm!

  • luukvr
  • Registratie: Juni 2011
  • Niet online
Kan je niet gewoon de spelers bijhouden in 2 lijsten? Lijst 1 mensen die nog niet hebben gespeeld en lijst 2 mensen die al hebben gespeeld. Je pakt steeds 4 mensen uit lijst 1 en stopt ze in de lijst 2.

Zodra lijst 1 te weinig mensen heeft (bijv. 3 te weinig). Vul je de Lijst 1 met Lijst 2 (zonder de al gekozen) pak je er nog 3 en voegt daarna alsnog de ene al eerder gekozen persoon toe.

Zo zal het verschil van gespeelde wedstrijden nooit meer dan 1 worden (tenzij er ook nog spelers bijkomen).

Met je huidige algo kan het alsnog voorkomen dat de ene speler 1 wedstrijd krijgt en de ander 1 miljoen wedstrijden (al is de kans klein)

  • XhaiKhaL
  • Registratie: Januari 2005
  • Laatst online: 05-05 21:05
Dank voor het meedenken. Wat jij beschrijft doen we momenteel in al min of meer offline/analoog door een stapel spelerspasjes te schudden en daarbij de spelers die zojuist gespeeld hebben niet mee te schudden (zo heb je dus feitelijk 2 lijsten en selecteer je maar uit 1 lijst).

Misschien moet ik voor de volledigheid nog wat toevoegen; we gebruiken meerdere banen en wedstrijden zijn ook niet altijd tegelijk afgelopen. Met jouw voorstel is de groep waar je uit kunt selecteren vaak maar heel klein dus. En één van de problemen met dit systeem (waar we nu dus ook tegenaan lopen) is dat je hierdoor vaak in min of meer dezelfde spelers met elkaar matcht, in de loop van de avond is er dan te weinig variatie in de wedstrijden.

Juist door de groep spelers waar ik uit selecteer zo groot mogelijk te maken probeer ik te voorkomen dat je de hele avond alleen maar met dezelfde mensen speelt. En om vervolgens dus te voorkomen dat bepaalde spelers te vaak aan de beurt zijn laat ik die kans om geselecteerd te worden afhangen van het aantal gespeelde wedstrijden.

  • bregweb
  • Registratie: Juni 2005
  • Laatst online: 09:01
Voor mijn gevoel is je probleem dat je wedstrijden niet gelijk klaar zijn en je dus niet elke keer je gehele pool aan spelers hebt om je 'eerlijke' randomizer op toe te laten.

Om het dan wiskundig eerlijk te laten verlopen lijkt mij lastig, het lijkt mij eerlijker om je systeem met pasjes te handhaven, maar de regels wel duidelijk op papier te hebben.

Misschien moet je een systeem bedenken waarbij de 2 spelers met het minste aantal wedstrijden sowieso gaan spelen en dat je vervolgens een loting houdt van beschikbare spelers, minus spelers die net tegen deze 2 hebben gespeeld.

Hattrick: Thorgal Eagles


  • aljooge
  • Registratie: Januari 2016
  • Nu online
XhaiKhaL schreef op zaterdag 24 september 2022 @ 16:09:
Dank voor het meedenken. Wat jij beschrijft doen we momenteel in al min of meer offline/analoog door een stapel spelerspasjes te schudden en daarbij de spelers die zojuist gespeeld hebben niet mee te schudden (zo heb je dus feitelijk 2 lijsten en selecteer je maar uit 1 lijst).

Misschien moet ik voor de volledigheid nog wat toevoegen; we gebruiken meerdere banen en wedstrijden zijn ook niet altijd tegelijk afgelopen. Met jouw voorstel is de groep waar je uit kunt selecteren vaak maar heel klein dus. En één van de problemen met dit systeem (waar we nu dus ook tegenaan lopen) is dat je hierdoor vaak in min of meer dezelfde spelers met elkaar matcht, in de loop van de avond is er dan te weinig variatie in de wedstrijden.

Juist door de groep spelers waar ik uit selecteer zo groot mogelijk te maken probeer ik te voorkomen dat je de hele avond alleen maar met dezelfde mensen speelt. En om vervolgens dus te voorkomen dat bepaalde spelers te vaak aan de beurt zijn laat ik die kans om geselecteerd te worden afhangen van het aantal gespeelde wedstrijden.
Is niet het grootste probleem dat de wedstrijden niet tegelijk zijn afgelopen? Dit is een beetje ongebruikelijk, door op een toss avond de wedstrijden te laten eindigen op partijwinst. Meestal worden dit soort avonden gespeeld op tijd en worden de wedstrijden gelijktijdig beëindigd met een belletje en wint het koppel met de meeste gewonnen games. Dan heb je voor de volgende ronde een hele dikke stapel pasjes. Als je die goed schud, komt het met de variatie wel goed.

Acties:
  • 0 Henk 'm!

  • luukvr
  • Registratie: Juni 2011
  • Niet online
Als het 'vaak' tegen dezelfde spelers spelen het enige probleem is van het analoge systeem zou ik ook alleen dat tackelen. Je kan dus het pasjes systeem automatiseren en daarnaast een soort lijst van gespeelde of misschien liever een lijst van mogelijke matches bijhouden. Als de combinatie al is geweest hussel je opnieuw, tot er geen mogelijkheid meer in de lijst zit. Dus bovenop het 'beschikbaar' systeem.

mogelijke matches = [
'1-2-3-4',
'1-2-3-5',
'1-2-4-5',
'1-3-4-5',
'2-3-4-5',
]

Acties:
  • 0 Henk 'm!

  • eheijnen
  • Registratie: Juli 2008
  • Niet online

Wie du mir, so ich dir.


Acties:
  • 0 Henk 'm!

  • htca
  • Registratie: November 2001
  • Laatst online: 14:37
Persoonlijk zou ik geloof ik de kaartje methode blijven hanteren.
Ik neem aan dat je weet hoeveel wedstrijden iemand moet spelen
Maar ik zou het als volgt doen:
- Temporary spelers array maken (drop de spelers die spelen)
- Bepaal het totaal aantal wedstrijden dat door de geselecteerde spelers nog moet worden gespeeld
- Kans voor speler = nog te spelen wedstrijden / totaal aantal wedstrijden
(je zou eventeel de spelers kunnen meenemen in je bepaling, door hun kans op nul te zetten, maar dan moet je de p-array normaliseren)

Pragmatisch:
Maak een lijst van nog te spelen wedstrijden (als je een volledige competitie speelt, iedereen een keer tegen elkaar)
Hou een lijst bij van welke wedstrijden nog moeten.
Hou een ranking bij van deze lijst, de som van de nog te spelen wedstrijden van beide spelers is bepalend (hoe groter die som, hoe eerder aan de beurt).
Baan vrij: check lijst, voor welke wedstrijd van hoog naar laag gesorteerd zijn beide spelers beschikbaar? Die wedstrijd inplannen

[ Voor 7% gewijzigd door htca op 26-09-2022 10:24 ]

Pagina: 1