CPLEX约束逻辑值获取:能否传入常量数组替代变量数组?
CPLEX约束函数适配常量数组验证的解决方案
你目前有一个用于构建CPLEX约束的C++函数,定义如下:
IloConstraint f(IloInt i, IloInt j, IloNumVarArray x) { IloConstraint constr; constr = (x[j]-x[i] >= 15) && (x[j]-x[i] <= 20); return constr; }
希望传入IloNumArray类型的常量数组,直接获取约束的逻辑值(即判断常量是否满足约束条件),类似这样的调用:
IloNumArray a(env, 5, 1, 1, 1, 1, 1); IloConstraint c = f(1,2,a); cout<<c.logicalValue();
直接按上述方式调用是行不通的,原因有两点:
- 函数
f的参数是IloNumVarArray(变量数组),和IloNumArray(数值数组)类型不匹配,无法直接传入; IloConstraint是CPLEX用于建模的对象,依赖决策变量存在,不能用常量数组构造,且logicalValue()方法是用来获取已求解模型中约束的满足状态,不是直接计算常量的逻辑值。
你可以通过以下两种方式实现需求:
方案1:单独编写验证函数
直接写一个针对数值数组的函数,跳过CPLEX约束对象,直接计算逻辑值:
bool checkConstraint(IloInt i, IloInt j, const IloNumArray& a) { IloNum diff = a[j] - a[i]; return (diff >= 15) && (diff <= 20); }
调用方式:
IloNumArray a(env, 5, 1, 1, 1, 1, 1); cout << checkConstraint(1, 2, a) << endl; // 输出0(false)
方案2:抽离核心逻辑实现复用
如果想保留原有的约束构建逻辑,同时支持数值验证,可以把约束的核心判断逻辑抽离出来,用模板函数实现复用:
// 通用的约束逻辑计算函数 template<typename ArrayType> bool evaluateConstraint(IloInt i, IloInt j, const ArrayType& arr) { auto diff = arr[j] - arr[i]; return (diff >= 15) && (diff <= 20); } // 原有的CPLEX约束构建函数 IloConstraint f(IloInt i, IloInt j, IloNumVarArray x) { return (x[j]-x[i] >= 15) && (x[j]-x[i] <= 20); }
验证时调用通用函数:
IloNumArray a(env, 5, 1, 1, 1, 1, 1); cout << evaluateConstraint(1, 2, a) << endl;
这样既保留了原有的建模函数,又能方便地验证常量是否满足约束条件。
内容的提问来源于stack exchange,提问作者HD2000
相关产品推荐
相关产品推荐

