type ilp_cplex() {
//输入
//元素个数为n的目标的集合 T int t[n + 1];
//元素个数为m的组合的集合 C
//每个组合 C_j对应的距离 d_j
int i, j;
//声明环境
IloEnv env;
//建立模型
IloModel model(env);
//变量数组
IloNumVarArray var(env);
//条件2 x = 0 1
for (int j = 1; j <= numofc; ++j)
{
//var 下标从0开始
var.add(IloNumVar(env, 0.0, 1.0, ILOINT));
}
//函数表达式
IloExpr exp(env);
for (i = 1;i <= numofc;++i)
{
exp += distc[i] * var[i - 1];
}
//添加对象 最优解
IloObjective obj(IloMinimize(env, exp));
//为模型添加对象
model.add(obj);
//bof目标i所在的组合Cj至少被选一次
//clock_t start, finish;
//start = clock();
for (i = 1;i <= n;++i)
{
IloExpr exp_tmp(env);
for (j = 1;j <= numofc;++j)
{
if (c[j].first <= i && c[j].second >= i)
{
exp_tmp += var[j - 1];
}
}
model.add(exp_tmp >= 1);
exp_tmp.end();
}
//finish = clock();
//cout << "ILP 2for" << int(finish - start) << endl;
//eof目标i所在的组合Cj至少被选一次
//对模型进行求解
IloCplex cplex(model);
if (!cplex.solve())
{
env.error() << "Failed to optimize LP." << endl;
}
else {
获取解的信息
cout << "ILP_CPLEX Result:";
获取解对象的结果解值
ILP_CPLEX = type(cplex.getObjValue());
cout << ILP_CPLEX << endl;
IloNumArray vals(env); //用来取出变量对象的解,形式为array数组
cplex.getValues(vals, var); //把变量对象的解复制给vals 输出时形式为[xxx,xxx,xxx] xxx指的是变量解的值
set<int>::iterator iter;
for (int i = 0;i < vals.getSize();++i)
{
if (vals[i] == 1)
{
cout << (i + 1) << "-->";
}
}
cout << endl;
}
env.end();
return ILP_CPLEX;
}