目录
系列文章目录
文章目录
前言
一、模型的建立
二、算法的步骤
三、代码的实现
四、运行的结果
总结
博弈论是研究具有斗争或竞争性质现象的数学理论和方法,它考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。博弈论研究的模型中,玩家之间的关系主要可以分为四种:即零和博弈,非零和博弈,合作博弈,非合作博弈。
本文研究的是非零和博弈,即在该博弈中,一方的收益不一定等于另一方的损失,参与方之间的关系不仅取决于双方的收益, 还取决于其他因素,如双方的合作程度和对抗程度等。本文虚构了两个企业之间的商品价格博弈,具体模型构造见下文。
假设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公司定价策略的博弈曲线如下:
通过A、B公司定价策略的博弈曲线可以看出,两家公司的博弈过程并非是一直加价上升的,而是有一个来回的博弈过程。特别地,在最后的纳什均衡策略确定前,两家公司进行了激烈的价格对抗,来来回回的价格变动方向改变了多次。
大家也可以通过修改两家公司的销量函数的系数运行代码玩玩,不同系数下得到的博弈曲线肯定是不一样的。