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=0z2=1
内容的提问来源于stack exchange,提问作者Nicholas Nicholas
相关产品推荐
相关产品推荐

