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


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;
}

 

你可能感兴趣的:(c++)