VS2017使用cplex求解01规划代码分析

原文链接: https://blog.csdn.net/LINZHENYU1996/article/details/88041840
在这里插入代码片

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::iterator iter;
	for (int i = 0;i < vals.getSize();++i)
	{
		if (vals[i] == 1)
	{
			cout << (i + 1) << "-->";
		}
	}
	cout << endl;
}
env.end();
return ILP_CPLEX;

}

你可能感兴趣的:(cplex)