manbet体育手机客户端
建立模型
例子:Diet, facility, genconstr, mip1, multiobj, piecewise, poolsearch, qcp, qp, sos, sudoku, workforce1, workforce2, workforce3, workforce4, workforce5Gurobi的一些示例是从头开始构建模型的。我们从两个方面开始:mip1
和SOS.
.两者都构建了非常简单的模型来说明基本流程。
通常,构建模型的第一步是创建空模型。这是用GRBnewmodel
C函数:
error = GRBnewmodel(env, &model, "mip1", 0, NULL, NULL, NULL);您可以选择在创建模型时创建一组变量,以及指定这些变量的界限,客观系数和名称。这些示例单独添加新变量。
在C ++,C#和Java中,您使用的是使用新模型GRBModel
构造函数。在Java中,这看起来像:
grbmodel模型=新grbmodel(env);在Python中,类被调用
模型
,它的构造函数类似于GRBModel
c++和Java的构造函数。一旦创建了模型,典型的下一步就是添加变量。在C语言中,你用GRBaddvars
函数添加一个或多个变量:
error = grbadvars (model, 3, 0, NULL, NULL, NULL, obj, NULL, NULL, vtype, NULL);在c++, Java和Python中,您使用
addvar.
方法模型
对象(AddVar
在c#中)。在Java中,这看起来像:GRBVar x = model.addVar(0.0, 1.0, -1.0, GRB。二、“x”);新变量的下限,上限,客观系数,类型和名称被指定为参数。在C ++和Python中,您可以省略这些参数并使用默认值;看看Gurobi参考手册获取详细信息。
下一步是向模型添加约束。线性约束通过grbaddconstr.
C函数:
ERROR = GRBADDCONSTR(型号,3,IND,VAL,GRB_LESS_EQUAL,4.0,“C0”);要在C中添加一个线性约束,你必须为左边指定一个变量指标和系数的列表,这是约束的含义(例如,
grb_less_equal.
)和右侧常数。您也可以给出约束一个名字;如果省略名称,Gurobi将为约束分配默认名称。在c++、c#、Java和Python中,您可以通过首先为左侧和右侧构建线性表达式来构建线性约束。在不支持操作符重载的Java中,可以构建如下表达式:
GRBLinExpr expr = new GRBLinExpr();expr.addTerm (1.0 x);expr.addTerm (2.0, y);expr.addTerm (3.0, z);然后使用
addConstr
方法GRBModel
对象添加约束,使用以下的线性表达式为左右两边:模型。addConstr(expr, GRB_LESS_EQUAL, 4.0, "c0");
对于C ++,C#和Python,诸如+,*,<=的标准数学运算符已经过载,以便线性表达式类似于传统的数学表达式。在c++中:
模型。addConstr(x + 2 * y + 3 * z <= 4, "c0");
一旦建立了模型,典型的下一步就是优化它(使用grboptimize.
在C语言中,model.optimize
在C ++,Java和Python中,或模型。优化
在c#中)。然后你可以查询X
属性来检索解决方案(以及arnamame.
属性检索每个变量的变量名)。在C语言中,X
属性的检索如下:
error = GRBgetdblattrarray(model, GRB_DBL_ATTR_X, 0,3, sol);
在c++中:
cout << x.get(GRB_StringAttr_VarName) << " " << x.get(GRB_DoubleAttr_X) << endl;cout << y.t get(GRB_StringAttr_VarName) << " " << y.t get(GRB_DoubleAttr_X) << endl;cout << z.get(GRB_StringAttr_VarName) << " " << z.get(GRB_DoubleAttr_X) << endl;
在Java:
System.out.println(x.get(grb . stringattrn . varname) + " " + x.get(grb . doubleattrn . x));System.out.println(y.e get(grb . stringattrn . varname) + " " + y.e get(grb . doubleattrn . x));System.out.println(z.get(grb . stringattrn . varname) + " " + z.get(grb . doubleattrn . x));
在c#中:
console.writeline(x.get(grb.stringattr.varname)+“”+ x.get(grb.doubleattr.x);console.writeline(y.get(grb.stringattr.varname)+“”+ y.get(grb.doubleattr.x);console.writeline(z.get(grb.stringattr.varname)+“”+ z.get(grb.doubleattr.x);
在Python:
print(v. getvars ());varName v.x)
当查询或修改约束或变量数组的属性值时,通常更有效的做法是一次对整个数组执行操作。这在C接口中是非常自然的,因为大多数属性例程都接受数组参数。在c++、c#、Java和Python接口中,您可以使用得到
和集
方法对GRBModel
对象直接使用属性值数组(getAttr
/setAttr
在Python)。在里面数独
Java示例,这是如下所示:
double [] [] [] x = model.get(grb.doubleattr.x,vars);
我们应该在界面中微妙地指出一个重要的问题。我们使用一个懒惰更新构建和修改模型的方法。当您进行更改时,它们将被添加到队列中。只有在优化模型(或将模型写入文件)时,队列才会刷新。在不常见的情况下,您希望在优化模型之前查询有关模型的信息,您应该调用更新方法,然后进行查询。