Cplex安装
论文需要使用线性规划,推荐使用Cplex。
环境配置
编译器使用是vs2017,使用的是Cplex C++ 12.9的api,可以使用学校的邮箱申请使用无阉割版。
配置过程
- 参考
- 导入
#include <ilcplex/ilocplex.h>
看是否可以编译。 - 宏命令
ILOSTLBEGIN
,可以调用C++的STL。 - 调试过程,选择解决方案配置
release
以及解决方案平台模式x64
。
调试问题
- 描述:
error C2760: 语法错误: 意外的令牌“标识符”,预期的令牌为“;”
解决方法:配置属性 > C/C++ > 语言 > 符合模式改成否
简易使用教程
问题描述:求无权无向图的最小顶点覆盖
对于网络
G
(
V
,
E
)
G(V,E)
G(V,E) 线性规划方程:
m
i
n
∑
i
=
1
,
.
.
.
,
n
a
i
1
≤
a
i
+
a
j
≤
2
,
(
i
,
j
)
∈
E
0
≤
a
i
≤
1
,
i
∈
V
,
i
=
1
,
.
.
.
,
n
.
min\sum_{i=1,...,n}a_{i} \\ 1\le a_{i}+a_{j} \le 2,(i,j)\in E \\0\le a_{i}\le1,i\in V , i=1,...,n.
mini=1,...,n∑ai1≤ai+aj≤2,(i,j)∈E0≤ai≤1,i∈V,i=1,...,n.
代码
void VertexCoverLP() {
IloEnv env;//定义环境
IloModel model(env);//定义模型
IloIntVar Ud(env, 0, SIZE);//定义Ud的范围,我这里整形运算
IloIntVarArray a(env, SIZE, 0, 1);//定义变量a[1..n],范围[0,1]为整数
IloRangeArray constraints(env, EdgeNum, 1, 2);//添加边约束,范围为[1,2]
model.add(constraints);//添加约束
IloExpr expr=Ud;//IloExpr 一定要初始化
for (int i = 0; i < SIZE; i++) {
expr += a[i];
}
model.add(IloMinimize(env, expr));//添加最小约束
for (int i = 0; i < EdgeSIZE; i++) {//添加边约束
IloExpr expr = a[edges[i].head] + a[edges[i].tail];
constraints[i].setExpr(expr);
}
IloCplex Solver(model);//定义解题器
Solver.setOut(env.getNullStream());//不输出求解日志
Solver.solve();
for (int i = 0; i < SIZE; i++) {
if (Solver.getValue(a[i]) == 1) vertices[i].state = 0;
else vertices[i].state = 1;
}
env.end();
}