使用java+cplex实现对整数规划问题进行求解,使用or-tools的解决方法可以查看这篇文章【or-tools求解整数规划】。
问题介绍
数据定义
// 数据参数定义
class Data{
// 目标系数
double[] objectiveCoefficient={7, 8, 2, 9, 6};
// 约束系数
double[][] constraintCoefficient={{5, 7, 9, 2, 1}, {18, 4, -9, 10, 12}, {4, 7, 3, 8, 5}, {5, 13, 16, 3, -7}};
// 约束值
double[] constraintValue={250, 285, 211, 315};
// 变量数量
int variableNumber=5;
// 约束数量
int constrainNumber=4;
}
问题建模
//使用cplex求解整数规划
public class IntegerProgrammingDemo {
// 定义数据
Data data;
public IntegerProgrammingDemo(Data data){
this.data=data;
}
// 定义cplex内部对象
IloCplex model;
// 定义变量
public IloNumVar[] x;
// 求解函数
public void solve() throws IloException{
if(model.solve()==false){
// 模型不可解
System.out.println("模型不可解");
return;
}
else{
System.out.println("目标值:"+model.getObjValue());
for(int i=0;i<data.variableNumber;i++){
System.out.println("变量值x["+(i+1)+"]:"+model.getValue(x[i]));
}
}
}
// 根据数学模型建立求解模型
public void BuildModel() throws IloException{
// model
model = new IloCplex();
model.setOut(null);
// variables
x = new IloNumVar[data.variableNumber];
// 定义cplex变量x的数据类型及取值范围
for(int i=0;i<data.variableNumber;i++){
x[i]=model.numVar(0,1e15, IloNumVarType.Int,"x["+i+"]");
}
// 设置目标函数
IloNumExpr obj = model.numExpr();
for(int i=0;i<data.variableNumber;i++){
obj=model.sum(obj,model.prod(data.objectiveCoefficient[i],x[i]));
}
model.addMaximize(obj);
// 添加约束
for(int k=0;k<data.constrainNumber;k++){
IloNumExpr expr = model.numExpr();
for(int i=0;i<data.variableNumber;i++){
expr=model.sum(expr,model.prod(data.constraintCoefficient[k][i],x[i]));
}
model.addLe(expr,data.constraintValue[k]);
}
}
问题求解
public static void main(String[] args)throws IloException{
Data data =new Data();
IntegerProgrammingDemo lp=new IntegerProgrammingDemo(data);
lp.BuildModel();
lp.solve();
}
求解结果
========================================
今天到此为止,后续记录其他cplex技术的学习过程。
以上学习笔记,如有侵犯,请立即联系并删除!