netflow.py例子

netflow.py例子

我们的示例在小型网络上解决了多商品流程模型。在该示例中,两个城市(底特律和丹佛)生产了两个商品(铅笔和钢笔),必须在三个城市(波士顿,纽约和西雅图)的仓库运送到令人满意的需求。运输网络中的每个弧都具有与其相关的每单位成本,以及最大总运输能力。

这是我们示例的完整源代码(也可用 / examples/python/netflow.py)......


#!/usr/bin/env python3.7 # Copyright 2021, 狗万app足彩Gurobi Optimization, LLC #解决多商品流问题。两种产品manbetx官网手机登入(“铅笔”和“钢笔”)#在2个城市(“底特律”和“丹佛”)生产,必须送到3个城市(“波士顿”、“纽约”和“西雅图”)的#仓库以满足需求(“流入[h,i]”)。# #交通网络中的流量必须考虑arc容量约束# ('capacity[i,j]')。目标是最小化arc #运输成本的总和('cost[i,j]')。import gurobipy as gp from gurobipy import GRB # Base data commodities = [' pencil ', 'Pens'] nodes = ['Detroit', 'Denver', 'Boston', 'New York', 'Seattle'] arcs, capacity = gp. txt = '铅笔';multidict({('Detroit', 'Boston'): 100, ('Detroit', 'New York'): 80, ('Detroit', 'Seattle'): 120, ('Denver', 'Boston'): 120, ('Denver', 'New York'): 120, ('Denver', 'Seattle'): 120, ('Denver', 'Seattle'): 120}) # Cost for triplets商品-source-destination Cost = {('Pencils', 'Detroit', 'Boston'): 10, ('Pencils', 'Detroit', 'New York'):20日(“铅笔”,“底特律”,“西雅图”):60岁(“铅笔”,“掘金”,“波士顿”):40岁(“铅笔”,“掘金”,“纽约”):40岁(“铅笔”,“掘金”,“西雅图”):30日(“笔”、“底特律”、“波士顿”):20日(“笔”,“底特律”,“纽约”):20日(“笔”,“底特律”,“西雅图”):80(“笔”、“掘金”,“波士顿”):60岁(“笔”、“掘金”,“纽约”):70,(“笔”、“掘金”,“西雅图”):30}#需求对小商品城流入={(“铅笔”,“底特律”):50岁(“铅笔”、“掘金”):60岁(“铅笔”,“波士顿”):-50(“铅笔”,“纽约”):-50(“铅笔”,“西雅图”):-10(“笔”,“底特律”):60岁(“笔”、“掘金”):40岁(“笔”、“波士顿”):-40(“笔”、“纽约”):-30, ('Pens', 'Seattle'): -30} #创建优化模型m = gp.Model('netflow') #创建变量flow = m. addvars (commodities, arcs, obj=cost, name="flow") #创建优化模型m = gp.Model('netflow') #创建变量flow = m. addvars (commodities, arcs, obj=cost, name="flow")sum('*', i, j) <= capacity[i, j] for i, j in arcs), "cap") # Equivalent version using Python looping # for i, j in arcs: # m.addConstr(sum(flow[h, i, j] for h in commodities) <= capacity[i, j], # "cap[%s, %s]" % (i, j)) # Flow-conservation constraints m.addConstrs( (flow.sum(h, '*', j) + inflow[h, j] == flow.sum(h, j, '*') for h in commodities for j in nodes), "node") # Alternate version: # m.addConstrs( # (gp.quicksum(flow[h, i, j] for i, j in arcs.select('*', j)) + inflow[h, j] == # gp.quicksum(flow[h, j, k] for j, k in arcs.select(j, '*')) # for h in commodities for j in nodes), "node") # Compute optimal solution m.optimize() # Print solution if m.status == GRB.OPTIMAL: solution = m.getAttr('x', flow) for h in commodities: print('\nOptimal flows for %s:' % h) for i, j in arcs: if solution[h, i, j] > 0: print('%s -> %s: %g' % (i, j, solution[h, i, j]))