仓库选址规划 (aliyun.com)
import gurobipy as gb
from gurobipy import *
# parameters
setup_cost ={
"A":500,
"B":600,
"C":700,
"D":800
}
supply = {
"A":40,
"B":55,
"C":73,
"D":90
}
demand = {
"S1": 10,
"S2": 14,
"S3": 17,
"S4": 8,
"S5": 9,
"S6": 12,
"S7": 11,
"S8": 15,
"S9": 16
}
arcs, cost = gb.multidict({
('A', 'S1'): 55, ('A', 'S2'): 4, ('A', 'S3'): 17,('A', 'S4'): 33,('A', 'S5'): 47,('A', 'S6'): 98,('A', 'S7'): 19,('A', 'S8'): 10,('A', 'S9'): 6,
('B', 'S1'): 42, ('B', 'S2'): 12, ('B', 'S3'): 4,('B', 'S4'): 23,('B', 'S5'): 16,('B', 'S6'): 78,('B', 'S7'): 47,('B', 'S8'): 9,('B', 'S9'): 82,
('C', 'S1'): 17, ('C', 'S2'): 34, ('C', 'S3'): 65,('C', 'S4'): 25,('C', 'S5'): 7,('C', 'S6'): 67,('C', 'S7'): 45,('C', 'S8'): 13,('C', 'S9'): 54,
('D', 'S1'): 60, ('D', 'S2'): 8, ('D', 'S3'): 79,('D', 'S4'): 24,('D', 'S5'): 28,('D', 'S6'): 19,('D', 'S7'): 62,('D', 'S8'): 18,('D', 'S9'): 45
})
# model
model = gb.Model()
# decision var
plant = setup_cost.keys()
setup = model.addVars(plant, vtype = GRB.BINARY, name = "setup") # 是否建造工厂
flow = model.addVars(arcs, vtype = GRB.BINARY, name = "flow") # 是否选择某工厂给某商店送货
# constraints
# supply constraints
shop = demand.keys()
model.addConstrs((gb.quicksum(flow[p, s]*demand[s] for s in shop) <= supply[p]*setup[p] for p in plant), name = "supply constraints")
# every shop can only accept goods from one plant
model.addConstrs((flow.sum("*", s) == 1 for s in shop), name = "demand constraints")
# limit
model.addConstrs((flow[p, s] <= setup[p] for p in plant for s in shop), name = "setup constraints")
# obj
obj = flow.prod(cost) + setup.prod(setup_cost)
model.setObjective(obj)
model.optimize()
