Frage

Ich versuche, eine Anwendung zu erstellen, die die Kosten für exotische Parimutuel-Wetten berechnet.Ich habe mehrere für bestimmte Wettarten gefunden, aber nie eine, die alle Szenarien für eine einzelne Wettart löst.Wenn ich einen Algorithmus finden könnte, der alle möglichen Kombinationen berechnen könnte, könnte ich diese Formel verwenden, um meine anderen Probleme zu lösen.

Weitere Informationen:Ich muss die Permutationen von Zahlengruppen berechnen.Zum Beispiel;

Gruppe 1 = 1,2,3
Gruppe 2 = 2,3,4
Gruppe 3 = 3,4,5

Was sind alle möglichen Permutationen für diese 3 Zahlengruppen, wobei pro Permutation 1 Zahl aus jeder Gruppe genommen wird?Keine Wiederholungen pro Permutation, was bedeutet, dass eine Zahl nicht an mehr als einer Position erscheinen kann.Also ist 2,4,3 gültig, aber 2,4,4 ist nicht gültig.

Vielen Dank für all die Hilfe.

War es hilfreich?

Lösung

Wie die meisten interessanten Probleme, hat Ihre Frage mehrere Lösungen. Der Algorithmus, den ich geschrieben habe (siehe unten) ist die einfachste Sache, die den Sinn kam.

Ich fand es am einfachsten, wie eine Baum-Suche des Problems zu denken: Die erste Gruppe, die Wurzel, ein Kind für jede Nummer hat es enthält, wobei jedes Kind die zweite Gruppe ist. Die zweite Gruppe für jede Nummer eine dritte Gruppen Kind hat es enthält, hat die dritte Gruppe eine vierte Gruppe Kind für jede Nummer enthält, usw. Alles, was Sie tun müssen, ist alle gültigen Pfade von der Wurzel bis Blätter finden.

Doch für viele Gruppen mit vielen Zahlen wird dieser Ansatz unter Beweis stellt langsam ohne Heuristiken sein. Eine Sache, die Sie tun können, ist sortieren die Liste der Gruppen von Gruppengröße, kleinste Gruppe zuerst. Das wäre ein fehler schnell Ansatz sein, die in der Regel entdecken würden, dass eine Permutation nicht gültig ist eher früher als später. Look-ahead, bogen Konsistenz und Rückzieher sind andere Dinge, die Sie vielleicht denken geben. [Sorry, ich kann nur einen Link enthalten, weil es mein erster Beitrag ist, aber man kann diese Dinge auf Wikipedia finden.]

## Algorithm written in Python ##
## CodePad.org has a Python interpreter

Group1 = [1,2,3] ## Within itself, each group must be composed of unique numbers
Group2 = [2,3,4]
Group3 = [3,4,5]
Groups = [Group1,Group2,Group3] ## Must contain at least one Group

Permutations = [] ## List of valid permutations

def getPermutations(group, permSoFar, nextGroupIndex):
  for num in group:
    nextPermSoFar = list(permSoFar) ## Make a copy of the permSoFar list

    ## Only proceed if num isn't a repeat in nextPermSoFar
    if nextPermSoFar.count(num) == 0: 
      nextPermSoFar.append(num)  ## Add num to this copy of nextPermSoFar

      if nextGroupIndex != len(Groups): ## Call next group if there is one...
        getPermutations(Groups[nextGroupIndex], nextPermSoFar, nextGroupIndex + 1)
      else: ## ...or add the valid permutation to the list of permutations
        Permutations.append(nextPermSoFar)

## Call getPermutations with:
##  * the first group from the list of Groups
##  * an empty list
##  * the index of the second group
getPermutations(Groups[0], [], 1)

## print results of getPermutations
print 'There are', len(Permutations), 'valid permutations:'
print Permutations

Andere Tipps

Dies ist die einfachste allgemeine Formel I für Dreierwetten kennen.

A = die Anzahl der Auswahl, die Sie für die erste haben; B = Anzahl von Auswahlen für die zweite; C = Anzahl der Auswahlmöglichkeiten für den dritten; AB = Anzahl der Auswahl, die Sie beide haben in der ersten und zweiten; AC = nein. für beide ersten und dritten; BC = no. für beide 2. und 3.; und ABC = die Nr. von Auswahlmöglichkeiten für alle 1., 2. und dritten. Die Formel ist     (AxBxC) - (ABxC) - (ACxB) - (BCxA) + (2xABC)

Also, für Ihr Beispiel ::

 Group 1 = 1,2,3
 Group 2 = 2,3,4
 Group 3 = 3,4,5

die Lösung :: (3x3x3) - (2x3) - (1x3) - (2x3) + (2x1) = 14. Ich hoffe, das hilft Es könnte eine einfachere Methode, die ich nicht bewusst bin. Nun weiß jemand eine allgemeine Formel für First4?

Nach ein paar Jahren überarbeitet:-

Ich habe mich nach einer Weile wieder in meinem SE-Konto angemeldet und diese Frage bemerkt und festgestellt, dass das, was ich geschrieben habe, Ihnen nicht einmal eine Antwort gegeben hat:

Hier ist etwas Python-Code

import itertools
def explode(value, unique):
    legs = [ leg.split(',') for leg in value.split('/') ]
    if unique:
        return [ tuple(ea) for ea in itertools.product(*legs) if len(ea) == len(set(ea)) ]
    else:
        return [ tuple(ea) for ea in itertools.product(*legs) ]

Der Aufruf von „explode“ basiert auf der Tatsache, dass jedes Bein durch ein „/“ und jede Position durch ein „/“ getrennt ist.

Für Ihre Trifecta-Berechnung können Sie es wie folgt berechnen:

result = explode('1,2,3/2,3,4/3,4,5', True)
stake = 2.0
cost = stake * len(result)
print cost

für eine Superfecta

result = explode('1,2,3/2,4,5/1,3,6,9/2,3,7,9', True)
stake = 2.0
cost = stake * len(result)
print cost

für einen pick4 (Eindeutig auf False setzen)

result = explode('1,2,3/2,4,5/3,9/2,3,4', False)
stake = 2.0
cost = stake * len(result)
print cost

Ich hoffe, das hilft

als Punter Ich kann Ihnen sagen, es ist eine viel einfachere Art und Weise:

Für eine Trifecta, müssen Sie 3 Kombinationen. Sagen, es gibt acht Läufer, die Gesamtzahl der möglichen Permutationen ist 8 (Gesamt Läufer) * 7 (Rest Läufer nach dem Sieger weggelassen) * 6 (Rest Läufer nach dem Sieger und 2. weggelassen) = 336

Für eine Exakta (8 mit Läufern) 8 * 7 = 56

Quinellas ist eine Ausnahme, da Sie nur jede Wette einmal nehmen müssen als 1/2 sowie 2/1 zahlt so lautet die Antwort 8 * 7/2 = 28

Einfach

Die Antwort von Luskin geliefert ist korrekt für die Dreierwetten. Er stellte eine andere Frage, die ich in Bezug auf First4 zu lösen benötigt. Ich sah überall, aber konnte keine Formel finden. Ich habe jedoch eine einfache Art und Weise fand die Anzahl der eindeutigen Permutationen, um zu bestimmen, verschachtelte Schleifen mit wiederholten Sequenzen auszuschließen.

    Public Function fnFirst4PermCount(arFirst, arSecond, arThird, arFourth) As Integer


Dim intCountFirst As Integer
Dim intCountSecond As Integer
Dim intCountThird As Integer
Dim intCountFourth As Integer
Dim intBetCount As Integer

'Dim arFirst(3) As Integer
'Dim arSecond(3) As Integer
'Dim arThird(3) As Integer
'Dim arFourth(3) As Integer

'arFirst(0) = 1
'arFirst(1) = 2
'arFirst(2) = 3
'arFirst(3) = 4
'
'arSecond(0) = 1
'arSecond(1) = 2
'arSecond(2) = 3
'arSecond(3) = 4
'
'arThird(0) = 1
'arThird(1) = 2
'arThird(2) = 3
'arThird(3) = 4
'
'arFourth(0) = 1
'arFourth(1) = 2
'arFourth(2) = 3
'arFourth(3) = 4

intBetCount = 0
For intCountFirst = 0 To UBound(arFirst)
    For intCountSecond = 0 To UBound(arSecond)
        For intCountThird = 0 To UBound(arThird)
            For intCountFourth = 0 To UBound(arFourth)
                If (arFirst(intCountFirst) <> arSecond(intCountSecond)) And (arFirst(intCountFirst) <> arThird(intCountThird)) And (arFirst(intCountFirst) <> arFourth(intCountFourth)) Then
                    If (arSecond(intCountSecond) <> arThird(intCountThird)) And (arSecond(intCountSecond) <> arFourth(intCountFourth)) Then
                        If (arThird(intCountThird) <> arFourth(intCountFourth)) Then
                        '    Debug.Print "First " & arFirst(intCountFirst), " Second " & arSecond(intCountSecond), "Third " & arThird(intCountThird), " Fourth " & arFourth(intCountFourth)
                            intBetCount = intBetCount + 1
                        End If
                    End If
                End If
            Next intCountFourth
        Next intCountThird
    Next intCountSecond
Next intCountFirst
fnFirst4PermCount = intBetCount

End Function

Diese Funktion nimmt vier String-Arrays für jede Position. Ich verließ im Testcode (Kommentar gesetzt), so kann man sehen, wie es für 1/2/3/4 für jede der vier Positionen arbeitet

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top