2013-03-19 5 views
1

Я новичок в использовании cplex, и я пытаюсь найти некоторую информацию в Интернете, но не нашел ясных вещей, которые могли бы помочь мне в моей проблеме.Переменная многомерного решения Cplex C++

У меня Р [к] К будет равен 1 до 4

и у меня есть решение переменной х [I] [к] должно быть равно 0 или 1 (также р [K])

я между 1 до 5

Сейчас я, как этот

IloEnv env; 
    IloModel model(env); 
    IloNumVarArray p(env); 
    p.add(IloNumVar(env, 0, 1)); 
    p.add(IloNumVar(env, 0, 1)); 
    p.add(IloNumVar(env, 0, 1)); 
    IloIntVar x(env, 0, 1); 

    model.add(IloMaximize(env, 1000 * p[1] + 2000 * p[2] + 500 * p[3] + 1500 * p[4])); 

    for(int k = 1; k <= 4; k++){ 
    for(int i = 1; i <= 5; i++){ 
     model.add(x[i][k] + x[i][k] + x[i][k] + x[i][k] + x[i][k] => 2 * p[k];); 
    }} 

петля должна сделать что-то вроде этого:

x [1] [1] + x [2] [1] + x [3] [1] + x [4] [1] + x [5] [1] => 2 * p [1];

x [1] [2] + x [2] [2] + x [3] [2] + x [4] [2] + x [5] [2] => 2 * p [2 ];

x [1] [3] + x [2] [3] + x [3] [3] + x [4] [3] + x [5] [3] => 2 * p [3 ];

x [1] [4] + x [2] [4] + x [3] [4] + x [4] [4] + x [5] [4] => 3 * p [4 ];

, но я далеко от этого результата.

У кого-нибудь есть идеи?

Благодаря

ответ

1

Вы, вероятно, хотите использовать IloNumExpr

for(int k = 0; k < 4; k++){ 
    IloNumExpr sum_over_i(env); 
    for(int i = 0; i < 5; i++){ 
     sum_over_i += x[i][k]; 
    } 
    model.add(sum_over_i >= 2 * p[k];); 
} 

Вы также должны объявить х в качестве 2-мерного массива.

IloArray x(env, 4); 
for (int k = 0; k < 4; ++k) 
     x[k] = IloIntVarArray(env, 5, 0, 1); 

Кроме того, в C++ индексы массива от 0 до размера-1, а не от 1 до размера. Ваша цель должна быть написана

model.add(IloMaximize(env, 1000 * p[0] + 2000 * p[1] + 500 * p[2] + 1500 * p[3])); 
1

Usertfwr уже дал хороший ответ, но я хотел бы дать еще один вариант решения, которое могло бы помочь вам код приложения CPLEX в более общем виде. Во-первых, я предлагаю вам использовать текстовый файл для хранения всех данных (коэффициентов целевой функции), которые будут переданы в программу. В вашем случае, вы только должны скопировать буквально следующую матрицу, как данные в блокнот и назовите его «coef.dat»:

[1000, 2000, 500, 1500]

Теперь приходит полный код, сообщите мне, если у вас возникли трудности с пониманием любого заявления:

#include <ilcplex/ilocplex.h> 
    #include <fstream> 
    #include <iostream> 
    ILOSTLBEGIN 

    int main(int argc, char **argv) { 
    IloEnv env; 
    try { 
     const char* inputData = "coef.dat"; 

     ifstream inFile(inputData); // put your data in the same directory as your executable 
     if(!inFile) { 
      cerr << "Cannot open the file " << inputData << " successfully! " <<endl; 
      throw(-1); 
     } 

     // Define parameters (coef of objective function) 
     IloNumArray a(env); 

     // Read in data 
     inFile >> a; 

     // Define variables 
     IloBoolVarArray p(env, a.getSize()); // note that a.getSize() = 4 
     IloArray<IloBoolVarArray> X(env, 5); // note that you need a 5x4 X variables, not 4x5 
     for(int i = 0; i < 5; i++) { 
      X[i] = IloBoolVarArray(env,4); 
     } 

     // Build model 
     IloModel model(env); 

     // Add objective function 
     IloExpr objFun (env); 
     for(int i = 0; i < a.getSize(); i++){ 
      objFun += a[i]*p[i]; 
     } 

     model.add(IloMaximize(env, objFun)); 

     objFun.end(); 

     // Add constraints -- similar to usertfwr’s answer 
     for(int i = 0; i < 4; k++){ 
      IloExpr sumConst (env); 
      for(int j = 0; j < 5; i++){ 
        sumConst += x[j][i]; 
      } 
      // before clearing sumConst expr, add it to model 
      model.add(sumConst >= 2*p[i]); 
      sumConst.end(); // very important to end after having been added to the model 
     } 

     // Extract the model to CPLEX 
     IloCplex cplex(mod); 

     // Export the LP model to a txt file to check correctness 
     //cplex.exportModel("model.lp"); 

     // Solve model 
     cplex.solve(); 

    } 
    catch (IloException& e) { 
     cerr << "Concert exception caught: " << e << endl; 
    } 
    catch (...) { 
      cerr << "Unknown exception caught" << endl; 
    } 
     env.end(); 
} 
+0

Что вы имеете в виду с 'ILOSTBEGIN'? –

+0

Этот макрос определен в ilconcert/ilosys.h как «использование пространства имен std». Таким образом, вы сможете запускать приложение с STL на C++. – Deanna1125

Смежные вопросы