【问题标题】:cplex constraint function of a variable变量的复杂约束函数
【发布时间】:2012-07-18 01:54:00
【问题描述】:

我有一个 优化变量 x 和一个常数 y。

我想表达一个约束

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

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

【问题讨论】:

    标签: c++ linear-programming cplex


    【解决方案1】:

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

    f(x) <= y
    

    cplex->getValue(x) 是一个双精度,所以 f(x) getValue() 仅在您有解决方案后才可用,因此它永远不应该成为您模型的一部分,除非您正在迭代解决它。要获得 IloRange,您需要重写 f(x) 以接受 IloNumVar 作为其参数并返回 IloExpr。例如,如果你有类似的东西

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

    你需要一个版本

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

    那你就可以写了

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

    如果您使用 cplex(或任何线性规划求解器),f(x) 只能是线性函数或凸二次函数。

    【讨论】:

    • 首先,你是我的英雄:它失败了,因为 getValue 不能成为模型的一部分,并且将 f(x) 重写为“cplex”版本是要走的路,谢谢!我认为这很痛苦,因为 f 是不平凡的,现在我必须使用他们所有的符号来重写它,但是 O 好。就线性而言,CPLEX(至少从 12.4 开始)现在支持 MILP 编程,具有整数和二进制约束。约束可能必须是整数线性或整数二次,但我认为它不必是凸的,因为如果 x 是二进制或整数约束,它甚至可能不是连续的。
    • 您提到“除非我反复解决它”。有没有办法可以迭代地解决它而不必重写 f?也许是在迭代求解的模型中使用 getValue() 的指针?
    • @Tommy 如果您想使用优化的结果来制定不同的解决方案,您将迭代地解决问题。这对你的情况没有帮助。为避免代码的多个版本,您可以使用 C++ 模板。
    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    相关资源
    最近更新 更多