You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建概率函数整合独立项目概率,生成业务工时预测概率曲线?

总工时概率分布计算方案

针对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:32:46