Python中OR-Tools如何设置变量幂次?优化含x²的目标函数
问题核心
原代码使用的GLOP是线性规划求解器,仅支持线性目标函数与约束,而3x²属于二次项,这类问题属于二次规划(QP)范畴,因此需要切换到支持二次规划的求解器,并使用OR-Tools提供的二次目标构造API来实现。
可行解决方案
- 替换为支持二次规划的求解器:比如SCIP(开源免费,可通过
pip install ortools[scip]安装)、CPLEX等; - 利用OR-Tools的二次目标设置方法,手动添加
x²项的系数,线性项保持原有设置逻辑。
修改后的完整代码
from ortools.linear_solver import pywraplp def QuadraticProgrammingExample(): """Quadratic programming sample modified from linear example.""" # 初始化支持二次规划的SCIP求解器 solver = pywraplp.Solver.CreateSolver('SCIP') if not solver: print("无法创建二次规划求解器,请确认已安装ortools[scip]依赖") return # 变量定义与原示例一致 x = solver.NumVar(0, solver.infinity(), 'x') y = solver.NumVar(0, solver.infinity(), 'y') print('Number of variables =', solver.NumVariables()) # 保留原约束条件 solver.Add(x + 2 * y <= 14.0) solver.Add(3 * x - y >= 0.0) solver.Add(x - y <= 2.0) print('Number of constraints =', solver.NumConstraints()) # 构建目标函数:3x² + 4y objective = solver.Objective() # OR-Tools二次项内部计算为 0.5 * 系数 * 变量²,所以3x²需要设置系数为6(0.5*6x²=3x²) objective.SetQuadraticCoefficient(x, 6.0) # 线性项4y直接设置系数 objective.SetCoefficient(y, 4.0) objective.SetMaximization() # 求解问题 status = solver.Solve() if status == pywraplp.Solver.OPTIMAL: print('Solution:') print('Objective value =', solver.Objective().Value()) print('x =', x.solution_value()) print('y =', y.solution_value()) else: print('The problem does not have an optimal solution.') print('\nAdvanced usage:') print('Problem solved in %f milliseconds' % solver.wall_time()) print('Problem solved in %d iterations' % solver.iterations()) QuadraticProgrammingExample()
关键说明
- 为什么不能直接用
x*x?OR-Tools的NumVar对象仅重载了线性运算(加减、数乘),不支持变量间的乘法,否则会生成非合法表达式对象; - 求解器限制:GLOP仅支持线性规划,必须切换到SCIP、CPLEX等支持二次规划的求解器;
- 二次项系数逻辑:OR-Tools的二次目标函数框架为
0.5*Σ(Q[i][j]x[i]x[j]) + Σ(c[i]x[i]),因此要得到3x²,需将x的二次系数设为6,确保最终计算结果与预期一致。
内容的提问来源于stack exchange,提问作者lelorrain7
相关产品推荐
相关产品推荐

