如何访问矩阵形式的所有变量的解决方案值?

时间:2012-04-25 22:34:13

标签: c++ matrix cplex

(注意:这个问题与IBM's ILOG CPLEX C ++ API有关,大约2007年的文档是通过HTTP here的pdf,以及“版本12”的当前材料{{3 }})

我有一个矩阵变量,我想将它们的值传递给矩阵参数。 这就是我所做的:

typedef IloArray<IloNumArray> NumMatrix;
typedef IloArray<IloBoolVarArray> BoolVarMatrix;

NumMatrix ystar(env,I);
for(IloInt i = 0; i < I; i++){
    ystar[i] = IloNumArray(env, T);
}

BoolVarMatrix y(env,I);
for(IloInt i = 0; i < I; i++){
    y[i] = IloBoolVarArray(env, T);
}

for(IloInt i = 0; i < I; i++)
    cplex_master.getValues(ystar[i],y[i]);

但显然getValues()仅适用于IloNumVarArray。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

猜猜游戏时间! :-)我只是猜测cplex_master类型为IloCplex

你有两个刚刚初始化的二维矩阵,一个是“布尔变量”,另一个是“非可变浮点数”。看起来你想解决y中的布尔变量,并将结果表示为ystar中的浮点数。

  1. 我不确定解决彼此的空白矩阵是什么,所以我只是假装它们在你的实际代码中不是空白

  2. 我不知道你的场景是如何将布尔矩阵逐行转换为浮点数,但也许这样做是合法的

  3. 无论如何,IloCplex提供了getValues()的四种变体,所有变体似乎都在两个参数上运行,它们命名为 var val

    public void getValues(const IloIntVarArray var, IloNumArray val) const
    public void getValues(IloNumArray val, const IloIntVarArray var) const
    public void getValues(const IloNumVarArray var, IloNumArray val) const
    public void getValues(IloNumArray val, const IloNumVarArray var) const
    

    他们都有类似的文件,其效果如下:

      

    此方法将由数组var指定的整数变量的解决方案值   进入数组val。数组val的大小调整为与数组var相同的大小,并且val [i]   将包含变量var [i]的解决方案值。

    有一个不寻常的设计选择,因为 val 正在被修改,尽管它是通过值传递的。这是非C ++风格。如果你正在处理整数,比如说,并编写了如下代码:

    void myCopy(const int source, int destination) {
        /* what could go here? */
    }
    
    void someFunction() {
       int a = 10;
       int b;
       myCopy(a, b);
    }
    

    ...没有办法用该原型编写myCopy()例程。目标按值传递,因此myCopy()无法返回并更改调用方中b的值。正确的C ++可以通过使用指针或引用(通过&)来实现:

    void myCopy(const int source, int& destination) {
        destination = source;
    }
    

    所以这个CPLEX C ++的东西在引擎盖下使用某种技巧,我会假设通过那个神秘的env参数...以另一种方式做事。当人们编写奇怪的语言包装并且不知道习语时,它会遇到典型的情况。另一篇文章在这里非常关键:

    Is it just me or could the Cplex Concert API use some improvements?

    您的问题可能就是IloCplex未将IloBoolVarArray作为 var IloNumArray val 的原因我很乐意将IloIntVarArray作为 var IloNumArray val 。毕竟,IloBoolVarArray继承自IloIntVarArray ...不应该可以在同一个广告位中使用吗?

    getValue()方法的这些按值传递语义会抑制本来可能有效的自然继承。传递指针或引用时,只能传递派生类来代替基类。所以不要继续这样做。

    如果你真的想使用IloBoolVarArray代替IloIntVarArray,那么我猜你必须经历一个中级:

    typedef IloArray<IloNumArray> NumMatrix;
    typedef IloArray<IloBoolVarArray> BoolVarMatrix;
    typedef IloArray<IloIntVarArray> IntVarMatrix;
    
    NumMatrix ystar(env,I);
    for(IloInt i = 0; i < I; i++){
        ystar[i] = IloNumArray(env, T);
    }
    
    BoolVarMatrix y(env,I);
    for(IloInt i = 0; i < I; i++){
        y[i] = IloBoolVarArray(env, T);
    }
    
    IntVarMatrix yint(env,I);
    for(IloInt i = 0; i < I; i++){
        for(IloInt t = 0; t < T; t++) {
            yint[i][t] = y[i][t];
        }
    }
    
    for(IloInt i = 0; i < I; i++)
        cplex_master.getValues(ystar[i],yint[i]);
    

    真正的问题可能是使用IloBoolIloInt是否真的值得。看起来像是事后的想法:

      

    此类型定义表示Concert Technology中的布尔值。那些价值观是   IloTrue和IloFalse。事实上,布尔值是IloInt类型的整数。   IloFalse为0(零),IloTrue为1(一)。这种类型预计内置   建议用于标准C ++的bool类型。通过使用此类型,您可以确定   您的应用程序的Concert Technology组件将在没有这方面移植   不同硬件平台上的源代码变化。

    数组似乎没有求解器中的一流处理,但个别变量确实如此:

      

    IloBoolVar的一个实例由IloSolver提取(在ILOG中有记录   求解器参考手册)作为类IlcBoolVar的一个实例(也记录在案   在ILOG求解器参考手册中)。

         

    IloBoolVar的一个实例由IloCplex提取(在ILOG中有记录   CPLEX参考手册)作为表示Bool类型的数字变量的列   有IloBoolVar指定的界限

    我认为完全避免它是最好的答案。

答案 1 :(得分:1)

IloCplex :: getValue可用于任何IloNumVar。返回值只是一个double,因此您不限于Concert数据结构。表达式y [i] [t]给出一个IloNumVar。

   for(IloInt i = 0; i < I; i++)
        for (IloInt t = 0; t < T; ++t)
        ystar[i][t] = cplex_master.getValue(y[i][t]);
相关问题