基于java语言,调用cplex求解线性整数规划问题

基于java语⾔,调⽤cplex求解线性整数规划问题
⽬录
引⾔
cplex是求解线性/整数规划问题的常⽤求解器之⼀,⽽java是应⽤⾮常⼴泛的程序开发语⾔。本⽂⼒争通过两个优化实例,描述清楚在java 语⾔下,如何调⽤cplex⾼效求解线性/整数规划问题。
简单的⼀维线性规划实例
针对简单的问题,⽹上已有诸多实例,此处直接搬运:。
优化实例
优化变量
⽬标函数为
约束条件为cplex求解
合成化学x,x,x
123
max x+
12x+
23x3−x+
1x+
2x≤
320
x−
13x+
2x≤
340
0≤x≤
140
import IloException;
import IloNumVar;
import IloCplex;
public class CplexExamples {
public static void main(String[] args){
// cplex求解,⼀般都使⽤
电力设施保护条例try{
// 声明cplex优化模型
IloCplex cplex =new IloCplex();
/
/ 设定变量上下限
double[] lb ={0.0,0.0,0.0};// 下限
double[] ub ={40.0, Double.MAX_VALUE, Double.MAX_VALUE};// 上限
IloNumVar[] x = cplex.numVarArray(3, lb, ub);// 定义优化变量:IloNumVar,3维,以及对应的边界
// 设定⽬标函数
double[] objvals ={1.0,2.0,3.0};// ⽬标函数系数
cplex.addMaximize(cplex.scalProd(x, objvals));// 定义⽬标函数:addMaximize最⼤化,scalProd,连乘
// 设定约束条件
double[] coeff1 ={-1.0,1.0,1.0};// 第⼀组约束条件的系数
double[] coeff2 ={1.0,-3.0,1.0};// 第⼆组约束条件的系数
cplex.addLe(cplex.scalProd(x, coeff1),20.0);// 定义第⼀组约束条件的系数,addLe(a,b):a⼩于等于b
cplex.addLe(cplex.scalProd(x, coeff2),30.0);// 定义第⼆组约束条件的系数
马克思劳动价值论// cplex.solve():模型求解
if(cplex.solve()){
// cplex.output(),数据输出,功能类似System.out.println();光学学报
cplex.output().println("Solution status = "+ Status());// Status:求解状态,成功则为Optimal
// ObjValue():⽬标函数的最优值
cplex.output().println("Solution value = "+ ObjValue());
// Values(x):变量x的最优值
double[] val = Values(x);
for(int j =0; j < val.length; j++)
cplex.output().println("x"+(j+1)+"  = "+ val[j]);
}
// 退出优化模型
}catch(IloException e){
}
}
}
个⼈理解
(1)以上实例亲测有效,可以作为程序校验的标准,⽤于检测cplex环境是否已经成功搭建。
(2)⼏乎针对每⼀⾏代码,都增加了详细的注释,对⼩⽩们更加友好。
(3)该实例不便于直接改写为⼤规模优化问题的求解,原因包括:多维变量如何表达,没有提及;cplex.scalProd难以直接扩展使⽤到复杂的约束条件和⽬标函数等。
(4)实例中未涉及如何⾼效调试cplex相关代码,不便于算法开发和维护。
复杂的⼆维整数规划实例
优化实例
a = [8    7    9    4    5
8    0    7    4    4
4    3    3    8    7
7    0    10    8    7
1    1    0
2    8]
b = [3    5    8    10    9
7    10    2    6    2
7    3    5    1    8
1    6    7    1    2
1    2    9    2    10]
存在以上两个⼆维矩阵,要求分别从两个矩阵中的每⼀⾏,选出⼀个元素,使得总的数值最⼩化,约束条件为a和b中,相同⾏所选定的元素对应的列,也要相同。
针对以上问题,定义第⼀组优化变量为
其中,表⽰取a中第⾏第列的值;反之,表⽰不取。
定义第⼆组优化变量为
其中,表⽰取b中第⾏第列的值;反之,表⽰不取。
⽬标函数可以描述为
约束条件包括:针对任意和针对每⼀个cplex 求解import  IloException ;import
IloIntVar ;import
IloLinearNumExpr ;import  IloCplex ;
public  class  CplexExamples {
public  static  void  main (String [] args ) {
int [][] a = {{8, 7, 9, 4, 5}, {8, 0, 7, 4, 4}, {4, 3, 3, 8, 7}, {7, 0, 10, 8, 7}, {1, 1, 0, 2, 8}};
int [][] b = {{3, 5, 8, 10, 9}, {7, 10, 2, 6, 2}, {7, 3, 5, 1, 8}, {1, 6, 7, 1, 2}, {1, 2, 9, 2, 10}};
try  {
// 声明cplex 优化模型
IloCplex model = new  IloCplex ();
x =i ,j 0,1,i =0,1,2,3,4,j =0,1,2,3,4
x =i ,j 1i j y =i ,j 0,1,i =0,1,2,3,4,j =0,1,2,3,4
y =i ,j 1i j min (a x +i =0∑4j =0∑4
支护i ,j i ,j b y )i ,j i ,j i j
x =i ,j y i ,j
i
x =j =0∑4i ,j 1,y =j =0∑4
i ,j 1
IloCplex model =new IloCplex();
// 定义两个⼆维优化变量
IloIntVar[][] x =new IloIntVar[5][5];
for(int i =0; i <5; i++){
for(int j =0; j <5; j++){
x[i][j]= model.intVar(0,4,"x["+ i +","+ j +"]");
}
}
IloIntVar[][] y =new IloIntVar[5][5];
for(int i =0; i <5; i++){
for(int j =0; j <5; j++){
y[i][j]= model.intVar(0,4,"y["+ i +","+ j +"]");
}
}
// 定义⽬标函数
IloLinearNumExpr objExpr = model.linearNumExpr();
for(int i =0; i <5; i++){
for(int j =0; j <5; j++){
objExpr.addTerm(a[i][j], x[i][j]);
objExpr.addTerm(b[i][j], y[i][j]);
}
}
model.addMinimize(objExpr);
// 定义约束条件
for(int i =0; i <5; i++){
for(int j =0; j <5; j++){
// 第⼀组约束
model.addEq(x[i][j], y[i][j]);
}
// 第⼆组约束
model.addEq(model.sum(x[i]),1);
model.addEq(model.sum(y[i]),1);
}
// 优化计算,输出最优解
if(model.solve()){
System.out.println("最优解为:"+ ObjValue());
for(int i =0; i <5; i++){
for(int j =0; j <5; j++){
System.out.println("x["+ i +","+ j +"]: "+ Value(x[i][j]));
}
}
}
// 退出优化模型
}catch(IloException e){
}
}
}
注意事项
(1)定义优化变量时,使⽤for循环的⽅式,更加灵活。
(2)定义⽬标函数时,采⽤IloLinearNumExpr的形式,可以处理复杂的表达式
(3)定义了变量的简称后,在model.solve前打个断点,可以很容易地看到具体的优化模型,便于校验程序,下图给出了⽬标函数,以及
部分的约束条件。
(4)优化最终提⽰⽆解或者优化解明显有问题时,可以通过控制变量法快速定位到问题问题的位置:逐组删除约束条件,确定是哪⼀组约束条件导致了错误的结果。
总结
步骤编号
甲基丙烯酸甲酯具体步骤相关命令1声明优化模型IloCplex model = new IloCplex()
2定义优化变量⽬标名称:IIloIntVar [][] x = new IloIntVar[][]
变量范围:x[i][j] = model.intVar(0, 1, “x[” + i + “,” + j + “]”)
3定义⽬标函数最⼤化:model.addMaximize()
最⼩化:model.addMinimize()
4定义约束条件数值/表达式a,b相等:model.addEq(a,b)
数值/表达式a⼩于等于b:model.addLe(a,b)
数值/表达式a⼤于等于b:model.addGe(a,b )
3-43,4中常⽤命令声明变量表达式:IloLinearNumExpr Expr = model.linearNumExpr()
向量a,b连乘:model.scalProd(a,b)
数值/表达式a,b相加:model.sum(a,b)
数值/表达式a,b相减:model.diff(a,b)
数值/表达式a,b相乘:model.prod(a,b)
表达式c中添加数值a与表达式b的乘积:c.addTerm(a, b)
5退出优化模型d()

本文发布于:2024-09-21 01:41:45,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/536944.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:优化   表达式   变量   约束条件   定义   问题   模型
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议