修改模型


修改模型

例子:Diet, feasopt, fixanddive, gc_pwl_func, lpmod, sensitivity, workforce3, workforce4, workforce5

本节讨论模型修改。修改可以有多种形式,包括添加约束或变量、删除约束或变量、修改约束和变量属性、更改约束系数等。Gurobi示例并没有涵盖所有可能的修改,但它们涵盖了最常见的类型。

饮食

这个例子建立了一个线性模型来解决经典的饮食问题:找到满足一组日常营养需求的最低成本饮食。一旦模型被建立并求解,它就会添加一个额外的约束来限制乳制品的食用数量,并再次求解模型。manbetx官网手机登入让我们关注模型修改。

向已经解决的模型添加约束与在构建初始模型时添加约束没有什么不同。在C中,我们可以通过以下约束引入6份乳制品的限制(其中变量6和7分别表示牛奶和冰淇淋的数量):

printf("\ naddconstraint:最多6份乳制品\n");cind [0] = 7;cval [0] = 1.0;cind [1] = 8;cval [1] = 1.0;错误= GRBaddconstr(model, 2, cind, cval, GRB_LESS_EQUAL, 6.0, "limit_dairy");
在c++中:
cout << "\ nadd约束:最多6份乳制品" << endl;模型。addConstr(购买[7]+购买[8]<= 6.0,"limit_dairy");
在Java中:
lhs.addTerm(1.0,买[8]);模型。addConstr (lh、伽马线暴。LESS_EQUAL, 6.0,“limit_dairy”);
在c#中:
控制台。WriteLine(“添加限制:最多6份乳制品”);模型。AddConstr(购买[7]+购买[8]<= 6.0,"limit_dairy");
在Python中:
print('\n添加限制:最多6份乳制品')m.addConstr(购买。Sum (['milk', 'ice cream']) <= 6, "limit_dairy")

对于线性模型,以前计算的解可以作为一个有效的温暖的开始为修改后的模型。Gurobi求解器保留手机万博登录以前的解决方案,所以下一个优化调用自动从前面的解决方案开始。

lpmod

更改变量的边界也很简单。的lpmod示例更改单个变量的绑定,然后用两种不同的方式重新求解模型。方法可以更改变量绑定乌兰巴托变量的属性。在C:

error = grbsetdblattreement(模型,“UB”,minVar, 0.0);
在c++中:
v (minVar)。集(GRB_DoubleAttr_UB, 0.0);
在Java中:
minVar.set (GRB.DoubleAttr。乌兰巴托,0.0);
在c#中:
minVar。乌兰巴托= 0.0;
在Python中:
方法即可对模型进行解析优化方法了。对于一个连续模型,这从之前的解决方案开始优化。为了说明从初始未解状态求解模型时的差异,采用lpmod示例调用重置函数。在C:
error = GRBreset(model, 0);
c++, Java和Python:
model.reset ();
在c#中:
model.Reset ();
当我们在重新设置模型后调用优化方法时,优化从头开始。虽然计算时间的差异对于这个小例子来说是微不足道的,但是对于更大的模型来说,一个温暖的开始会产生很大的差异。

fixanddive

fixanddiveExample提供了绑定修改的另一个例子。在本例中,我们反复修改一组变量边界,每次都使用warm开头。在C语言中,变量固定如下:

对于(j = 0;j < nfix;++j) {fixval = floor(分数[j]。X + 0.5);[j]。指数,fixval);if (error) goto QUIT;误差= GRBsetdblattrelement(model,“UB”,分数阶)[j]。指数,fixval);if (error) goto QUIT;error = grbgetstrattrement (model,“VarName”,分数阶)[j]。指数,&vname);if (error) goto QUIT;printf(" Fix %s to %f (rel %f)\n", vname, fixval,小数[j].X); }
在c++中:
For (int I = 0;我< nfix;++i) {GRBVar* v =分数[i];double fixval = floor(v->get(GRB_DoubleAttr_X) + 0.5);v - >设置(GRB_DoubleAttr_LB fixval);v - >设置(GRB_DoubleAttr_UB fixval);cout < <“修复”< < v - >获得(GRB_StringAttr_VarName) < <”“< < fixval < <”(rel”< < v - > get (GRB_DoubleAttr_X ) << " )" << endl;}
在Java中:
For (int I = 0;我< nfix;++i) {GRBVar v = fraction .get(i);double fixval = Math.floor(v.get(grb . doubleattrs . x) + 0.5);v.set (GRB.DoubleAttr。磅,fixval);v.set (GRB.DoubleAttr。乌兰巴托,fixval);system . out。println(" Fix " + v.get(GRB.StringAttr.VarName) + " to " + fixval + " (rel " + v.get(GRB.DoubleAttr.X) + ") "));}
在c#中:
For (int I = 0;我< nfix;++i) {GRBVar v =分数[i];double fixval = Math.Floor(v.)X + 0.5);v.LB = fixval;v.UB = fixval;控制台。WriteLine(" Fix " + v.VarName + " to " + fixval + " (rel " + v.X + ") ");}
在Python中:
for i in range(nfix): v =分数[i] fixval = int(v. x +0.5) v. lb = fixval v. ub = fixval print(' Fix %s to %g (rel %g)' % (v. varname, fixval, v.X))
再次,随后的调用优化从之前的解决方案开始。

灵敏度

灵敏度示例计算与固定每个二进制变量为0或1相关的最佳目标值。它首先求解给定模型的最优性。然后,它构建了一个多场景模型,在每个场景中,一个二进制变量被固定到它在最优解中所取的值的补充。得到的多场景模型被求解,给出与强迫每个二进制变量离开其最优值相关的目标退化。

feasopt

我们考虑的最后一个修改示例是feasopt,在现有约束条件的基础上增加变量,并改变优化目标。将目标设置为零很简单。在C中,设置Obj属性为0:

对于(j = 0;j < numvars;++j){错误= GRBsetdblattrelement(模型,“Obj”,j, 0.0);if (error) goto QUIT;}
在面向对象的接口中,调用setObjective一个空的线性表达式。在c++中:
//明确目标feasmodel. setobject (GRBLinExpr(0.0));
在Java中:
//明确的客观作为模式。setObjective(new GRBLinExpr());
在c#中:
//明确的客观作为模式。SetObjective(新GRBLinExpr ());
在Python中:
#明确客观的feasmodel. setobject (0.0)
添加新变量有点复杂。在这个例子中,我们想要为每个约束添加人工变量,以便放松约束。我们用两个人工变量来表示等式约束,用一个人工变量来表示不等式约束。用于向约束添加单个人工变量的Python代码c在C语言中是:
error = grbgetstrattrement (model, " construcname ", i, &cname);if (error) goto QUIT;Vname = malloc(sizeof(char) * (6 + strlen(cname)));if (!vname) goto QUIT;strcpy (vname ArtN_);strcat (vname cname);vind[0] =我;vval [0] = -1.0;error = GRBaddvar(model, 1, vind, vval, 1.0, 0.0, GRB_INFINITY, GRB_CONTINUOUS, vname);if (error) goto QUIT;
在c++中:
双系数= -1.0;feasmodel.addVar(0.0, GRB_INFINITY, 1.0, GRB_CONTINUOUS, 1, &c[i], &coef, "ArtN_" + c[i].get(grb_stringattr_construcname));
在Java中:
GRBConstr[] consts = new GRBConstr[] {c[i]};Double[]系数= new Double [] {-1};feasmodel.addVar(0.0,伽马线暴。无穷,1.0,伽马线暴。连续,构造,系数,“arttn_”+
在c#中:
GRBConstr[] consts = new GRBConstr[] {c[i]};Double[]系数= new Double [] {-1};feasmodel.AddVar(0.0,伽马线暴。无穷,1.0,伽马线暴。c[i]. construcname);
在Python中:
feasmodel.addVar(obj=1.0, name="ArtN_" + c. construcname, column=gp。列([1],[c]))
我们使用论点的addVar方法指定新变量所参与的约束集以及相关的系数。在本例中,新变量只参与要放松的约束。在这里,除了目标和变量名,所有变量属性都使用默认值。