manbet体育手机客户端


建立模型

例子:Diet, facility, genconstr, mip1, multiobj, piecewise, poolsearch, qcp, qp, sos, sudoku, workforce1, workforce2, workforce3, workforce4, workforce5

Gurobi的一些示例是从头开始构建模型的。我们从两个方面开始:mip1SOS..两者都构建了非常简单的模型来说明基本流程。

通常,构建模型的第一步是创建空模型。这是用GRBnewmodelC函数:

error = GRBnewmodel(env, &model, "mip1", 0, NULL, NULL, NULL);
您可以选择在创建模型时创建一组变量,以及指定这些变量的界限,客观系数和名称。这些示例单独添加新变量。

在C ++,C#和Java中,您使用的是使用新模型GRBModel构造函数。在Java中,这看起来像:

grbmodel模型=新grbmodel(env);
在Python中,类被调用模型,它的构造函数类似于GRBModelc++和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);

我们应该在界面中微妙地指出一个重要的问题。我们使用一个懒惰更新构建和修改模型的方法。当您进行更改时,它们将被添加到队列中。只有在优化模型(或将模型写入文件)时,队列才会刷新。在不常见的情况下,您希望在优化模型之前查询有关模型的信息,您应该调用更新方法,然后进行查询。