Optimization 古罗比-俾莫误差的灵敏度分析
我正在用Pyomo建模一个MIP,我想用gurobi做一个敏感性分析,以得到仍然确保最优组合解的系数范围(决策变量是二进制的)。 据我所知,所有决策变量的值必须固定,模型应重新求解,解算器给出系数的范围Optimization 古罗比-俾莫误差的灵敏度分析,optimization,range,analysis,gurobi,pyomo,Optimization,Range,Analysis,Gurobi,Pyomo,我正在用Pyomo建模一个MIP,我想用gurobi做一个敏感性分析,以得到仍然确保最优组合解的系数范围(决策变量是二进制的)。 据我所知,所有决策变量的值必须固定,模型应重新求解,解算器给出系数的范围gm。 我尝试了不同的编码(案例1,案例2) 以下是我的模型的一些部分: from __future__ import division from pyomo.environ import * from pyomo.opt import SolverFactory #from gurobipy i
gm
。
我尝试了不同的编码(案例1,案例2)
以下是我的模型的一些部分:
from __future__ import division
from pyomo.environ import *
from pyomo.opt import SolverFactory
#from gurobipy import *
model = AbstractModel ()
model.f = Param(within=PositiveIntegers)
model.F = RangeSet(1, model.f)
model.v = Param(within=PositiveIntegers)
model.V = RangeSet(1, model.v)
model.m = Param(within=PositiveIntegers)
model.M = RangeSet(1, model.m)
...
model.yw = Var(model.M, within=Binary)
model.ys = Var(model.index_fvm, within=Binary)
model.bs = Param(model.index_fvm, within=Binary, default=0)
def Obj_rule(model):
expr = 0.0
for (f,v,m) in model.index_fvm:
expr += model.g[m] * model.ys[f,v,m]
for m in model.M:
expr += model.g[m] * model.yw[m]
return expr
model.OBJ = Objective(rule=Obj_rule, sense=maximize)
...
def C10_constraint_rule (model, m):
expr= 0.0
for (f,v) in model.index_fv:
expr += model.ys[f,v,m]
expr += model.yw[m]
return expr <= 1
model.C10Constraint = Constraint(model.M, rule=C10_constraint_rule)
...
# Pyomo doc 5.1.1. P82-83
# case 1
opt = SolverFactory("gurobi")
instance = model.create_instance()
results = opt.solve(instance)
instance.display()
instance.load(results)
if instance.ys[f,v,m] == 0:
instance.ys[f,v,m].setlb(1)
instance.ys[f,v,m].setub(1)
else:
instance.ys[f,v,m].setlb(0)
instance.ys[f,v,m].setub(0)
instance.preprocess()
results = opt.solve(instance)
# case 2
#http://www.gurobi.com/documentation/7.0/examples.pdf
if len(sys.argv) < 2:
print('Usage: sensitivity.py filename')
quit()
# Read and solve model
model = read(sys.argv[1])
if model.IsMIP == 0:
print('Model is not a MIP')
exit(0)
model.optimize()
if model.status != GRB.Status.OPTIMAL:
print('Optimization ended with status %d' % model.status)
exit(0)
# Store the optimal solution
origObjVal = model.ObjVal
for v in model.getVars():
v._origX = v.X
# Disable solver output for subsequent solves
model.Params.outputFlag = 0
# Iterate through unfixed, binary variables in model
for v in model.getVars():
if (v.LB == 0 and v.UB == 1 \
and (v.VType == GRB.BINARY or v.VType == GRB.INTEGER)):
# Set variable to 1-X, where X is its value in optimal solution
if v._origX < 0.5:
v.LB = v.Start = 1
else:
v.UB = v.Start = 0
# Update MIP start for the other variables
for vv in model.getVars():
if not vv.sameAs(v):
vv.Start = vv._origX
# Solve for new value and capture sensitivity information
model.optimize()
if model.status == GRB.Status.OPTIMAL:
print('Objective sensitivity for variable %s is %g' % \
(v.VarName, model.ObjVal - origObjVal))
else:
print('Objective sensitivity for variable %s is infinite' % \
v.VarName)
# Restore the original variable bounds
v.LB = 0
v.UB = 1
我在案例2中得到了这个错误:
ERROR: Unexpected exception while loading model:
__init__() takes exactly 3 positional arguments (2 given)
gm.dat如下所示:
param g:=
1 7
7 6
54 7
52 7
53 1
44 7
45 7
56 7
46 7
48 7
70 7
71 7
72 7
73 7
100 7
112 4
;
有没有人知道如何处理这个问题,并且知道如何进行敏感性分析
先谢谢你
拉拉也许我遗漏了什么——你似乎声明了Param
sf
和v
,但是你的数据文件中有一个Param
g
的值,也许我遗漏了什么——你似乎声明了Param
sf
和v
,但是您的数据文件具有Param
g
param g:=
1 7
7 6
54 7
52 7
53 1
44 7
45 7
56 7
46 7
48 7
70 7
71 7
72 7
73 7
100 7
112 4
;