为做出最正确的决定而生
第一章 python之纳什均衡
现实映射关系:
两个值p1,p2根据函数变换成p1’,p2’的类型
循环条件:
像这种类型的函数变换就只需要看max(abs(p1- p1’),abs(p2-p2’))<0.01就可判断其是否趋于稳定
循环变量,p1=p1’
结果图
第二种类型 多目标规划与单目标规划
现实映射关系:
根据p1值得到opt1’值的,
循环条件:
就可判断其是否稳定
则需要明确p1的定义域,
循环变量,p1=p1+1,要明确其定义域,
结果图
第三种类型 条件概率遍历数据
条件概率最重要的变量是其样本空间
已知条件是缩小样本空间的变量
画图代码
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10, 6))
# 绘制点
for point in what_a_revenue:
plt.scatter(point[0], point[1], color="black")
# 绘制连接线
for i in range(len(what_a_revenue) - 1):
start = what_a_revenue[i]
end = what_a_revenue[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()
---
## 第一种类型完整代码
```c
# 定义每个商品的成本
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 = 0 # 初始收益
opt_revenue_p2 = 0
delta = 1 # 价格变化量,如果 delta 的值比某个小数值(如 0.01)还要小,说明我们已经找到了一个稳定的纳什均衡点
count = 0
what_a_game = [] # 用来存储每次博弈的价格
what_a_revenue = [] # 用来存储每次博弈的价格
while delta > 0.5:
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)
# 显示图像
plt.show()
---
第二种类型完整代码
风险与利润的关系代码:
clc,clear
t=0;
hold on
while t<0.05
D=[-0.05,-0.27,-0.19,-0.185,-0.185];
N=[zeros(4,1),diag([0.025,0.015,0.055,0.026])];
F=t*ones(4,1);
Neq=[1,1.01,1.02,1.045,1.065];
Feq=1;
LF=zeros(5,1);
[X,Q]=linprog(D,N,F,Neq,Feq,LF);
Q=-Q;
plot(t,Q,'*r');
t=t+0.00025;
end
xlabel('t'),ylabel('Q')
axis([0 0.035 0 0.3]);
grid on
---