通过案例研究二项分布和泊松分布之间关系(2)
通过案例研究二项分布和泊松分布之间关系
- 2. 汽车出事故的概率p与保险公司盈利W之间的关系
- 3.通过遗传算法多次迭代计算控制p为多少时公司盈利最大
- (1) 计算过程
- (2) 结果及分析(计算过程详见附录二程序)
- 4.改变思路求解固定p为0.01时,保险费用如何设置公司可获得最大利润
- (1)计算过程
- (2) 结果及分析(计算过程详见附录三程序):
- 结论分析
- 附录二
- 附录三
- 附录四
书接上回
2. 汽车出事故的概率p与保险公司盈利W之间的关系
运输公司共有n=600辆汽车参加保险,每辆车的保险费用为C=1000,每辆车的赔偿金额为L=10000,在一年内每辆汽车出事故的概率为p,且每辆汽车之间是否出事故相互独立, 因此一年内出事故的汽车数量X服从二项分布:X∼b(n,p),其中n=600,p=0.01。
由于保险公司的总盈利为
n
∗
C
−
X
∗
L
,
n*C-X*L,
n∗C−X∗L,
我们利用发生事故车辆的期望值,即E(X)=n×p,以此作为预期的事故数量来简化总盈利的计算,故简化后的保险公司总盈利为
W
=
n
×
C
−
n
×
p
×
L
,
W=n×C-n×p×L,
W=n×C−n×p×L,
同时上式可以作为W和p之间的关系表达式。
根据上式可以反推出p的表达式
p
=
(
n
×
C
−
W
)
/
(
n
×
L
)
,
p=(n×C-W)/(n×L),
p=(n×C−W)/(n×L),
代入W=200000,可以求得当盈利200000时p为多少,作为盈利200000的预期事故发生概率的值。
下面将根据上述推导结果,计算并绘制W和p之间的关系图像,如下图II所示.
根据图II所示,公司的盈利W和每辆车出事故的概率p之间的关系是线性递减的。当W=200000时,对应预期的p=0.0067,从而给出了二者的关系,更有利于分析。
3.通过遗传算法多次迭代计算控制p为多少时公司盈利最大
(1) 计算过程
⮚ 适应度函数:利用泊松分布计算出事故数量不超过
k
m
a
x
(
k
m
a
x
=
(
n
×
C
−
W
)
/
L
)
kmax(kmax=(n×C-W)/L)
kmax(kmax=(n×C−W)/L)的累计概率(即未盈利的概率),然后用其补集得到盈利的概率。
⮚ 种群和选择:创建一个初始种群,其中的概率值在[0,0.1]之间,从当前种群中依据适应度选择较高的个体作为父代。
⮚交叉和变异:实现了简单的单点交叉和基于概率的变异。
交叉:基于父代生成两个子代,通过加权平均的方式创建新的个体。
变异:在一定概率下对个体产生小的随机扰动,增强多样性。
⮚迭代:运行遗传算法,通过多次迭代改进种群,寻找最佳事故概率
⮚可视化和输出:输出最终的最佳事故概率及其对应的最大盈利概率,并绘制盈利概率随事故概率变化的图形。
(2) 结果及分析(计算过程详见附录二程序)
如果事故概率可控制,对于保险公司盈利最大的事故概率为p=0.0699。
由可视化的输出可以看出,当我们固定概率区间为[0,0.1]时,这一限制基于现实生活中事故发生的概率通常不会太高。限制概率有助于保险公司设计出更具有可用性的保险产品,同时控制风险并保持可持续发展。在实际应用中,概率不仅仅是一个理论概念,而是用于制定实际决策的工具。通过掌握如何计算和应用概率,我们能更好地理解和管理不同情况下的风险。
4.改变思路求解固定p为0.01时,保险费用如何设置公司可获得最大利润
保持原有条件p和L不变,找到通过遗传算法得到的最佳的每辆车的保险费用。
(1)计算过程
⮚适应度函数:
我们确保计算出的利润高于p时返回该利润,否则返回负无穷,使得这些不符合盈利条件的个体在选择中被排除。
⮚初始化种群:
在500到5000元的范围内随机产生初始保险费用。生成初始的保险费用种群。
⮚选择:
根据适应度选择具有较高适应度的保险费用个体作为“父代”进行交叉和变异通过计算适应度的概率分布,根据适应度高的个体赋予更高的选择概率。
⮚交叉和变异:
基于父代生成两个新个体(子代)采用加权平均方式,产生新的保险费用。通过随机扰动操作对个体进行修改,增加种群的多样性,确保算法不至于陷入局部最优解生成新个体并保证其保险费用在合理的范围内。
⮚输出结果:
在迭代结束后,输出最佳保险费用C和最大利润,并将两者之间的关系可视化。将利润函数的变化与最佳保险费用进行对比,用图形更直观地展示结果。通过比较当前最佳个体与上一代最佳个体,并在条件下确定是否终止外层循环
(2) 结果及分析(计算过程详见附录三程序):
最佳保险费用C=4183.30元。
最大利润: 1909980.94元。
根据图像及迭代输出的结果进行分析,本次迭代进行了200×1000次的充分迭代,最终输出的结果中最佳保险费用稳定在4683.54元附近,最终的最大利润稳定在2210126.09元附近,对保险公司保险费用的设定上提供了一定的参考价值。
结论分析
本实验通过具体实际的案例研究了二项分布和泊松分布之间关系,并列讨论了案例中保险公司最大盈利W与汽车出事故的概率p之间的关系,具体结论如下:
二项分布是描述n重伯努利试验中某事件成功的次数,而泊松分布是描述在固定的时间或空间内,某事件发生的次数。根据泊松定理可知,当二项分布中的参数n很大,p很小的时候,且λ=n×p保持为常数时,二项分布可以由泊松分布近似,本实验结合具体案例从定量的角度再次印证了泊松定理的正确性。
本实验将二项分布和泊松分布进行对比,并且对问题中的保险公司一年赚钱不少于200000元的概率进行了求解,并展开对保险公司保险费用的定价和保险公司盈利最大值的探讨,充分分析了两个分布的关系,并对实际的生产进行了探究。
附录二
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import poisson
from tqdm import tqdm # 导入 tqdm 库
# 定义遗传算法参数
POPULATION_SIZE = 100 # 种群大小
GENERATIONS = 100 # 迭代代数
MUTATION_RATE = 0.1 # 变异率
CONVERGENCE_THRESHOLD = 1e-5 # 收敛阈值
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 保险公司参数
n = 600 # 汽车数量
C = 1000 # 每辆车的保险费
L = 100000 # 每辆车的赔偿金额
P = 200000 # 保险公司希望盈利不少于的金额
def fitness_function(p):
"""计算给定事故概率 p 的适应度"""
k_max = (n * C - P) // L
prob = 1 - poisson.cdf(k_max, n * p) # 计算盈利概率
return prob
def create_population(size):
"""创建初始种群(生成的概率范围在0到0.1之间)"""
return np.random.rand(size) * 0.1 # 确保范围在 [0, 0.1] 之间
def select_parents(population, fitness_scores):
"""选择适应度较高的父代"""
probabilities = fitness_scores / fitness_scores.sum() # 适应度比例
idx = np.random.choice(np.arange(len(population)), size=2, p=probabilities)
return population[idx]
def crossover(parents):
"""进行单点交叉"""
point = np.random.rand() # 生成交叉点
child1 = parents[0] * point + parents[1] * (1 - point)
child2 = parents[1] * point + parents[0] * (1 - point)
return np.clip([child1, child2], 0, 0.1) # 保证子代在 [0, 0.1] 之间
def mutate(individual):
"""进行变异操作"""
if np.random.rand() < MUTATION_RATE:
return np.clip(individual + np.random.normal(0, 0.01), 0, 0.1) # 变异范围控制在 [0, 0.1]
return individual
# 多次迭代直到得到稳定的最佳事故概率
stable_best_prob = None
converged = False
for iteration in tqdm(range(100), desc="Outer Iterations", unit="iteration"):
population = create_population(POPULATION_SIZE)
for generation in range(GENERATIONS):
# 向量化计算所有个体的适应度
fitness_scores = np.array([fitness_function(p) for p in population])
new_population = []
for _ in range(POPULATION_SIZE // 2):
parents = select_parents(population, fitness_scores) # 选择父代
children = crossover(parents) # 交叉
new_population.extend(map(mutate, children)) # 变异
population = np.array(new_population)
# 找到当前最佳个体
best_p = population[np.argmax(fitness_scores)]
# 检查稳定性
if stable_best_prob is None:
stable_best_prob = best_p
elif abs(best_p - stable_best_prob) < CONVERGENCE_THRESHOLD:
converged = True
stable_best_prob = best_p # 更新稳定值
max_profit_probability = fitness_function(stable_best_prob)
print(f"最佳事故概率 p: {stable_best_prob:.4f}")
print(f"最大盈利概率: {max_profit_probability:.4f}")
# 可视化结果
plt.figure(figsize=(16, 9)) # 设置输出图像画幅为16:9
x = np.linspace(0, 0.1, 100)
y = [fitness_function(p) for p in x]
plt.plot(x, y, label='盈利概率')
plt.scatter(stable_best_prob, max_profit_probability, color='red', label='最佳解')
plt.title('事故概率与盈利概率的关系(限制 p ≤ 0.1)',fontsize=16)
plt.xlabel('事故概率 p',fontsize=14)
plt.ylabel('盈利概率',fontsize=14)
plt.legend()
plt.grid()
plt.show()
附录三
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import poisson
from tqdm import tqdm # 导入 tqdm 库
# 定义遗传算法参数
POPULATION_SIZE = 100 # 种群大小
INNER_GENERATIONS = 200 # 内层迭代代数
OUTER_GENERATIONS = 1000 # 外层迭代代数
MUTATION_RATE = 0.1 # 变异率
CONVERGENCE_THRESHOLD = 1e-5 # 收敛阈值
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 保险公司参数
n = 600 # 汽车数量
p = 0.01 # 每辆车出事故的概率
L = 100000 # 每辆车的赔偿金额
P = 200000 # 保险公司希望盈利不少于的金额
def fitness_function(C):
"""计算给定保险费用 C 的适应度"""
k_expected = n * p # 预期出事故的数量
profit = n * C - k_expected * L # 利润计算
# 使得目标是在最大化利润的同时,满足盈利条件
if profit >= P:
return profit # 返回利润
else:
return 0 # 如果不满足条件则返回0,表示适应度为0
def create_population(size):
"""创建初始种群(生成的保险费用范围在500到5000之间)"""
return np.random.uniform(500, 5000, size) # 保险费用在500到5000元之间
def select_parents(population, fitness_scores):
"""选择适应度较高的父代"""
probabilities = fitness_scores / fitness_scores.sum() # 适应度比例
idx = np.random.choice(np.arange(len(population)), size=2, p=probabilities)
return population[idx]
def crossover(parents):
"""进行单点交叉"""
point = np.random.rand() # 生成交叉点
child1 = parents[0] * point + parents[1] * (1 - point)
child2 = parents[1] * point + parents[0] * (1 - point)
return np.clip([child1, child2], 500, 5000) # 保证子代在[500, 5000]之间
def mutate(individual):
"""进行变异操作"""
if np.random.rand() < MUTATION_RATE:
return np.clip(individual + np.random.normal(0, 100), 500, 5000) # 变异范围控制在 [500, 5000]
return individual
# 多次迭代直到得到稳定的最佳保险费用
stable_best_prob = None
converged = False
for outer_iteration in tqdm(range(OUTER_GENERATIONS), desc="Outer Iterations", unit="iteration"):
population = create_population(POPULATION_SIZE)
for inner_generation in range(INNER_GENERATIONS):
fitness_scores = np.array([fitness_function(c) for c in population]) # 计算适应度得分
new_population = []
for _ in range(POPULATION_SIZE // 2):
parents = select_parents(population, fitness_scores) # 选择父代
children = crossover(parents) # 交叉
new_population.extend(map(mutate, children)) # 变异
population = np.array(new_population)
# 找到当前最佳个体
best_p = population[np.argmax(fitness_scores)]
# 检查稳定性
if stable_best_prob is None:
stable_best_prob = best_p
elif abs(best_p - stable_best_prob) < CONVERGENCE_THRESHOLD:
converged = True
stable_best_prob = best_p # 更新稳定值
max_profit_probability = fitness_function(stable_best_prob)
print(f"最佳保险费用 C: {stable_best_prob:.2f} 元")
print(f"最大利润: {max_profit_probability:.2f} 元")
# 可视化结果
plt.figure(figsize=(16, 9))
x = np.linspace(500, 5000, 100)
y = [fitness_function(c) for c in x]
plt.plot(x, y, label='利润函数')
plt.scatter(stable_best_prob, max_profit_probability, color='red', label='最佳 C')
plt.title('保险费用与利润的关系',fontsize=16)
plt.xlabel('保险费用 C (元)',fontsize=14)
plt.ylabel('利润 (元)',fontsize=14)
plt.legend()
plt.grid()
plt.show()
附录四
import numpy as np
import matplotlib.pyplot as plt
# 保险公司参数
n = 600 # 汽车数量
C = 1000 # 每辆车的保险费
L = 100000 # 每辆车的赔偿金额
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 定义出事故的概率范围
p_values = np.linspace(0, 0.1, 100) # 从0到0.1取100个点
W_values = n * (C - p_values * L) # 计算对应的盈利
# 计算当盈利为200000时的p值
target_profit = 200000
p_calculated = (n * C - target_profit) / (n * L) # 计算概率p
if p_calculated < 0 or p_calculated > 0.1:
print("计算结果不在合理范围内。")
else:
print(f"当公司盈利为 {target_profit} 元时,事故概率 p = {p_calculated:.4f}")
# 绘制盈利与概率的关系图
plt.figure(figsize=(10, 6))
plt.plot(p_values, W_values, label='盈利 W', color='blue')
plt.axhline(0, color='red', linestyle='--', label='零盈利线') # 添加零盈利线
plt.axvline(p_calculated, color='purple', linestyle='--', label=f'p = {p_calculated:.4f}') # 紫色虚线
plt.scatter(p_calculated, target_profit, color='red', label='盈利 = 200000') # 红色点
plt.title('公司盈利 W 与每辆车出事故概率 p 的关系',fontsize=16)
plt.xlabel('每辆车出事故的概率 p',fontsize=14)
plt.ylabel('公司盈利 W (元)',fontsize=14)
plt.legend()
plt.grid()
plt.xlim(0, 0.1) # 限制 x 轴范围
plt.ylim(-50000, 600000) # 限制 y 轴范围以进行良好查看
plt.show()