添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

基础编程(一)-利用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);