基础编程(一)-利用Cplex求解LP线性规划问题
一、教材及例题说明
本文例题来源于清华大学出版的运筹学(第三版)P20例题6,课本已经讲解了利用单纯形法计算的方法,本文主要讲解如何用程序求解问题。
二、Cplex基本知识补充
1、程序基本构成,分为以下5个部分:
import ilog.concert.*;
import ilog.cplex.*;
public class LP {
public static void main(String[] args) {
try {
// 1、定义模型
IloCplex cplex = new IloCplex();
// 2、定义变量
// 3、定义目标函数
// 4、定义约束条件
// 5、求解、获得并展示结果
catch(IloException e) {
System.err.println("Concert exception caught:" + e);
}
2、变量定义方法
//1.定义单个变量
//1.1 实数变量 0≤x
IloNumVar x= cplex.numVar(0, Double.MAX-VALUE);
//1.2 整型变量 0≤x≤10,且为整数
IloIntVar x= cplex.intVar(0, 10);
//2.定义一维数组变量,变量取值范围相同
// 2.1 实数型变量 0≤x1,x1,x3
IloNumVar[] x = cplex.numVarArray(3, 0.0, Double.MAX-VALUE);
// 2.2 整型变量 0≤x1,x1,x3≤10,且为整数
IloIntVar[] x = cplex.intVarArray(3, 0, 10);
//3.定义一维数组变量,变量取值范围不同
// 3.1 实数型变量
double[] lb = {0, 0, 0};
double[] up = {40, Double.MAX_VALUE, Double.MAX_VALUE};
IloNumVar[] x =cplex.numVarArray(3, lb, up);
// 3.2 整型变量
double[] lb = {0, 0, 0};
double[] up = {10, 20, 30};
IloIntVar[] x = cplex.intVarArray(3, lb, up);
// 注意:在实现例题求解的时候,需要自己根据例题中的变量情况选择合适的定义方法,并根据变量的取值范围修改上界和下界的数值
3、定义目标函数
// 定义目标函数系数
double[] objvals = {2, 3, 0, 0, 0};
//定义目标函数
cplex.addMaximize(cplex.scalProd(x, objvals));
4、定义约束条件
//定义约束条件系数
double[] coeff1 = {1, 2, 1, 0, 0};
double[] coeff2 = {4, 0, 0, 1, 0};
double[] coeff3 = {0, 4, 0, 0, 1};
//定义约束条件
cplex.addLe(cplex.scalProd(x, coeff1), 8);
cplex.addLe(cplex.scalProd(x, coeff2), 16);
cplex.addLe(cplex.scalProd(x, coeff3), 12);
5、求解问题并展示结果
if(cplex.solve()) {
cplex.output().println("Solution status = " + cplex.getStatus());
cplex.output().println("Solution value = " + cplex.getObjValue());
double[] val = cplex.getValues(x);
for (int j = 0; j < val.length; j++) {
cplex.output().println("x" + (j+1) + " = " + val[j]);
}
三、例题6完整求解程序
import ilog.concert.*;
import ilog.cplex.*;
public class LP {
public static void main(String[] args) {
try {
// 1、定义模型
IloCplex cplex = new IloCplex();
// 2、定义参数变量
double[] lb = {0, 0, 0, 0, 0};
double[] up = {Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE};
IloNumVar[] x =cplex.numVarArray(5, lb, up);
// 3、定义目标函数
// 定义目标函数系数
double[] objvals = {2, 3, 0, 0, 0};
//定义目标函数
cplex.addMaximize(cplex.scalProd(x, objvals));
// 4、定义约束条件
//定义约束条件系数
double[] coeff1 = {1, 2, 1, 0, 0};
double[] coeff2 = {4, 0, 0, 1, 0};
double[] coeff3 = {0, 4, 0, 0, 1};
//定义约束条件
cplex.addLe(cplex.scalProd(x, coeff1), 8);
cplex.addLe(cplex.scalProd(x, coeff2), 16);
cplex.addLe(cplex.scalProd(x, coeff3), 12);
// 5、求解、获得并展示结果
if(cplex.solve()) {
cplex.output().println("Solution status = " + cplex.getStatus());
cplex.output().println("Solution value = " + cplex.getObjValue());
double[] val = cplex.getValues(x);
for (int j = 0; j < val.length; j++) {
cplex.output().println("x" + (j+1) + " = " + val[j]);
catch(IloException e) {
System.err.println("Concert exception caught:" + e);