Python游戏概率补偿算法-马尔科夫链

代码展示

# _*_ coding: utf-8 _*_
# @Author : ******
# @Time   : 2022/8/27 14:47
# @File   : ProbabilisticCompensation.py
# @Project: TestCase
import numpy as np

class PC:

    """
    状态图如下(这里无法插入图片,也只能通过文字描述了):
        上次暴击:P
        上次非暴击:1-P
        上次暴击,本次暴击:P1
        上次暴击,本次非暴击:1 - P1
        上次非暴击,本次暴击:P2
        上次非暴击,本次非暴击:1 - P2
    为了使得整体的暴击概率不发生变化,则有如下约束:
        P*P1 + (1-P)*P2 = P
    存在2种设定:
        A.P<=0.5时,上次暴击后,则本次暴击率下降50%
            P1 = P - P / 2
            通过约束条件可以求得P2
        B.P>0.5时,上次非暴击后,则本次暴击率增加初始非暴击概率的50%
            P2 = P + (1 - P) / 2
            通过约束条件可以求得P1
    """

    def __init__(self, p):
        # 初始概率
        self.p = p
        # 概率补偿
        self.p1, self.p2 = self.get_compensate()
        # 初始矩阵
        self.init_vector = np.matrix([[self.p, (1 - self.p)]])
        # 概率转移矩阵
        self.matrix = np.matrix([[self.p1, (1 - self.p1)],
                                 [self.p2, (1 - self.p2)]])

    def get_compensate(self):
        """
        根据设定的概率求得概率补偿
        :param p:触发事件的概率
        :return:概率补偿 tuple
        """
        if self.p > 0.5:
            p1 = 1 - (1 - self.p**2) / (2 * self.p)
            p2 = self.p + (1 - self.p) / 2
        else:
            p1 = self.p - self.p / 2
            p2 = self.p * (1 - self.p / 2) / (1 - self.p)
        return p1, p2

    def show(self):
        print(f"当前概率: {self.p}")
        print(f"概率补偿: {self.p1, self.p2}")
        print(f"即:    触发事件后概率降低至{self.p1},反之,概率增加至{self.p2}")
        print("------------------------------------------")

    def check(self, count):
        """
        校验每次操作的暴击率是否都与初始的保持一致
        :param count:统计次数
        :return:None
        """
        # 获得初始矩阵
        vector = self.init_vector
        # 完成50次操作
        for i in range(1, count + 1):
            # 求得概率转移后新的概率矩阵
            vector = vector * self.matrix
            print(f"第{str(i).zfill(3)}轮: [ 暴击: {vector[0,0]}, 反之: {vector[0,1]} ]")

if __name__ == '__main__':
    prob = 5
    while prob <= 100:
        pc = PC(prob / 100)
        pc.show()
        prob += 5

日志输出

D:\software_install\Python\Python39\python.exe D:/projects/project-python/TestCase/game_prob/group_two/ProbabilisticCompensation.py
当前概率: 0.05
概率补偿: (0.025, 0.05131578947368422)
即:    触发事件后概率降低至0.025,反之,概率增加至0.05131578947368422
------------------------------------------
当前概率: 0.1
概率补偿: (0.05, 0.10555555555555556)
即:    触发事件后概率降低至0.05,反之,概率增加至0.10555555555555556
------------------------------------------
当前概率: 0.15
概率补偿: (0.075, 0.1632352941176471)
即:    触发事件后概率降低至0.075,反之,概率增加至0.1632352941176471
------------------------------------------
当前概率: 0.2
概率补偿: (0.1, 0.225)
即:    触发事件后概率降低至0.1,反之,概率增加至0.225
------------------------------------------
当前概率: 0.25
概率补偿: (0.125, 0.2916666666666667)
即:    触发事件后概率降低至0.125,反之,概率增加至0.2916666666666667
------------------------------------------
当前概率: 0.3
概率补偿: (0.15, 0.3642857142857143)
即:    触发事件后概率降低至0.15,反之,概率增加至0.3642857142857143
------------------------------------------
当前概率: 0.35
概率补偿: (0.175, 0.44423076923076915)
即:    触发事件后概率降低至0.175,反之,概率增加至0.44423076923076915
------------------------------------------
当前概率: 0.4
概率补偿: (0.2, 0.5333333333333334)
即:    触发事件后概率降低至0.2,反之,概率增加至0.5333333333333334
------------------------------------------
当前概率: 0.45
概率补偿: (0.225, 0.634090909090909)
即:    触发事件后概率降低至0.225,反之,概率增加至0.634090909090909
------------------------------------------
当前概率: 0.5
概率补偿: (0.25, 0.75)
即:    触发事件后概率降低至0.25,反之,概率增加至0.75
------------------------------------------
当前概率: 0.55
概率补偿: (0.36590909090909096, 0.775)
即:    触发事件后概率降低至0.36590909090909096,反之,概率增加至0.775
------------------------------------------
当前概率: 0.6
概率补偿: (0.4666666666666667, 0.8)
即:    触发事件后概率降低至0.4666666666666667,反之,概率增加至0.8
------------------------------------------
当前概率: 0.65
概率补偿: (0.5557692307692308, 0.825)
即:    触发事件后概率降低至0.5557692307692308,反之,概率增加至0.825
------------------------------------------
当前概率: 0.7
概率补偿: (0.6357142857142857, 0.85)
即:    触发事件后概率降低至0.6357142857142857,反之,概率增加至0.85
------------------------------------------
当前概率: 0.75
概率补偿: (0.7083333333333333, 0.875)
即:    触发事件后概率降低至0.7083333333333333,反之,概率增加至0.875
------------------------------------------
当前概率: 0.8
概率补偿: (0.7750000000000001, 0.9)
即:    触发事件后概率降低至0.7750000000000001,反之,概率增加至0.9
------------------------------------------
当前概率: 0.85
概率补偿: (0.8367647058823529, 0.925)
即:    触发事件后概率降低至0.8367647058823529,反之,概率增加至0.925
------------------------------------------
当前概率: 0.9
概率补偿: (0.8944444444444445, 0.95)
即:    触发事件后概率降低至0.8944444444444445,反之,概率增加至0.95
------------------------------------------
当前概率: 0.95
概率补偿: (0.9486842105263158, 0.975)
即:    触发事件后概率降低至0.9486842105263158,反之,概率增加至0.975
------------------------------------------
当前概率: 1.0
概率补偿: (1.0, 1.0)
即:    触发事件后概率降低至1.0,反之,概率增加至1.0
------------------------------------------

Process finished with exit code 0

 上面展示的是概率每增加0.05时,其对应的概率补偿值(P1,P2)

你可能感兴趣的:(Python,python,游戏,算法)