如何在Xpress中正确定义二次约束?社区版报错求助
问题分析与解决方案
错误原因
你遇到的?864 Error是因为Xpress不允许二次约束使用等式(==),仅支持小于等于(L型)或大于等于(G型)的二次约束。而你的约束被识别为二次约束,核心问题是xp.Dot(M[i,j,:], weights)生成了变量相乘的二次项——这说明M[i,j,:]里包含了决策变量,而非预先定义的常数0-1矩阵元素。
你的目标是将X分解为0-1矩阵的凸组合,标准形式应为:
$$X = \sum_{k} w_k \cdot M_k$$
其中$M_k$是已知的0-1矩阵,$w_k$是权重变量(满足$w_k \geq 0$且$\sum w_k = 1$)。此时约束应该是线性等式,而非二次约束。
修正步骤
固定
M为常数数组
确保M是提前定义的常数三维数组,M[i,j,k]对应第k个0-1基矩阵的(i,j)位置值(0或1),不能包含任何决策变量。替换
xp.Dot为线性求和表达式
避免因Dot函数误处理变量组合生成二次项,改用显式线性求和:equations = [] # 假设num_bases是基矩阵的数量 for i in agents: for j in objects: # 构建线性表达式:sum(基矩阵元素 * 权重变量) linear_expr = xp.Sum(M[i,j,k] * weights[k] for k in range(num_bases)) equation = linear_expr == X[i,j] equations.append(equation) agents_assining.addConstraint(equations)补充凸组合的必要约束
别忘了给权重变量添加凸组合的核心约束:# 权重非负 agents_assining.addConstraint([weights[k] >= 0 for k in range(num_bases)]) # 权重和为1 agents_assining.addConstraint(xp.Sum(weights) == 1)
额外检查
- 如果你的问题需要同时求解基矩阵$M_k$(而非固定),那原建模方式有误,需重新设计为混合整数规划(MIP),此时要将$M_k$的元素设为0-1变量,再构建线性约束。
- 确认
agents_assining的问题类型为线性规划(LP)或混合整数规划(MIP),避免误用非线性模式。
内容的提问来源于stack exchange,提问作者Davide Trono
相关产品推荐
相关产品推荐

