一、问题
前情提要:实习中遇到了自动配板的最优化配置问题,在这里简单总结整理下。
具体描述:给定一次多元多项不等式,求满足条件的一组解。
举个例子,给定不等式:
6 x + 7 y + 8 z < = 15 6x+7y+8z<=15 6x+7y+8z<=15
0 < = x < = 2 0<=x<=2 0<=x<=2
0 < = y < = 1 0<=y<=1 0<=y<=1
0 < = z < = 1 0<=z<=1 0<=z<=1
在上述条件的约束下,求一组整数解,满足max { 6x+7y+8z }。
二、解决
2.1 方法1:Cplex工具求解
1、Cplex简介
Cplex是IBM公司开发一款商业版的优化引擎。当然也有免费版,不过有规模限制,不能求解规模过大问题。
2、优势
- 解决一些非常困难的行业问题;
- 求解速度非常快;
- 提供超线性加速功能的优势。
Cplex加持下,使得Matlab对于大规模问题及线性规划效率得到飞跃性提升。
3、安装
-
包—百度云
链接:https://pan.baidu.com/s/1AQZlSwxaYMmw4-ReXhl1vg
提取码:6tm8 -
安装步骤:略
4、Java调用CPLEX包进行计算
-
S1:新建工程,添加package。
-
S2:配置加载Cplex包
1)右击项目build pathConfigure Build Path…
2)LibrariesAdd External JARS选择XX…\cplex\lib\cplex.jar
3)添加Cplex动态运行库。右击项目–>build path–>Configure Build Path…–> Libraries–> Native library location–>Edit–>XX…\cplex\bin\x64_win64–>Apply and Close
-
S3:求解线性规划模型
max x1+2x2+3x3
s.t.
-x1+x2+x3<=20
x1-3x2+x3<=30
0<=x1<=40
- S4:完整代码实现
package com.dfh.test;
import ilog.cplex.IloCplex;
import ilog.concert.*;
public class TestCplex2 {
public static void main(String[] args) {
// max x1+2x2+3x3
// s.t.
// -x1+x2+x3<=20
// x1-3x2+x3<=30
// 0<=x1<=40
// 1. 使用 IloCplex 类新建一个 cplex 类。
// 2. 使用 IloNumVar 定义求解变量。
// 3. 使用 addMaximize 或addMinimize 定义求解目标。
// 4. 使用 addLe 添加约束条件.
// 5. 使用 solve() 方法求解。
// 6. 使用 IloNumExpr 定义中间变量。
try {
IloCplex cplex = new IloCplex(); // creat a model
int[] lb = {
0, 0, 0};
int[] ub = {
400, Integer.MAX_VALUE, Integer.MAX_VALUE};
IloNumVar[] x = cplex.intVarArray(3, lb, ub);
int[] objvals = {
15, 16, 25};
cplex.addMaximize(cplex.scalProd(x, objvals));
cplex.addLe(cplex.scalProd(x, objvals), 2555);
if (cplex.solve()) {
cplex.output().println("Solution status = " + cplex.getStatus());
cplex.output()