目录
预习报告部分
一、实验目的:
通过计算机程序和数据分析来验证经典连续得益无限策略博弈模型的正确性
二、实验内容:
通过程序模拟古诺模型中两个以上市场的博弈
三、实验原理:
1.古诺模型又称古诺双寡头模型 ,或双寡头模型,是经济学模型的一种。古诺模型是纳什均衡应用的最早版本。古诺模型通常被作为寡头理论分析的出发点。古诺模型是一个只有两个寡头厂商的简单模型,该模型阐述了相互竞争而没有相互协调的厂商的产量决策是如何相互影响的,从而产生一个位于完全竞争和完全垄断之间的均衡结果。古诺模型的结论可以很容易地推广到三个或三个以上的寡头厂商的情况中去。
2.古诺模型简单示意图:
四、实验工具:
1、开发语言:python
2、开发应用:pycharm
五、实验步骤:
1.选择古诺模型作为验证对象。
2.详细描述一个应用所选模型的博弈场景,给出各博弈要素的完整假设:
①古诺模型的最初原型是一个市场中存在两个竞争公司。两个公司生产玩具的数量和价格相互影响,当公司生产的玩具数量增加时,市场中玩具的价格下降,玩具的利润为:价格-成本。
②建立该模型需要确定博弈方:公司a和公司b
设a公司产量为qa,b公司产量为qb,总供给为qq,而玩具的价格price关于qq的函数关系即为:price=1000-qq。
产品总成本与生产量有关,c表示总成本,设i企业产量为qi,则其总成本ci与qi的关系函数为c=20q。
故i公司的得益函数为:money=price*qi-ci=(1000-qq)qi-ci=(980-qq)qi
3.计算所描述博弈场景的纳什均衡,并分析:是否存在其他帕累托效率意义上的上策?为什么没能在该策略组合上达成均衡?
4.编写计算机程序,实现两个能够给出策略选择的智能体(对象)来模拟博弈模型中的参与者。
5.智能体输入参数的值可以根据上一次博弈的结果进行修正,进而给出新的策略选择,以此模拟博弈参与者根据经验变换策略选择的效果。
6.收集并存储每次博弈的过程和结果数据(博弈次数根据需要设定,通常一个收敛的博弈模型,博弈次数越多,实验效果越精细)。
7.将博弈的结果数据进行整理,并绘制为折线图(或其他用于数值比较的图表),进而分析双方的博弈结果是否符合所选模型理论上的均衡计算。
实验报告部分
一、实验结果分析:
1.选择古诺模型作为验证对象。
2.详细描述一个应用所选模型的博弈场景,给出各博弈要素的完整假设:
①古诺模型的最初原型是一个市场中存在两个竞争公司。两个公司生产玩具的数量和价格相互影响,当公司生产的玩具数量增加时,市场中玩具的价格下降,玩具的利润为:价格-成本。
②建立该模型需要确定博弈方:公司a和公司b。设a公司产量为qa,b公司产量为qb,总供给为qq,而玩具的价格price关于qq的函数关系即为:price=1000-qq。产品总成本与生产量有关,c表示总成本,设i企业产量为qi,则其总成本ci与qi的关系函数为c=20q。故i公司的得益函数为:money=price*qi-ci=(1000-qq)qi-ci=(980-qq)qi
3.计算所描述博弈场景的纳什均衡,并分析:是否存在其他帕累托效率意义上的上策?为什么没能在该策略组合上达成均衡?
古诺模型中公司a的反应函数:q_1=1/2(a−q_2^∗−c),而在该博弈中,a=1000,c=20;由反应函数可得:
即(q1*,q2*)是纳什均衡,代入a和c的值求解为:q1*=(a-c)/6,即约等于163,故该古诺模型中纳什均衡大概是(163,163)。
帕累托上策均衡是指没有任何人损失利益的情况下提升得益。从帕累托效率意义上讲,对双方的得益函数进行求导,导数为零的位置即为双方的帕累托上策,且这样的上策有很多,但在该纳什均衡下,两个公司的利益已经达到最高,其中任何一方提高产量,另一方的收益都会得到损失,故即使存在帕累托效率意义上的上策,也不能再该策略组合上达到均衡。
4.编写计算机程序,实现两个能够给出策略选择的智能体(对象)来模拟博弈模型中的参与者。
5.智能体输入参数的值可以根据上一次博弈的结果进行修正,进而给出新的策略选择,以此模拟博弈参与者根据经验变换策略选择的效果。
代码:
import random
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Songti SC']
class Company:
def __init__(self, name):
self.name = name
self.quantity = random.randint(10, 100) # 初始随机数量
self.profit = 0
self.stable_profit_rounds = 0 # 记录利润不增加的轮数
def update_quantity(self):
# 随机增加或减少产量
change = random.randint(-10, 30)
self.quantity = max(10, self.quantity + change)
def calculate_profit(self, total_quantity):
price = 1000 - total_quantity
cost = 20 * self.quantity
self.profit = (price - 20) * self.quantity - cost
return self.profit
# 运行 5 次模拟
for simulation in range(5):
company_a = Company('A')
company_b = Company('B')
history = {'A_quantity': [], 'B_quantity': [], 'A_profit': [], 'B_profit': []}
previous_profit_a, previous_profit_b = 0, 0
round_number = 0 # 记录轮数
while company_a.stable_profit_rounds < 10 and company_b.stable_profit_rounds < 10:
round_number += 1
total_quantity = company_a.quantity + company_b.quantity
# 计算当前利润
current_profit_a = company_a.calculate_profit(total_quantity)
current_profit_b = company_b.calculate_profit(total_quantity)
# 更新产量并计算新的利润
company_a.update_quantity()
company_b.update_quantity()
new_total_quantity = company_a.quantity + company_b.quantity
new_profit_a = company_a.calculate_profit(new_total_quantity)
new_profit_b = company_b.calculate_profit(new_total_quantity)
# 如果新的利润更高,则更新策略
if new_profit_a <= current_profit_a:
company_a.quantity -= (new_total_quantity - total_quantity)
if new_profit_b <= current_profit_b:
company_b.quantity -= (new_total_quantity - total_quantity)
# 检查利润是否稳定
if new_profit_a <= previous_profit_a:
company_a.stable_profit_rounds += 1
else:
company_a.stable_profit_rounds = 0
if new_profit_b <= previous_profit_b:
company_b.stable_profit_rounds += 1
else:
company_b.stable_profit_rounds = 0
previous_profit_a, previous_profit_b = new_profit_a, new_profit_b
# 记录数据
history['A_quantity'].append(company_a.quantity)
history['B_quantity'].append(company_b.quantity)
history['A_profit'].append(company_a.profit)
history['B_profit'].append(company_b.profit)
# 输出每次模拟后的信息
print(f"第 {simulation + 1} 次模拟完成,共 {round_number} 轮。")
print(f"公司 A - 最优产量: {company_a.quantity}, 最优利润: {company_a.profit}")
print(f"公司 B - 最优产量: {company_b.quantity}, 最优利润: {company_b.profit}")
print()
# 为这次模拟绘制结果
plt.figure(simulation)
plt.plot(history['A_profit'], label='公司 A 利润')
plt.plot(history['B_profit'], label='公司 B 利润')
plt.xlabel('轮数')
plt.ylabel('利润')
plt.title(f'第 {simulation + 1} 次模拟')
plt.legend()
plt.show()
6.收集并存储每次博弈的过程和结果数据(博弈次数根据需要设定,通常一个收敛的博弈模型,博弈次数越多,实验效果越精细)。
7.将博弈的结果数据进行整理,并绘制为折线图(或其他用于数值比较的图表),进而分析双方的博弈结果是否符合所选模型理论上的均衡计算。
二、实验效果截图:
三、总结及心得体会:
1、程序设计思路:
建立该模型需要确定博弈方:公司a和公司b
设a公司产量为qa,b公司产量为qb,总供给为qq,而玩具的价格price关于qq的函数关系即为:price=1000-qq。
产品总成本与生产量有关,c表示总成本,设i企业产量为qi,则其总成本ci与qi的关系函数为c=20q。
故i公司的得益函数为:money=price*qi-ci=(1000-qq)qi-ci=(980-qq)qi
双方随机给出产量,并随机增加或减少产量,增加的比减少的幅度大一些,计算两次产量的得益。若这次产量的得益比上次得益增加,则产量更新;若得益降低,则产量减少。两家公司的博弈持续到双方收益都不再增加为止,引入一个阈值来跟踪两家公司的收益变化,设阈值为10,若两家的收益连续10轮收益不再增加,则循环停止。
循环五轮,分别给出五次循环两家公司的最终产量和得益,并绘制出图像。
2.总结:
可能是因为我程序写得太简单,每次博弈两家都没法达到纳什均衡,但感觉这也很现实,因为达到纳什均衡的条件是:两家同时达到(p1*,p2*)这个点,但正像上面说的,对单公司来说,p1*并不是最好的上策,而是还存在帕累托效率意义上的上策。因此在博弈中呈现的结果往往是:一家抢的先机,逐渐达到p1*后继续提高产量,而另一家也在逐渐提高产量,导致市场均衡被打破,一家的收益也开始下降。因此产量较高的一家开始试图改变策略,但产量较低的一家依然在增加产量,最终各自达到自己在市场所占份额收益的顶峰。
从图中可知,这是一个很考验时机的挑战,率先提高产量的一方可能收益逐渐降低,也可能和另一家反复竞争,还有可能始终抢得先机,占领市场大头。因此商业竞争真是很考验人和时机的,投资创业需谨慎。