GUROBI案例实战(一)——Supply Network Design(网络流模型)

GUROBI官方给出的案例,但本篇实现方式与其有些不一样,并且对一些函数给出了解释:ymodeling-examples/supply_network_design/supply_network_design_1.ipynb at master · Gurobi/modeling-examples (github.com)

一、问题描述

给定两个工厂、四个中转站、六个客户:

FactorySupply(最大生产量)
F1 150,000
F2200,000
DepotThroughput(吞吐量:中转站不生产、不消耗资源,只是传递资源)
D170,000
D250,000
D3100,000
D440,000
CustomersDemands(需要的资源)
C150,000
C210,000
C340,000
C435,000
C560,000
C620,000

二、建模

1.集合

工厂集合:f \in F =\left \{ F1,F2 \right \}

中转站集合:d\in D = \left \{ D1, D2, D3, D4\right \}

客户点集合:c \in C=\left \{ C1, C2, C3, C4, C5, C6 \right \}

2.参数

工厂f的最大生产能力 :supply_{f}\in R^{+}

中转站d的最大吞吐量:through_{d}\in R^{+}

客户c的资源需求:demand_{c}\in R^{+}

从节点s到节点t的单位资源的运输成本:cost(s,t) \in R^{+}

3.决策变量

从节点s到节点t运输的资源数量:flow_{s,t}

4.目标函数

最小化总的运输成本: min z = \sum cost_{s,t}*flow_{s,t}

5.约束条件

工厂的产量约束:\sum_{t} flow_{f,t} <= supply_{f}

中转站的吞吐量约束:\sum_{f} flow_{f, d}<=through_{d}

中转站的流量平衡约束:\sum_{f} flow_{f,d} == \sum_{c}flow_{d,c}

客户点的需求约束:\sum_{s}flow_{s,c} == demand_{c}

三、代码实现

import gurobipy as gp
from gurobipy import *
# 参数
supply = dict({
    "F1": 150000,
    "F2": 200000
})

through = dict({
    "D1": 70000,
    "D2": 50000,
    "D3": 100000,
    "D4": 40000
})

demand = dict({
    "C1": 50000,
    "C2": 10000,
    "C3": 40000,
    "C4": 35000,
    "C5": 60000,
    "C6": 20000
})

arcs, cost = gp.multidict({
    ("F1","D1"): 0.5,
    ("F1","D2"):0.5,
    ("F1","D3"): 1.0,
    ("F1","D4"):0.2,
    ("F1","C1"):1.0,
    ("F1","C3"):1.5,
    ("F1","C4"):2.0,
    ("F1","C6"):1.0,
    ("F2","D2"):0.3,
    ("F2","D3"):0.5,
    ("F2","D4"):0.2,
    ("F2","C1"):2.0,
    ("D1","C2"):1.5,
    ("D1","C3"):0.5,
    ("D1","C5"):1.5,
    ("D1","C6"):1.0,
    ("D2","C1"):1.0,
    ("D2","C2"):0.5,
    ("D2","C3"):0.5,
    ("D2","C4"):1.0,
    ("D2","C5"):0.5,
    ("D3","C2"):1.5,
    ("D3","C3"):2.0,
    ("D3","C5"):0.5,
    ("D3","C6"):1.5,
    ("D4","C3"):0.2,
    ("D4","C4"):1.5,
    ("D4","C5"):0.5,
    ("D4","C6"):1.5
})
print(arcs)
# model
model = gp.Model()
# decision var
flow = model.addVars(arcs, vtype = GRB.CONTINUOUS, name = "flow")  # flow为tupledict
print(flow)
# constraints
# factory production
factory = supply.keys()
model.addConstrs((flow.sum(f, "*") <= supply[f] for f in factory), name = "factory constraints")
# depot constraints
depot = through.keys()
model.addConstrs((flow.sum("*", d) <= through[d] for d in depot), name = "depot constraint 1")
model.addConstrs((flow.sum("*", d) == flow.sum(d, "*") for d in depot), name = "depot constraint 2")
# customer constraints
customers = demand.keys()
model.addConstrs((flow.sum("*", c) == demand[c] for c in customers), name = "customers constraints")
# objective
obj = flow.prod(cost)
model.setObjective(obj, GRB.MINIMIZE)

# optimize
model.write("test.lp")
model.update()
model.optimize()

提示:上述代码实现中用到的multidict()、sum()、prod()等在另一篇帖子里有详细介绍

写文章-CSDN创作中心

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 谢谢您的问题。 要编写一个简单的 Gurobi 模型,您需要执行以下步骤: 1. 安装 Gurobi 和它的 Python 接口。 2. 导入 Gurobi Python 模块。 3. 创建一个 Gurobi 模型对象。 4. 向模型中添加变量。 5. 向模型中添加目标函数和约束条件。 6. 调用求解器来解决模型。 7. 获取并处理结果。 以下是一个简单的例子,展示了如何构建一个线性规划模型,然后使用 Gurobi 求解器解决它: ``` import gurobipy as gp # 创建一个模型 m = gp.Model() # 创建两个变量 x = m.addVar(name="x") y = m.addVar(name="y") # 设置目标函数 m.setObjective(2 * x + 3 * y, sense=gp.GRB.MAXIMIZE) # 添加约束条件 m.addConstr(x + y <= 100) m.addConstr(x >= 0) m.addConstr(y >= 0) # 解决模型 m.optimize() # 输出结果 print(f"Optimal solution found: {m.status == gp.GRB.OPTIMAL}") print(f"Optimal value: {m.objVal}") print(f"x value: {x.x}") print(f"y value: {y.x}") ``` 希望这能帮到您!如果您有其他问题,请随时联系我。 ### 回答2: 编写一个简单的 Gurobi 模型,需要以下步骤: 1. 导入 Gurobi 模块: ``` import gurobipy as gp ``` 2. 创建一个模型对象: ``` model = gp.Model("简单模型") ``` 3. 添加决策变量: ``` x = model.addVar(name="x") y = model.addVar(name="y") ``` 4. 设置目标函数: ``` model.setObjective(2*x + 3*y, sense=gp.GRB.MAXIMIZE) ``` 5. 添加约束条件: ``` model.addConstr(x + y <= 10, "约束1") model.addConstr(2*x - y >= 0, "约束2") model.addConstr(x >= 0, "约束3") model.addConstr(y >= 0, "约束4") ``` 6. 求解模型: ``` model.optimize() ``` 7. 打印最优解和目标函数值: ``` print("x 的最优值为:", x.x) print("y 的最优值为:", y.x) print("目标函数值为:", model.objVal) ``` 以上是一个简单的 Gurobi 模型的编写过程,可以根据实际问题进行调整和扩展。编写模型时,可以使用更多的变量、约束条件和其他 Gurobi 提供的功能,以满足问题需求。在求解模型后,还可以获取其他信息,如松弛变量的值、对偶变量的值等。 ### 回答3: 编写一个简单的Gurobi模型可以分为几个基本步骤: 第一步,引入Gurobi模型库: 要使用Gurobi库,需要在Python脚本的开头添加以下代码: ``` import gurobipy as gp from gurobipy import GRB ``` 第二步,创建一个模型对象: 使用gp.Model()函数创建一个新的模型对象,例如: ``` model = gp.Model('myModel') ``` 第三步,定义决策变量: 使用addVar()函数在模型中定义决策变量,指定变量的名称、上下界等参数,例如: ``` x = model.addVar(vtype=GRB.CONTINUOUS, lb=0, ub=1, name='x') y = model.addVar(vtype=GRB.CONTINUOUS, lb=0, ub=1, name='y') ``` 第四步,设置目标函数: 使用setObjective()函数设置模型的目标函数,指定目标函数的表达式以及最大化或最小化,例如: ``` model.setObjective(2*x + 3*y, GRB.MAXIMIZE) ``` 第五步,设置约束条件: 使用addConstr()函数添加约束条件,指定约束条件的表达式并设置上下界,例如: ``` model.addConstr(x + 2*y <= 3, 'c1') model.addConstr(2*x - y >= 1, 'c2') ``` 第六步,求解模型: 使用optimize()函数求解模型,并获取最优解,例如: ``` model.optimize() ``` 第七步,获取结果: 获取求解后的决策变量的取值,目标函数的值等结果信息,例如: ``` x_value = x.x y_value = y.x obj_value = model.objVal ``` 最后,可以根据需要使用Gurobi提供的其他功能,如设定启发式算法、设置时间限制等来进一步细化和优化模型。 以上是一个简单的Gurobi模型的编写过程,可以根据实际问题的需要进行相应的调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值