本文整理汇总了Python中gurobipy.Model.modelSense方法的典型用法代码示例。如果您正苦于以下问题:Python Model.modelSense方法的具体用法?Python Model.modelSense怎么用?Python Model.modelSense使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类gurobipy.Model
的用法示例。
在下文中一共展示了Model.modelSense方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: generateInstance
# 需要导入模块: from gurobipy import Model [as 别名]
# 或者: from gurobipy.Model import modelSense [as 别名]
def generateInstance(self):
def euc_dist(bor, sh):
dx = bor["x_coord"] - sh["x_coord"]
dy = bor["y_coord"] - sh["y_coord"]
return math.sqrt(dx * dx + dy * dy)
model = Model('FireSolver')
# Generate variables
x = {}
for bor in self.boroughs:
# New firehouses
for fh in self.new_firehouses + self.old_firehouses:
name = "x_" + fh["loc_id"] + "_" + bor["loc_id"]
x[bor["loc_id"], fh["loc_id"]] = model.addVar(name=name, vtype ="b", obj=self.cost_coef * euc_dist(bor, fh))
# Open variables
openfh = {}
for fh in self.new_firehouses:
openfh[fh["loc_id"]] = model.addVar(name = "open_" + fh["loc_id"], vtype ="b", obj=fh["construction_cost"])
# Close variables
closefh = {}
for fh in self.old_firehouses:
closefh[fh["loc_id"]] = model.addVar(name = "close_" + fh["loc_id"], vtype ="b", obj=fh["destruction_cost"])
model.modelSense = GRB.MINIMIZE
model.update()
# Constraints: one firehouse / borough
for bor in self.boroughs:
model.addConstr(quicksum(x[key] for key in x if key[0] == bor["loc_id"]) == 1)
# capacity of firehouses
for fh in self.new_firehouses:
model.addConstr(quicksum(x[key] for key in x if key[1] == fh["loc_id"]) <= self.capacity * openfh[fh["loc_id"]])
# If it is not removed, the initial assignment needs to be respected
for fh in self.old_firehouses:
for bor in self.boroughs:
if bor["currently_protected_by"] == fh["loc_id"]:
model.addConstr(x[bor["loc_id"], fh["loc_id"]] == 1 - closefh[fh["loc_id"]])
else:
model.addConstr(x[bor["loc_id"], fh["loc_id"]] == 0)
# solve it
model.optimize()
self.model = model
示例2: Model
# 需要导入模块: from gurobipy import Model [as 别名]
# 或者: from gurobipy.Model import modelSense [as 别名]
#!/usr/bin/env python
# This is the GAP per Wolsey, pg 182, using Lagrangian Relaxation
from gurobipy import GRB, Model
model = Model('GAP per Wolsey with Lagrangian Relaxation')
model.modelSense = GRB.MAXIMIZE
model.setParam('OutputFlag', False) # turns off solver chatter
b = [15, 15, 15]
c = [
[ 6, 10, 1],
[12, 12, 5],
[15, 4, 3],
[10, 3, 9],
[ 8, 9, 5]
]
a = [
[ 5, 7, 2],
[14, 8, 7],
[10, 6, 12],
[ 8, 4, 15],
[ 6, 12, 5]
]
# x[i][j] = 1 if i is assigned to j
x = []
for i in range(len(c)):
x_i = []
for j in c[i]:
示例3: generateInstance
# 需要导入模块: from gurobipy import Model [as 别名]
# 或者: from gurobipy.Model import modelSense [as 别名]
def generateInstance(self):
# Check that variables have been intialized correctly
if (not self.planes) or (self.n == 0) or (self.T == 0):
logging.error('Store is not initialized correctly. Check for completeness of input-file.')
return None
model = Model("PlaneSolver")
"""
r: Earliest landing possibility
b: Best landing
d: latest landing
g: penalty for each time earlier from best
h: penalty for each time later from best
s_ij: if i lands before j: s needs to pass in time
x_i: Landing time for i
p_i: positive divertion from bi
n_i: negative divertion from bi
"""
bigM = max([max(x["s"]) for x in self.planes])
logging.debug("Using bigM punishment: " + str(bigM))
# generate Variables
x = {} # Landing time
p = {} # Positive divertion from optimal landing time
n = {} # Negative divertion from optimal landing time
s = {} # 1 iff plane i lands before j + buffer is invalid
s1 = {} # for these, see constraints
s2 = {}
h1 = {}
h2 = {}
for i in range(len(self.planes)):
x[i] = model.addVar(name="x_%d" % (i+1), vtype="i", lb=self.planes[i]["r"], ub=self.planes[i]["d"])
p[i] = model.addVar(name="p_%d" % (i+1), vtype="i", obj=self.planes[i]["h"], lb=0, ub=self.planes[i]["d"] - self.planes[i]["b"])
n[i] = model.addVar(name="n_%d" % (i+1), vtype="i", obj=self.planes[i]["g"], lb=0, ub=self.planes[i]["b"] - self.planes[i]["r"])
for j in range(len(self.planes)):
s[i, j] = model.addVar(name="s_%d_%d" % (i+1, j+1), vtype="b", obj=bigM, lb=0, ub=1)
s1[i, j] = model.addVar(name="s1_%d_%d" % (i+1, j+1), vtype="b", obj=0, lb=0, ub=1)
s2[i, j] = model.addVar(name="s2_%d_%d" % (i+1, j+1), vtype="b", obj=0, lb=0, ub=1)
h1[i, j] = model.addVar(name="h1_%d_%d" % (i+1, j+1), vtype="i", obj=0, lb=0)
h2[i, j] = model.addVar(name="h2_%d_%d" % (i+1, j+1), vtype="i", obj=0, lb=0)
model.modelSense = GRB.MINIMIZE
model.update()
for y in model.getVars():
if y.ub < 10000:
logging.debug("%10s\t[%5d:%5d]\tobj %4d", y.varName, y.lb, y.ub, y.obj)
# Constraints
for i in range(len(self.planes)):
logging.debug("{} == {} + {} - {}".format(x[i].varName, self.planes[i]["b"], p[i].varName, n[i].varName))
model.addConstr(x[i] == self.planes[i]["b"] + p[i] - n[i])
for j in range(len(self.planes)):
if j == i:
continue
# model.addConstr(x[j] - x[i] )
# Force s = s1 AND s2
model.addConstr(s[i, j] <= s1[i, j])
model.addConstr(s[i, j] <= s2[i, j])
model.addConstr(s[i, j] >= s1[i, j] + s2[i, j] - 1)
# s2 == xj - xi > 0
logging.debug("{}\t <= {}\t - {}\t - {}\t".format(s2[i, j].varName, x[j].varName, x[i].varName, h1[i, j].varName))
model.addConstr(s2[i, j] <= x[j] - x[i] + h1[i, j])
logging.debug("{}\t >= 1\t".format(h1[i, j].varName))
model.addConstr(h1[i, j] >= 1)
logging.debug("{}\t - {}\t + {}\t <= {}\t*{}\t".format(x[j].varName, x[i].varName, h1[i, j].varName, s2[i, j].varName, bigM))
model.addConstr(x[j] - x[i] + h1[i, j] <= s2[i, j]*bigM)
# s1 == xi + sij - xj > 0
logging.debug("{}\t + {}\t - {}\t >= {}\t".format(x[i].varName, self.planes[i]["s"][j], x[j].varName, s1[i, j].varName))
model.addConstr(s1[i, j] <= x[i] + self.planes[i]["s"][j] - x[j] + h2[i, j])
logging.debug("{}\t + {}\t - {}\t <= {}\t*{}\t".format(x[i].varName, self.planes[i]["s"][j], x[j].varName, s1[i, j].varName, bigM))
model.addConstr(x[i] + self.planes[i]["s"][j] - x[j] <= s1[i, j]*bigM)
# solve it
model.optimize()
# Debugging printouts
dbgStrs = {}
for y in model.getVars():
if y.varName[0:2] not in dbgStrs:
dbgStrs[y.varName[0:2]] = []
dbgStrs[y.varName[0:2]].append("%8s = %4s [%4s]" % (y.varName, int(y.x), int(y.x*y.obj) if y.obj else ""))
for x in dbgStrs:
dbgStrs[x].sort()
while dbgStrs:
printed = False
keys = [x for x in dbgStrs.keys()]
keys.sort()
logStr = ""
for x in keys:
if dbgStrs[x]:
#.........这里部分代码省略.........
示例4: solve
# 需要导入模块: from gurobipy import Model [as 别名]
# 或者: from gurobipy.Model import modelSense [as 别名]
def solve(n, width, height, startNodes, targetNodes, startTimes, endTimes):
model = Model("BoatSolver")
def toGrid(val, y=0):
if isinstance(val, list):
return val[0] + val[1] * width
return val + y * width
T = max(endTimes)
x = {}
wait = {}
for i, j, t in itertools.product(range(n), range(width * height), range(T)):
x[i, j, t] = model.addVar(name="x_%d_%d_%d" % (i+1, j+1, t+1), vtype="b", obj=1)
wait[i, j, t] = model.addVar(name="wait_%d_%d_%d" % (i+1, j+1, t+1), vtype="i", obj=-1)
model.modelSense = GRB.MINIMIZE
model.update()
# Force startpositions
for i, (sN, sT) in enumerate(zip(startNodes, startTimes)):
for t in range(sT):
for j in range(width * height):
if j == toGrid(sN - 1) and t == sT - 1:
logging.debug("start: %s == 1", x[i, j, t].varName)
model.addConstr(x[i, j, t] == 1)
else:
logging.debug("start: %s == 0", x[i, j, t].varName)
model.addConstr(x[i, j, t] == 0)
# Force endpositions
for i, (eN, eT) in enumerate(zip(targetNodes, endTimes)):
j = toGrid(eN - 1)
logging.debug("end: %s == 1", x[i, j, eT - 1].varName)
model.addConstr(x[i, j, eT - 1] == 1)
# Container vanishes after endTime
for t in range(eT, T):
logging.debug("end: %s == 0", x[i, j, t].varName)
model.addConstr(x[i, j, t] == 0)
# single container per node
for j, t in itertools.product(range(width * height), range(T)):
logging.debug("%s <= 1", [x[i, j, t].varName for i in range(n)])
model.addConstr(quicksum(x[i, j, t] for i in range(n)) <= 1)
# Force valid container movement
for w, h in itertools.product(range(width), range(height)):
vals = [toGrid(w, h)]
if h >= 1:
vals += [toGrid(w, h - 1)]
if w >= 1:
vals += [toGrid(w - 1, h)]
if h+1 < height:
vals += [toGrid(w, h + 1)]
if w+1 < width:
vals += [toGrid(w + 1, h)]
for i, t in itertools.product(range(n), range(1, T)):
if endTimes[i] > t and startTimes[i] <= t:
logging.debug("sum(%s) >= %s", [x[i, j, t].varName for j in vals], x[i, toGrid(w, h), t - 1].varName)
model.addConstr(quicksum(x[i, j, t] for j in vals) >= x[i, toGrid(w, h), t - 1])
else:
logging.debug("skipped(%s) >= %s", [x[i, j, t].varName for j in vals], x[i, toGrid(w, h), t - 1].varName)
for i, t in itertools.product(range(n), range(1, T)):
logging.debug("sum(%s) <= 1", [x[i, j, t].varName for j in vals])
model.addConstr(quicksum(x[i, j, t] for j in vals) <= 1)
# Force continous line through grid
for i, t in itertools.product(range(n), range(0, T)):
if endTimes[i] > t and startTimes[i] <= t + 1:
logging.debug("sum(%s) == 1", [x[i, j, t].varName for j in range(width * height)])
model.addConstr(quicksum(x[i, j, t] for j in range(width * height)) == 1)
else:
logging.debug("sum(%s) == 0", [x[i, j, t].varName for j in range(width * height)])
model.addConstr(quicksum(x[i, j, t] for j in range(width * height)) == 0)
# Prevent ships from passing over same link
for t in range(1, T):
for w, h in itertools.product(range(width - 1), range(height)):
for i in range(n):
for k in range(i+1, n):
model.addConstr(x[i, toGrid(w, h), t - 1] + x[i, toGrid(w + 1, h), t] + x[k, toGrid(w, h), t] + x[k, toGrid(w + 1, h), t - 1] <= 3)
model.addConstr(x[i, toGrid(w, h), t] + x[i, toGrid(w + 1, h), t - 1] + x[k, toGrid(w, h), t - 1] + x[k, toGrid(w + 1, h), t] <= 3)
for w, h in itertools.product(range(width), range(height - 1)):
for i in range(n):
for k in range(i+1, n):
model.addConstr(x[i, toGrid(w, h), t - 1] + x[i, toGrid(w, h + 1), t] + x[k, toGrid(w, h), t] + x[k, toGrid(w, h + 1), t - 1] <= 3)
model.addConstr(x[i, toGrid(w, h), t] + x[i, toGrid(w, h + 1), t - 1] + x[k, toGrid(w, h), t - 1] + x[k, toGrid(w, h + 1), t] <= 3)
# Allow free waiting
for i, j, t in itertools.product(range(n), range(width * height), range(0, T)):
if t < startTimes[i]:
model.addConstr(x[i, j, t] == wait[i, j, t])
else:
model.addConstr(x[i, j, t - 1] + x[i, j, t] - 1 <= wait[i, j, t])
model.addConstr(x[i, j, t - 1] >= wait[i, j, t])
model.addConstr(x[i, j, t] >= wait[i, j, t])
model.optimize()
#.........这里部分代码省略.........
示例5: generateInstance
# 需要导入模块: from gurobipy import Model [as 别名]
# 或者: from gurobipy.Model import modelSense [as 别名]
def generateInstance(self):
# Check that store has been intialized correctly
if not all([x in self.store for x in ["Timehorizon", "h", "K", "a", "d", "s", "st"]]):
logging.error('Store is not initialized correctly. Check for completeness of input-file.')
return None
model = Model("LotSolver")
tHor = self.store["Timehorizon"]
nPr = self.store["nProducts"]
timeRange = range(1, tHor + 1)
prodRange = range(1, nPr + 1)
# Assume that production of products costs at least 1h, so a max of K products can be produced per period
bigM = max(self.store["K"])
# generate Variables
# boolean production
bx = {}
# lager
l = {}
# production
x = {}
for t in timeRange:
for p in prodRange:
x[p, t] = model.addVar(name="x_%d_%d" % (p, t), vtype="i")
bx[p, t] = model.addVar(name="bx_%d_%d" % (p, t), vtype="b")
for t in range(0, tHor + 1):
for p in prodRange:
l[p, t] = model.addVar(name="l_%d_%d" % (p, t), vtype="i", obj=float(self.store["h"][p-1]))
# switch costs
s = {}
for t in range(0, tHor+1):
for p1 in prodRange:
for p2 in prodRange:
# Switching to the same product does not cost anything - even if the file may say otherwise
objective = float(self.store["s"][p1-1][p2-1]) if p1 != p2 else 0
s[p1, p2, t] = model.addVar(name="s_%d_%d_%d" % (p1, p2, t), vtype="b", obj=objective)
model.modelSense = GRB.MINIMIZE
model.update()
for y in model.getVars():
logging.debug("%s obj %s", y.varName, y.obj)
# Constraints
# Initially only allow a single product
logging.debug("%s == 1", [s[key].varName for key in s if key[2] == 0])
model.addConstr(quicksum(s[key] for key in s if key[2] == 0) == 1, name="single_switch_" + str(t))
# Only allow products in each period that actually has been switched to
for t in timeRange:
for p in prodRange:
logging.debug("(%s) == %s", [s[key].varName for key in s if key[2] == t and (key[1] == p or key[0] == p)], bx[p, t].varName)
model.addConstr(quicksum(s[key] for key in s if key[2] == t and (key[1] == p or key[0] == p)) >= bx[p,t], name="single_switch_" + str(t))
# Force bx = 1 iff x != 0
model.addConstr(x[p,t] >= bx[p,t])
model.addConstr(x[p,t] <= bigM * bx[p,t])
for t in timeRange:
# Allow only a single switch each period
logging.debug('Single switch constraint for ' + str([s[key].varName for key in s if key[2] == t]))
model.addConstr(quicksum(s[key] for key in s if key[2] == t) == 1, name="single_switch_" + str(t))
# Only allow connected switches between t-1 and t
for p in prodRange:
logging.debug('valid_switch for ' + str([s[key].varName for key in s if key[2] == (t-1) and key[1] == p]) + " and " + str([s[key].varName for key in s if key[2] == t and key[0] == p]))
model.addConstr(quicksum(s[key] for key in s if key[2] == (t-1) and key[1] == p) == quicksum(s[key] for key in s if key[2] == t and key[0] == p),
name="valid_switch_%d_%d" % (p, t))
# Machine can't be occupied for more then K hours / period
for t in timeRange:
logging.debug("sum {} + sum {} <= {}".format([x[key].varName + "*" + str(self.store["a"][key[0]-1]) for key in x if key[1] == t],
[s[key].varName + "*" + str(self.store["st"][key[0]-1][key[1]-1]) for key in s if key[2] == t], self.store["K"][t-1]))
model.addConstr(quicksum(x[key]*self.store["a"][key[0]-1] for key in x if key[1] == t) + quicksum(s[key]*self.store["st"][key[0]-1][key[1]-1] for key in s if key[2] == t) <= self.store["K"][t-1])
# Initial warehouse stock
for p in prodRange:
logging.debug("%s == %s", l[p, 0].varName, self.store["l"][p-1])
model.addConstr(l[p, 0] == self.store["l"][p-1])
# Update warehouse stock inbetween periods + enforce demand to be met
for t in range(1, tHor+1):
for p in prodRange:
logging.debug("{} = {} + {} - {}".format(l[p, t].varName, l[p, t-1].varName, x[p, t].varName, self.store["d"][p-1][t-1]))
model.addConstr(l[p, t] == l[p, t-1] + x[p, t] - self.store["d"][p-1][t-1])
# solve it
model.optimize()
# Debugging printouts
for y in model.getVars():
if y.x >= 0.001:
logging.debug("%s = %s cost %d", y.varName, y.x, y.x*y.obj)
for t in timeRange:
logging.debug("%s + %s", (["{}[{}] * {}".format(x[key].x, x[key].varName, self.store["a"][key[0]-1]) for key in x if key[1] == t]), ([str(s[key].varName) + "*" + str(self.store["st"][key[0]-1][key[1]-1]) for key in s if key[2] == t and s[key].x >= 0.001]))
#.........这里部分代码省略.........