如何构建概率函数整合独立项目概率,生成业务工时预测概率曲线?
总工时概率分布计算方案
针对25个独立项目的中标概率与潜在工时,计算总工时的概率分布并绘制曲线,最高效且准确的方法是动态规划,替代枚举组合的低效方式,以下是具体实现步骤:
核心思路
每个项目只有两种独立状态:中标(概率p_i,贡献h_i工时)或未中标(概率1-p_i,贡献0工时)。我们通过动态规划逐步迭代,维护一个记录「累计总工时-对应概率」的映射,每加入一个项目就更新这个映射,最终得到所有可能总工时的概率分布。
实现步骤
1. 数据预处理
先将DataFrame中的中标概率从百分比转换为0-1的小数:
import pandas as pd # 假设你的数据框为df,列名对应"中标概率(%)"和"潜在工时" df['中标概率'] = df['中标概率(%)'] / 100 probabilities = df['中标概率'].values hours = df['潜在工时'].values
2. 动态规划计算概率分布
初始化初始状态(0工时的概率为1),然后遍历每个项目更新概率映射:
# 初始化:0工时的概率为1.0 current_dist = {0: 1.0} for p, h in zip(probabilities, hours): new_dist = {} for total_h, prob in current_dist.items(): # 情况1:当前项目未中标,总工时不变,概率累加 if total_h in new_dist: new_dist[total_h] += prob * (1 - p) else: new_dist[total_h] = prob * (1 - p) # 情况2:当前项目中标,总工时增加h,概率累加 new_total_h = total_h + h if new_total_h in new_dist: new_dist[new_total_h] += prob * p else: new_dist[new_total_h] = prob * p # 更新为最新的概率分布 current_dist = new_dist
3. 生成概率曲线
将结果转换为有序的DataFrame后,即可绘制概率曲线:
import matplotlib.pyplot as plt # 转换为有序数据框并排序 result_df = pd.DataFrame( list(current_dist.items()), columns=['总工时', '概率'] ).sort_values(by='总工时') # 绘制曲线 plt.figure(figsize=(10, 6)) plt.plot(result_df['总工时'], result_df['概率'], linewidth=2) plt.xlabel('总工时') plt.ylabel('概率') plt.title('总工时概率分布曲线') plt.grid(alpha=0.3) plt.show()
关键说明
- 为什么不用枚举组合:25个项目共有
2^25=33,554,432种组合,计算量极大,动态规划的时间复杂度为O(N*T_max)(N为项目数,T_max为总工时上限),效率提升显著。 - 为什么累积概率相乘错误:该方法错误在于,它没有考虑不同项目组合可能得到相同总工时的情况,正确的概率应该是所有能得到该总工时的组合概率之和,这正是动态规划的核心逻辑。
内容的提问来源于stack exchange,提问作者Ahoy0865
相关产品推荐
相关产品推荐

