多臂老虎机问题
现在有3台外观一模一样的老虎机,每个老虎机的赔率是不同的,摇动一次需要1块钱,现在给你100块钱,如何获取最大的收益。
如果我们知道了每个老虎的赔率,那么只要选择收益最高的那个老虎机就可以了,但现在问题是并不知道每个老虎机的收益。为了简单,我们假设老虎机的收益服从正态分布
我们没有办法找到老虎机,但是可以用python来进行模拟。
import numpy as np
class Arm:
cls_n = 0
cls_g = 0
cls_avg_r = 0
cls_glist = []
def __init__(self, u=0, s=1):
self.u = u # 均值
self.s = s # 方差
self.g = 0 # 累积平均收益
self.n = 0 # 被选中的次数
self.avg_r = 0
def __call__(self):
r = np.random.normal(self.u, self.s) # 当次收益
self.cls_n += 1 # 总共摇老虎机的次数
self.n += 1 # 被选中,次数加一
self.g += r # 当前老虎机累计收益
self.cls_g += r # 所有老虎机的累计收益
self.avg_r = self.g / self.n # 当前老虎机的累计平均收益
self.cls_avg_r = self.cls_g / self.cls_n # 累计平均收益
self.cls_glist.append(self.cls_avg_r)
return r, self.avg_r # 返回当次收益与历史累计的平均收益
贪心策略
一个非常直接的想法就是,每个老虎机都去摇一摇,然后看看各个收益,之后选择收益最高的那个就可以了。例如每个老虎机都摇10次,计算出每个老虎机的收益率,剩下的70次都去摇收益最高的那个就可以了。
Arm1=[r11,r12,r13,r14,r15,r16,r17,r18,r19,r110]Arm2=[r21,r22,r23,r24,r25,r26,r27,r28,r29,r210]Arm3=[r31,r32,r33,r34,r35,r36,r37,r38,r39,r310] Arm1 = [r^1_1,r^2_1,r^3_1,r^4_1,r^5_1,r^6_1,r^7_1,r^8_1,r^9_1,r^{10}_1]\\ Arm2 = [r^1_2,r^2_2,r^3_2,r^4_2,r^5_2,r^6_2,r^7_2,r^8_2,r^9_2,r^{10}_2]\\ Arm3 = [r^1_3,r^2_3,r^3_3,r^4_3,r^5_3,r^6_3,r^7_3,r^8_3,r^9_3,r^{10}_3]\\ Arm1=[r11,r12,r13,r14,r15,r16,r17,r18,r19,r110]Arm2=[r21,r22,r23,r24,r25,r26,r27,r2