Python: условные вероятности выигрыша в игре - PullRequest
0 голосов
/ 25 мая 2018

Этот вопрос был задан снова ( Excel: условные вероятности выигрыша в игре с тай-брейком ), но ОП хотел получить ответ на основе Excel, и тот, который он / она получил, был не совсем точным.

Я пытаюсь рассчитать условную вероятность выигрыша матча тай-брейка, как описано в http://strategicgames.com.au/PhD.pdf, стр. 21-22.

Требуется кодирование двух рекурсивных формул: Формул (Я не могу прикрепить изображение из-за низкого повторения)

Это то, что я сделал до сих пор:

def prob_tiebraker_game_A(Pa, Pb, a, b):
    if a == 7 and b >= 0 and b <=5:
        return 1
    elif b == 7 and a >= 0 and a <=5:
        return 0
    elif a == 6 and b == 6:
        return (Pa*(1-Pb))/(Pa*(1-Pb) + (1-Pa)*Pb)
    elif (a+b) % 2 ==0:
        return Pa*prob_tiebraker_game_B(Pa, Pb, a+1, b) + (1-Pa)*prob_tiebraker_game_B(Pa, Pb, a,b+1)
    elif (a+b) % 2 !=0:
        return Pa*prob_tiebraker_game_A(Pa, Pb, a+1, b) + (1-Pa)*prob_tiebraker_game_A(Pa, Pb, a,b+1)



 def prob_tiebraker_game_B(Pa, Pb, a, b):
    if b == 7 and a >= 0 and a <=5:
        return 1
    elif a == 7 and b >= 0 and b <=5:
        return 0
    elif a == 6 and b == 6:
        return (Pb*(1-Pa))/(Pb*(1-Pa) + (1-Pb)*Pa)
    elif (a+b) % 2 ==0:
        return Pb*prob_tiebraker_game_A(Pa, Pb, a+1, b) + (1-Pb) * prob_tiebraker_game_A(Pa, Pb, a,b+1)
    elif (a+b) % 2 !=0:
        return Pb*prob_tiebraker_game_B(Pa, Pb, a+1, b) + (1-Pb) *  prob_tiebraker_game_B(Pa, Pb, a,b+1)

Для значений Pa = 0,62, Pb = 0,6, я должен получитьэти результаты: Результаты

Но я получаю неправильные числа для любых значений (a, b), кроме (0,0) и (6,6), (7 ,.)и (., 7), поскольку эти оценки зависят от первых трех условий в функциях, тривиальные для оценки.

Я пытался изменить другие условия, но безуспешно.Любая помощь оценена будет оценена

1 Ответ

0 голосов
/ 25 мая 2018

Вам нужна только одна рекурсия.Примечание (a+b) mod 2 определяет, какой игрок обслуживает сейчас.Таким образом, вероятность того, что игрок выиграет / не выиграет, должна использоваться соответствующим образом. Вот решение, когда игрок А. подает.

def prob_tiebraker_game(Pa, Pb, a, b):
    if a == 7 and b >= 0 and b <=5:
        return 1
    elif b == 7 and a >= 0 and a <=5:
        return 0
    elif a == 6 and b == 6:
        return (Pa*(1-Pb))/(Pa*(1-Pb) + (1-Pa)*Pb)
    elif (a+b) % 2 != 0:
        # if player A wins (probability Pa) a increases by 1, b remains same
        # if player A doesn't win (probability 1-Pa) b increases by 1, a remains same
        return Pa*prob_tiebraker_game(Pa, Pb, a+1, b) + (1-Pa)*prob_tiebraker_game(Pa, Pb, a, b+1)
    elif (a+b) % 2 == 0:
        # if player B wins (probability Pb) b increases by 1, a remains same
        # if player B doesn't win (probability 1-Pb) a increases by 1, b remains same
        return Pb*prob_tiebraker_game(Pa, Pb, a, b+1) + (1-Pb)*prob_tiebraker_game(Pa, Pb, a+1, b)

Когда игрок Б подает, последние два условия будут поменяны местами.Вы можете написать другую функцию для этого или объединить обе функции в одну, добавив в функцию дополнительный аргумент, который указывает, обслуживал ли игрок А первым или нет.

...