我是新手使用cplex,我试图在互联网上找到一些信息,但没有找到明确的东西来帮助我解决问题。
我的P [k] k将等于1到4
我有一个决策变量x [i] [k]必须等于0或1(也是p [k])
i介于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] =&gt; 2 * p [1];
x [1] [2] + x [2] [2] + x [3] [2] + x [4] [2] + x [5] [2] =&gt; 2 * p [2];
x [1] [3] + x [2] [3] + x [3] [3] + x [4] [3] + x [5] [3] =&gt; 2 * p [3];
x [1] [4] + x [2] [4] + x [3] [4] + x [4] [4] + x [5] [4] =&gt; 3 * p [4];
但我离这个结果很远。
有没有人有想法?
由于
答案 0 :(得分: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]; );
}
您还需要将x声明为二维数组。
IloArray x(env, 4);
for (int k = 0; k < 4; ++k)
x[k] = IloIntVarArray(env, 5, 0, 1);
此外,在c ++中,数组索引从0到size-1,而不是1到size。你的目标应该是
model.add(IloMaximize(env, 1000 * p[0] + 2000 * p[1] + 500 * p[2] + 1500 * p[3]));
答案 1 :(得分: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();
}