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

PuLP求解器返回结果不满足约束条件的问题求助

生产规划优化问题:PuLP求解结果不满足约束

问题背景

我使用PuLP库求解生产规划优化问题,但求解器输出的最优解未满足代码中设定的约束条件,无法定位原因。

该优化问题的目标函数为:
$$f(p, e) = 20\sum_{0}^{12}s_i + 50\sum_{0}^{11}e[i]{p[i+1]-p[i]}$$
其中 $s_m = s_0 + \sum_{1}^{m}(p_m - d_m)$,$u[i]=\text{sign}(p[i+1]-p[i])$ 用于验证符号约束,$d$ 为给定的需求序列。

代码实现

def q(e, X, p0):
    # Constantes et données de l'énoncé
    mois = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
    mois0 = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
    
    e = {'1': e[0], 
         '2': e[1], 
         '3': e[2], 
         '4': e[3], 
         '5': e[4], 
         '6': e[5],
         '7': e[6],
         '8': e[7],
         '9': e[8],
         '10': e[9],
         '11': e[10],
         '12': e[11]}


    # Définition du problème
    prob = LpProblem("Planification de la production", LpMinimize)

    # Définition des variables
    p = LpVariable.dicts("mois", mois0, 0)

    # Fonction objectif
    def lst_mois(m):
        L=[]
        for i in range(1, m+1):
            L.append(str(i))
        return L
    
    prob += lpSum([20 * (s0 + lpSum([p[i] - d[i] for i in lst_mois(int(m))])) for m in mois0]) + lpSum([50 * e[i] * (p[i] - p[str(int(i)-1)]) for i in mois]), "Coût à constante près"
    
    # Contraintes
    for m in mois:
        prob += (s0 + lpSum([p[i] - d[i] for i in lst_mois(int(m))])) >= 0, m

    for i in mois:
        prob += e[i] * (p[i] - p[str(int(i)-1)]) >= 0, "Contrainte de signe "+i
    
    if X < np.inf:
        for i in mois:
            prob += p[i] <= X, "Coût maximal "+i

    prob += p['0'] == p0
    
    # Résolution
    prob.solve()

    # On renvoie le résultat sous forme d'un tableau (indices = mois, valeur = volume à produire)
    production = [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]
  
    for v in prob.variables():
        production[int(v.name[5])] = v.varValue
    
    print(prob.status)
    return production

调用参数与求解结果

调用参数:

d = {'0': 0., '1': 120,  '2': 220,  '3': 120,  '4': 620,  '5': 650,  '6': 650, '7': 650, '8': 100, '9': 150, '10': 520, '11': 510, '12': 500}
p0=600
s0=100
a = q([1,1,1,-1,-1,1,-1,1,1,1,1,1], np.inf, p0)

求解得到的生产序列:

[600.0, 466.25, 600.0, 600.0, 282.5, 282.5, 282.5, 282.5, 282.5, 282.5, 0.0, 0.0, 0.0]

经检查,该结果未满足代码中设定的第二个约束(符号约束 e[i] * (p[i] - p[str(int(i)-1)]) >= 0),请求帮助排查解决。


内容的提问来源于stack exchange,提问作者Jean1418

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:37:21