2012-07-18 53 views
1

我有一个优化变量 x和一个常数y。变量的cplex约束函数

我想表达一个约束

f(x) <= y. 

我试图做

27: IloRange rng = (f(cplex->getValue(x)) <= y); 
28: model.add(rng); 

但我得到的错误

cplex.cpp:27: error: conversion from 'bool' to non-scalar type 'IloRange' requested 

有人可以帮我写这种形式的约束?

回答

1

首先,线性规划不可能实现严格的不等式。但是,可以表达

f(x) <= y 

cplex->的getValue(x)是一个双因此f(x)的< = y是一个布尔值。无论如何,cplex-> getValue()只有在你有解决方案后才可用,所以它不应该是你模型的一部分,除非你正在迭代地解决它。要获得IloRange,您需要重写f(x)以接受IloNumVar作为参数并返回IloExpr。例如,如果您有类似

double f(double x) {return 2*x;} 

你需要一个版本

IloExpr f(IloNumVarx) {return 2*x;} 

然后你就可以。如果你正在使用CPLEX(或任何线性规划求解)写

IloRange rng = (f(x) <= y); 

, f(x)只能是线性函数或凸二次函数。

+0

首先,你是我的英雄:它是失败的,因为getValue不能成为模型的一部分,并且将f(x)重写为“cplex”版本是要走的路,谢谢!我认为这是一种痛苦,因为f是非常平凡的,现在我必须用它们的所有符号重写它,但是O很好。就线性而言,CPLEX(至少为12.4)现在支持MILP编程,具有整数和二进制约束。约束可能必须是整数线性或整数二次的,但我不认为它必须是凸的,因为如果x是二进制或整数约束,它甚至可能不连续。 – Tommy 2012-07-18 05:22:53

+0

您提到“除非我反复解决它”。有没有办法我可以迭代解决它,而不必重写f?也许是在迭代求解的模型中使用getValue()的指针? – Tommy 2012-07-18 05:26:17

+0

@Tommy如果您想使用优化的结果来制定不同的解决方案,您可以迭代地解决问题。这对你的情况没有帮助。为了避免多个版本的代码,您可以使用C++模板。 – 2012-07-18 14:00:15