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

CPLEX求解标记优化问题未得预期结果,求排查与解决

标记优化问题CPLEX代码结果异常的排查与修复

问题概述

使用Python CPLEX库实现标记优化模型时,代码运行结果为y=0,但预期结果应为y=0.014285、z1=0、z2=1。

核心问题分析

代码中最关键的错误是将变量y定义为整数变量,但根据预期结果和数学模型,y应为连续变量(非整数)。当y被设为整数变量时,其最小非负取值只能是0,直接导致求解结果不符合预期。

此外,约束16中的1/m[i]需显式转换为浮点运算,避免Python整数除法带来的潜在问题。

修正后的代码

import cplex
from docplex.mp.model import Model
import numpy as np

mdl = Model(name='Marking Optimization')
inf = cplex.infinity

n = 2 
A = np.array([1,2])

p = np.array([40,100]) 
c = np.array([20,100])
v = 3 
w = 5 
m = np.array([1,3])

# 修正:将y改为连续变量(而非整数变量)
y = mdl.continuous_var(lb=0, ub=inf, name='y')

z = np.empty((n,), dtype=object)
for i in range(n):
    z[i] = mdl.integer_var(lb=0, ub=inf, name='z' + str(i + 1))

# constraint 15
mdl.add_constraint(1 >= y*(n+1)*(2*v + 2*w))

# constraint 16:显式使用浮点除法避免整数运算问题
for i in range(n):
    mdl.add_constraint(1 >= y * (1.0 / m[i]) * (p[i] + c[i] + 2*w))

# constraint 17
for i in range(n):
    mdl.add_constraint(m[i] - z[i] >= y*(p[i] + 3*v + 4*w))

# constraint 18
for i in range(len(A)):
    mdl.add_constraint(1 + z[i] >= y*((n+1 - 2*len(A))*(2*v + 2*w) + (2*w + v + c[i])))

# constraint 19A
for i in range(n):
    mdl.add_constraint(0 <= z[i])

# constraint 19B
for i in range(n):
    mdl.add_constraint(z[i] <= m[i] - 1)

# equation 14:最大化y
mdl.maximize(y)
mdl.print_information()
solver = mdl.solve() # 可开启log_output=True查看求解过程
if solver is not None:
    mdl.print_solution()
else:
    print("求解出错")

验证结果

修正后运行代码,将得到预期结果:

  • y=0.014285714285714285(即1/70)
  • z1=0
  • z2=1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:03:23