算法:最大化纸牌游戏中的利润,获胜卡和n张丢失牌

时间:2012-12-15 18:13:48

标签: algorithm strategy-pattern evolutionary-algorithm

假设赌场(C)有一个只涉及一个玩家和一个经销商的游戏。游戏使用m + n张牌,m被标记为获胜牌,'n'被标记为失败牌。

有关游戏的规则/信息:

  1. 玩家在每个阶段都知道获胜卡的数量'm'和丢失卡'n'的数量。
  2. 玩家开始玩'X'金额并播放,直到所有牌都被抽出。
  3. 经销商非常聪明,并且有权根据玩家在桌上下注的赌注抽取获胜卡或丢失牌。
  4. 每次抽奖都会减少任何类别的牌数,即如果获胜牌,获胜牌的数量变为“m-1”,反之亦然。
  5. 玩家也可以下注'0'金额。
  6. 如果玩家下注'W'金额并且获得了获胜的牌。玩家获得2W的回报,否则他将失去赌注金额

    问题:推导出一个应该遵循的算法或策略,以最大化他的利润。

  7. 一些例子:

    Testcase - 1:

    Lets say m=0, n=1
    

    球员知道经销商没有机会但是无论他下注什么都让他失败,所以他下注'0'金额。因此,他能做的最大值是X.

    测试用例 - 2:

    m=1, n=0
    

    玩家知道经销商别无选择,只能抽出唯一的牌即获胜牌,所以他下注所有内容,即'X',然后回到'2X'。所以,他以2倍的金额退出了赌场。

    TestCase - 3:

    m=1, n=1 : 
    

    让我们说玩家下注'W'金额 - 让我们说经销商绘制获胜卡:因此净金额= X + W且m-> 0且n-> 1:因此在这种情况下X + W的最大金额 - 如果经销商丢失卡:所以净额左= X-W且m-> 1且n-> 0:因此,在这种情况下最大量为2(X-W)

    玩家将选择“W”以最大化他的利润,这只能在2(X-W)= X + W =>的情况下进行。 W = X / 3

    因此,在这种情况下,玩家可以走出最大数量= 4X / 3

1 个答案:

答案 0 :(得分:1)

这是F#

的解决方案

建议:除非必须,否则不要进行符号编程。在这种情况下,我们假设X = 1

let stake = Array2D.zeroCreate 100 100
let bankroll =  Array2D.zeroCreate 100 100

for i in 1 .. 99 do
    stake.[0, i] <- 0.0
    bankroll.[0, i] <- 1.0

for i in 1 .. 99 do
    stake.[i, 0] <- 1.0
    bankroll.[i, 0] <- 2.0

stake.[0, 0] <- 0.0
bankroll.[0, 0] <- 1.0

let rec solve i j =
    if bankroll.[i, j] <> 0.0 then (stake.[i, j], bankroll.[i, j])
    else
       let a = snd (solve (i - 1) j)
       let b = snd (solve i (j - 1))
       let x = (b - a) / (a + b)  // solve (1 + x)a = (1 - x)b
       let y = (x + 1.0) * a
       stake.[i, j] <- x
       bankroll.[i, j] <- y
       (x, y)

solve 10 10 // = (0.06182352702, 1.333333333)

只要获胜卡的数量等于丢失卡的数量,玩家可以获得的最大利润总是4倍/ 3