[PYTHON] Siegermethode für Pferderennen durch Kombinationsoptimierung

Was ist das

Ich habe versucht, es zu lösen, indem ich "Programmieren der Pferderennen-Gewinnmethode" kombiniert und optimiert habe.

Originale Daten

  1. September 2013 Es ist eine Tabelle mit Siegen und Pferden in einem Rennen des Nagoya-Pferderennens. Fragen Sie nach, wie viele Wettkarten Sie für jede Zeile in dieser Tabelle kaufen können.
from ortoolpy import addbinvars, lpSum, model_min, pd


def sample_data_frame() -> pd.DataFrame:
    """20. September 2013 Nagoya Pferderennen 1 Renntisch

    :return: 「First=1. Ankunftsnummer, zweite=2 Ankunftsnummer (-1 gewinnt), Gewinnchancen=Tabelle "Gewinnchancen"
    """
    ls = list(range(1, 8))
    df1 = pd.DataFrame({  #Sieg
        "First": ls,
        "Second": [-1] * 7,
        "Odds": [14.7, 72.6, 1.4, 2.3, 151.8, 18.0, 66.8],
    })
    df2 = pd.DataFrame({  #Pferd Single
        'First': [i for i in ls for _ in ls[1:]],
        'Second': [j for i in ls for j in ls if i != j],
        'Odds': [
            347.2, 37.4, 54.0, 662.7, 169.6, 607.5, 455.6, 177.8, 197.1,
            1457.9, 331.4, 2429.8, 23.0, 86.8, 5.4, 50.7, 13.0, 177.8, 10.3,
            49.3, 1.9, 90.0, 5.9, 123.6, 1214.9, 1457.9, 74.4, 455.6, 560.8,
            3644.7, 119.5, 347.2, 27.6, 43.2, 486.0, 455.6, 1041.4, 2429.8,
            1214.9, 911.2, 3644.7, 911.2
        ]
    })
    return pd.concat([df1, df2]).reset_index(drop=True)


df = sample_data_frame()
# First=1. Ankunftsnummer, zweite=2 Ankunftsnummer (-1 gewinnt), Gewinnchancen=Chancen
df[:3]  #Erste 3 Zeilen
First Second Odds
0 1 -1 14.7
1 2 -1 72.6
2 3 -1 1.4

Optimierung

def solve(df: pd.DataFrame, num: int, alpha: float) -> pd.DataFrame:
    """Finden Sie die Anzahl der Einkäufe

    :param df:Variablentabelle
    :param num:Maximale Anzahl von Einkäufen
    :param alpha:Rücklaufquote
    :return:Variablentabelle (Spalte Val gibt die Anzahl der Käufe an)
    """
    n = len(df[df.Second == -1])  #Anzahl der zu gewinnenden Linien
    m = model_min(dfi=df)  #Mathematisches Modell
    df["Mono"] = None  #Ob man einen Gewinn kauft
    df.loc[: n - 1, "Mono"] = addbinvars(n)
    m += lpSum(df.Var)  #Zielfunktion (Gesamtzahl der Einkäufe)
    m += lpSum(df.Var) <= num  #Maximale Anzahl von Einkäufen
    for row in df[:n].itertuples():
        m += row.Odds * row.Var >= num * alpha * row.Mono
        df.loc[df.First == row.First, "Mono"] = row.Mono
    for row in df[n:].itertuples():
        m += row.Odds * row.Var >= num * alpha * (1 - row.Mono)
    m.solve()
    df["Prize"] = df.Odds * df.Val * 100
    return df[df.Val > 0] if m.status == 1 else None


res = solve(df, num=1000, alpha=1.08)
res
First Second Odds Var Mono Val Prize
1 2 -1 72.6 v000002 v000051 15 108900
3 4 -1 2.3 v000004 v000053 470 108100
4 5 -1 151.8 v000005 v000054 8 121440
5 6 -1 18 v000006 v000055 60 108000
7 1 2 347.2 v000008 v000050 4 138880
8 1 3 37.4 v000009 v000050 29 108460
9 1 4 54 v000010 v000050 20 108000
10 1 5 662.7 v000011 v000050 2 132540
11 1 6 169.6 v000012 v000050 7 118720
12 1 7 607.5 v000013 v000050 2 121500
19 3 1 23 v000020 v000052 47 108100
20 3 2 86.8 v000021 v000052 13 112840
21 3 4 5.4 v000022 v000052 200 108000
22 3 5 50.7 v000023 v000052 22 111540
23 3 6 13 v000024 v000052 84 109200
24 3 7 177.8 v000025 v000052 7 124460
43 7 1 1041.4 v000044 v000056 2 208280
44 7 2 2429.8 v000045 v000056 1 242980
45 7 3 1214.9 v000046 v000056 1 121490
46 7 4 911.2 v000047 v000056 2 182240
47 7 5 3644.7 v000048 v000056 1 364470
48 7 6 911.2 v000049 v000056 2 182240

alpha = 1.08 sollte durch eine 2-minütige Suche gefunden werden. Es ist erstaunlich, dass es 100% profitabel ist, keine Schreibtisch-Theorie.

das ist alles

Recommended Posts

Siegermethode für Pferderennen durch Kombinationsoptimierung
Gruppierung nach Kombinationsoptimierung
Durch Kombinationsoptimierung (Backmethode) in Teams aufteilen
Lösen von "Würfeln in Würfeln" mit Kombinationsoptimierung
Bestimmen Sie das aufgezeichnete Programm durch Kombinationsoptimierung
SVM-Optimierung durch aktive Set-Methode
Teilen Sie sich durch Kombinationsoptimierung in Teams auf
Über Menüs durch Kombinationsoptimierung nachdenken
Minimieren Sie die Anzahl der Polierungen, indem Sie die Kombination optimieren
Beurteilung des Endes von Mahjong durch Kombinationsoptimierung
Verwenden Sie die Kombinationsoptimierung
Durch Kombinationsoptimierung in Teams aufteilen (durchschnittliche Abweichung minimieren)
Eine konkrete Methode zur Vorhersage von Pferderennen und zur Simulation der Wiederherstellungsrate durch maschinelles Lernen
Optimierungsbeschreibungsmethode nach Gurobi-Art
Lassen Sie uns die Vorlesung der PyCon JP 2016 durch Kombinationsoptimierung entscheiden
Lassen Sie uns die Position der Feuerwehr durch Kombinationsoptimierung bestimmen