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

如何在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$)。此时约束应该是线性等式,而非二次约束。

修正步骤

  1. 固定M为常数数组
    确保M是提前定义的常数三维数组,M[i,j,k]对应第k个0-1基矩阵的(i,j)位置值(0或1),不能包含任何决策变量。

  2. 替换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)
    
  3. 补充凸组合的必要约束
    别忘了给权重变量添加凸组合的核心约束:

    # 权重非负
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:15:43