CPLEX 和模运算

问题描述 投票:0回答:1

我使用 CPLEX 库来解决我的问题。就我而言,答案中的项目数必须为奇数。 所以我需要执行以下操作:

IloExpr exp(env);
for (int i = 0; i < N; i++)
    exp += X[i];
Model.add(exp == 1 || exp == 3 || exp == 5 || ext == 7 || ...etc)

很明显,Model.add 的行应该如下所示:

Model.add(exp % 2 != 0);

但我收到一个错误:

Error C2678 binary '%': no operator found which takes a left-hand operand of type 'IloExpr' (or there is no acceptable conversion)

我有一个想法,有必要重载运算符%。为此,我尝试创建自己的类:

class NewIloExpr : public IloExpr
{
public:
    NewIloExpr& operator%(const IloNum& val)
    {
        // some code
        return *this;
    }
};

但我不知道在重载实现中要写什么(代替注释)才能使其工作。有人对此有任何想法,或者也许有其他解决方案吗?

c++ cplex
1个回答
0
投票

从 CPLEX 等求解器的工作方式可以看出,使用 mod 等运算符效果不佳,因为它们不是线性函数。此外,使用 is_odd() 这样的简单测试也无助于搜索过程,因为 CPLEX 可能会探索许多偶数值,然后拒绝它们。查找仅包含奇值变量的解决方案的一个更好的技巧是定义另一个变量,该变量是一个普通的 IloIntVar 或类似的变量(我们称之为 v),其值为 0...N,并定义一个值为 1+2* 的表达式v.然后表达式将采用值 1,3,5,... 等,这是您想要的值集。

尝试创建另一个 IloIntVar 和这样的表达式,并添加一个约束,即您的 exp 表达式必须等于我们新构造的表达式,该表达式只能采用奇数值。

© www.soinside.com 2019 - 2024. All rights reserved.