Python 求解非零和博弈的纳什均衡策略——以虚构的两个企业之间的商品价格博弈为例

系列文章目录


目录

系列文章目录

文章目录

前言

一、模型的建立

二、算法的步骤

三、代码的实现

四、运行的结果

总结


前言

        博弈论是研究具有斗争或竞争性质现象的数学理论和方法,它考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。博弈论研究的模型中,玩家之间的关系主要可以分为四种:即零和博弈,非零和博弈,合作博弈,非合作博弈。

        本文研究的是非零和博弈,即在该博弈中,一方的收益不一定等于另一方的损失,参与方之间的关系不仅取决于双方的收益, 还取决于其他因素,如双方的合作程度和对抗程度等。本文虚构了两个企业之间的商品价格博弈,具体模型构造见下文。


一、模型的建立

        假设A公司定价为p1,而B公司定价为p2,则A公司的收益为:A(p1,p2) = (p1-200)*q1,其中q1为A公司产品的销量,q1 = 600*( 1-p1*1.7 / (p1 + p2));B公司的收益为:B(p1,p2) = (p2-200)*q2,其中q2为B公司产品的销量,q2 = 400*( 1-p2 *1.4/ (p1 + p2));单个商品的成本为200;A公司和B公司在确定自己的价格时,都会考虑到对方的可能策略,并尝试通过调整自己的定价来最大化自己的收益。

        本模型假设的市场总份额为1000,其中A公司占有的初始市场份额为600,B公司为400。考虑到占有市场份额大的企业提升了商品价格后,比较容易对销量产生影响,故而本文对A公司的q1的函数表达式中p1前的系数取1.7,B公司则取1.4。

        简单解释下,比如你时爱喝A公司的葡萄汁,这种果汁卖3块,结果某天它的价格上涨了五毛钱,这时候你可能买它的频率就会降低许多了,因为你经常买,你会觉得自己每次都要比之前多花五毛钱,这种心理比较影响你之后购买它的欲望了。倘若你很少喝B公司产的葡萄汁,即使这种果汁卖5块,就算是它长到了6块,可能对你购买它的频次都没什么影响,第一,你可能压根就不记得它的价格,第二,你可能每次买它的时候只是为了过过嘴瘾,即使它涨了1块钱,你也觉得无所谓,因为你本身买它的次数就不多。这是我对我虚构这个销量函数的逻辑性不严密的解释,大家就姑且看个乐。(反正现在我不怎么买之前一直买的神内胡萝卜汁了,真后悔3块钱的时候没多喝几瓶啊!!!!现在四块五了。)

二、算法的步骤

        2.1 根据模型,写出A 、B公司产品的销量函数和收益函数。

        2.2  写出 A、B 公司的最优响应函数。

                2.21 遍历从成本到指定价格上限的区间之间的每种定价。

                2.22 倘若当前迭代下的价格所产生的的收益大于之前的定价,那么,就用当前迭代下的价格更新我们的定价。

        2.3 主循环

                2.31 确定初始价格、初始收益、初始价格变化量、并实例化一个空列表what_a_game=[]用来存储每次博弈的价格。

                2.32 如果价格变化量超过指定的值的话,那么就分别对A、B公司执行最优响应函数,同时更新当前博弈下的定价,并将定价储存到what_a_game中。直到价格变化量不超过指定的值,这时输出两家公司的纳什均衡定价。

        2.4 可视化展示

                2.41 将what_a_game中的两家公司的定价按照散点绘制在画布上。

                2.42 将what_a_game中的两家公司的定价按照先后顺序用线段连接起来绘制在画布上。

三、代码的实现

        代码如下:

"""
Python 求解非零和博弈的纳什均衡策略————以虚构的两个企业之间的商品价格博弈为例
本研究模型的属于非零和博弈,即在该博弈中,一方的收益不一定等于另一方的损失。
在这种博弈中,参与方之间的关系不仅取决于双方的收益,
还取决于其他因素,如双方的合作程度和对抗程度等。
由此,找寻纳什均衡策略。
written by C_Sheep
"""

# 定义每个商品的成本
cost = 200

# A 公司产品的销量函数和收益函数
def q1(p1, p2):
    return round(600*( 1-p1*1.7 / (p1 + p2)))

def revenue_A(p1, p2):
    return (p1 - cost) * q1(p1, p2)

# B 公司产品的销量函数和收益函数
def q2(p1, p2):
    return round(400*( 1-p2 *1.4/ (p1 + p2)))

def revenue_B(p1, p2):
    return (p2 - cost) * q2(p1, p2)

# 寻找 A 公司的最优响应函数
def best_response_A(p1,p2,opt_revenue = float('-inf')):
    opt_p1 = p1

    for p1_ in range(cost, 1000):
        rev_A = revenue_A(p1_, p2)

        if rev_A > opt_revenue and rev_A!=0:
            opt_revenue = rev_A
            opt_p1 = p1_
            break
    return opt_p1,opt_revenue

# 寻找 B 公司的最优响应函数
def best_response_B(p2,p1,opt_revenue = float('-inf')):
    opt_p2 = p2

    for p2_ in range(cost, 1000):
        rev_B = revenue_B(p1, p2_)
        if rev_B > opt_revenue and rev_B!=0:
            opt_revenue = rev_B
            opt_p2 = p2_
            break
    return opt_p2,opt_revenue

# 执行迭代过程,目标是寻找 A 公司和 B 公司的纳什均衡价格
p1 = 200  # 初始价格
p2 = 200
opt_revenue_p1= float('-inf') # 初始收益
opt_revenue_p2= float('-inf')
delta = 1  # 价格变化量,如果 delta 的值比某个小数值(如 0.01)还要小,说明我们已经找到了一个稳定的纳什均衡点
count=0
what_a_game=[] # 用来存储每次博弈的价格
while delta > 0.01:
    what_a_game.append([p1,p2])
    count += 1
    print(f"循环了{count}次")

    p1_new,opt_revenue_1 = best_response_A(p1,p2,opt_revenue_p1)
    p2_new,opt_revenue_2 = best_response_B(p2,p1_new,opt_revenue_p2)
    delta = max(abs(p1_new - p1), abs(p2_new - p2))
    p1 = p1_new
    p2 = p2_new
    opt_revenue_p1=opt_revenue_1
    opt_revenue_p2=opt_revenue_2
    print(f"p1={p1}")
    print(f"p2={p2}")
    print(f"opt_revenue_p1={opt_revenue_p1}")
    print(f"opt_revenue_p2={opt_revenue_p2}")
# 输出结果
print("A 公司的最优定价为 %d 元" % p1)
print("B 公司的最优定价为 %d 元" % p2)

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10, 6))

# 绘制点
for point in what_a_game:

    plt.scatter(point[0], point[1],color="black")

# 绘制连接线
for i in range(len(what_a_game) - 1):

    start = what_a_game[i]
    end = what_a_game[i+1]
    plt.plot([start[0], end[0]], [start[1], end[1]],color="black")

plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
plt.xlabel('A公司定价/元',fontsize=16)
plt.ylabel('B公司定价/元',fontsize=16)
plt.title("A、B公司定价策略的博弈曲线",fontsize=18)
print("加入我的qq群,大家一起讨论管理、规划类问题的算法\n群里我会不定期上传一些我自己和其他大神的算法源码\n群号为:808756207")
# 显示图像
plt.show()

四、运行的结果

        A、B公司定价策略的博弈曲线如下:

Python 求解非零和博弈的纳什均衡策略——以虚构的两个企业之间的商品价格博弈为例_第1张图片


总结

        通过A、B公司定价策略的博弈曲线可以看出,两家公司的博弈过程并非是一直加价上升的,而是有一个来回的博弈过程。特别地,在最后的纳什均衡策略确定前,两家公司进行了激烈的价格对抗,来来回回的价格变动方向改变了多次。

        大家也可以通过修改两家公司的销量函数的系数运行代码玩玩,不同系数下得到的博弈曲线肯定是不一样的。

你可能感兴趣的:(Python,数据分析,项目管理算法,工商管理算法,python,pandas,开发语言,算法,numpy)