Java调用cplex求解LP问题

2 篇文章 0 订阅
2 篇文章 0 订阅

Java调用cplex求解通用规划模型(包括整型和非整型线性规划),一个简单的模型例子如下

Min \quad z= 2x_1-3x_2-2x_3-3x_4\\ s.t. \quad x_1+x_2+x_3+x_4\geqslant 2,\\ \qquad\qquad 10x_1+5x_2+3x_3+4x_4\leqslant 10,\\ x_1\geqslant 0,\\ x_{2},x_{3},x_{4}=\{0,1\}.

利用求解Java调用cplex,进行求解代码如下:

import ilog.concert.IloException;

import ilog.concert.IloNumVar;

import ilog.cplex.IloCplex;

 

public class LP1 {

 

	public static void main(String[] args) {

		try {

			IloCplex cplex = new IloCplex(); // creat a model

			

			//double[] lb = {0.0, 0.0, 0.0,0.0};

			//double[] ub = {Double.MAX_VALUE, 1,1,1};

			//IloNumVar[] x = cplex.numVarArray(4, lb, ub);//也是一种定义变量的方式
			
	        //Define the variables one-by-one,这种方法更方便整型和非整变量定义
            IloNumVar[] x = new IloNumVar[4];
            x[0] = cplex.numVar(0.0, Double.MAX_VALUE, "x0");//这个是连续型变量
            x[1] = cplex.intVar(0, 1, "x1");//定义三个整型变量
            x[2] = cplex.intVar(0, 1, "x2");
            x[3] = cplex.intVar(0, 1, "x3");
			

			double[] objvals = {2, -3, -2,-3};//目标函数的系数定义

			cplex.addMinimize(cplex.scalProd(x, objvals));//目标函数是求最小值,最大值修改成addMaximize即可

			

			double[] coeff1 = {-1.0, -1.0, -1.0,-1.0};//逐一增加约束的系数,这是第一个,都标准化约束如=<样式

			double[] coeff2 = {10, 5, 3,4};
			cplex.addLe(cplex.scalProd(x, coeff1), -2);//约束右边常数值

			cplex.addLe(cplex.scalProd(x, coeff2), 10);

			

			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]);//输出变量取值
				}
                
			}

			cplex.end();

			

		} catch (IloException e) {

			System.err.println("Concert exception caught: " + e);

		}

	}

}

最后计算结果如下:

综上,这个方法的优点:比较简单,可扩展性比较高,适用于不同的规划问题(包括连续型,整型变量),缺点:当约束/变量/目标函数比较庞大/复杂时,这种方法可能效率较低。

参考:https://blog.csdn.net/robert_chen1988/article/details/78678289https://blog.csdn.net/rechardchen123/article/details/79275950(谢谢前辈的贡献)。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值