Gurobi是由美国Gurobi公司开发的新一代大规模数学规划优化器,适用于LP、QP等场景,提供了C,C++,java,python,MATLAB,R语言等多种语言的接口。
windows下载gurobi后,可以在gurobi文件夹中找到gurobi.jar,在eclipse中右键单击项目 -> properties -> java build path -> libraries -> add external jars,之后选择gurobi.jar即可(当然也有其他的导入jar包的方式)。
使用gurobi之前,需要import gurobi.*。
每次调用gurobi时都需要建立一个gurobi的model,而这个model又是建立在gurobi的环境基础上的。目前我对这些的理解还非常有限,只知道在使用gurobi之前,需要先执行如下语句:
GRBEnv env = new GRBEnv("name.log"); //不知道环境是否必须为.log文件
GRBModel model = new GRBModel(env); //以刚才建立的环境为参数建立gurobi模型
一般一个程序中只需要一个GRBEnv,如果使用了多个的话,文档中建议在结束时调用GRBEnv.dispose进行回收处理。
添加变量需要用到GRBModel.addVar()(或GRBModel.addVars(),如果一次添加多个变量)这个方法,具体代码如下:
GRBVar x = model.addVar(0.0,Double.MAX_VALUE,1.0,GRB.CONTINUOUS,"u" + i);
GRBVar y = model.addVar(0.0,1.0,1.0,GRB.BINARY,"VarY");
addVar这个函数有几种不同的重载,这里,第一个和第二个参数分别代表变量的上界和下界,第三个参数是objective coefficient,目前我还不了解它的意思。第四个参数为变量的类型,这里用GRB.CONTINUOUS代表连续类型,还有GRB.INTEGER,GRB.BINARY等多种其他类型可以使用。第五个参数是String类型,代表变量名。
GRBModel.addConstr()可以为model添加约束条件,其定义为:
GRBConstr addConstr( GRBLinEpr lhsExpr, char sense, GRBLinExpr rhsExpr, String name)
GRBConstr addConstr(GRBLinExpr, lhsExpr, char sense,GRBVar rhsVar, String name)
GRBConstr addConstr(GRBLinExpr lhsExpr, char sense, double rhsVar, String name)
...
其中的GRBLinEpr是线性表达式,有addConstant(double c),addTerm(double coeff, GRBVar var)等方法,分别可以向线性表达式中添加常量或者变量,其中coeff是变量的系数。
在有线性表达式后,可以用该线性表达式constraints。生成constraints的格式更加丰富,上面的定义只是其中的几个例子。
在上面的代码中,lhsExpr和rhsExpr分别为限制中左边和右边的表达式。sense的选择有GRB.LESS_EQUAL,GRB.EQUAL和GRB.GREATER_EQUAL。代表约束条件。
在添加了变量和限制条件之后,可以为gurobi设置一个计算目标,该方法的定义如下:
GRBModel.setObjective(GRBExpr expr, int sense)
其中,sense有GRB.MINIMIZE和GRB.MAXIMIZE两种,分别对应求目标的最小值和最大值。
计算语句:
model.optimize();
gurobi的变量可以通过get函数讲自身的值返回程序。
GRBVar.get():
char get(GRB.CharAttr attr);
double get(GRB.DoubleAttr attr);
...
使用实例:
u[i] = var[i].get(GRB.DoubleAttr.X); //获取GRB变量var[i]的浮点值,并赋给u[i]
通过这次对gurobi的学习,我发现对于学习新软件或语言来说,最重要的就是多阅读程序文档,gurobi的官方文档位置如下:
http://www.gurobi.com/documentation/