netflow.py


#!/usr/bin/env python3.7 #版权所有2023,Gurobi O狗万app足彩ptimization, LLC #解决多商品流动问题。两种产品manbetx官网手机登入(“铅笔”和“钢笔”)在两个城市(“底特律”和“丹佛”)生产,必须发送到三个城市(“波士顿”、“纽约”和“西雅图”)的仓库,以满足供应/需求(“流入[h,i]”)。# #运输网络中的流量必须遵守arc容量约束# ('capacity[i,j]')。目标是最小化arc #运输成本的总和('cost[i,j]')。import gurobipy as gp from gurobipy import GRB #基本数据commodities =['铅笔','钢笔']nodes =['底特律','丹佛','波士顿','纽约','西雅图']arcs, capacity = gp。multidict({(“底特律”、“波士顿”):100(“底特律”、“纽约”):80(“底特律”,“西雅图”):120(“掘金”、“波士顿”):120(“掘金”、“纽约”):120(“掘金”,“西雅图”):120})#成本三胞胎commodity-source-destination成本={(“铅笔”,“底特律”,“波士顿”):10(“铅笔”,“底特律”,“纽约”):20日(“铅笔”,“底特律”,“西雅图”):60岁(“铅笔”,“掘金”,“波士顿”):40岁(“铅笔”,“掘金”,“纽约”):40岁(“铅笔”,“掘金”,“西雅图”):30日(“笔”、“底特律”、“波士顿”):20日(“笔”,“底特律”,“纽约”):20日(“笔”,“底特律”,“西雅图”):80(“笔”、“掘金”,“波士顿”):60岁(“笔”、“掘金”,“纽约”):70(“笔”、“掘金”,“西雅图”):30}#(> 0)供应和需求(< 0)对小商品城流入={(“铅笔”,“底特律”):50岁(“铅笔”、“掘金”):60岁(“铅笔”,“波士顿”):-50(“铅笔”,“纽约”):-50(“铅笔”,“西雅图”):-10(“笔”,“底特律”):60岁(“笔”、“掘金”):40岁(“笔”、“波士顿”):-40, ('Pens', 'New York'): -30, ('Pens', 'Seattle'): -30} #创建优化模型m = gp.Model('netflow') #创建变量flow = m.d addvars (commodities, arcs, obj=cost, name="flow") # Arc-capacity约束m.d addconstrs ((flow。sum('*', i, j) <= capacity[i, j] for i, j in arcs), "cap") #使用Python循环# for i, j in arcs的等效版本:# m.d addconstr (sum(flow[h, i, j] for h in commodities) <= capacity[i, j], # "cap[%s, %s]" % (i, j)) #流量守恒约束m.d addconstrs ((flow, j))Sum (h, '*', j) +流入流量[h, j] ==流量。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]))