1、问题描述:假设有一个需求点的位置集合和一个设施的位置集合,且已知每个设施的服务范围。在满足覆盖所有需求点顾客的前提下,选取若干个点建造设施,以使得建设总成本最小。要求满足客户集合内所有客户的需求的前提下,合理对设施进行选址达到建设成本最小。
2、模型构建
3、代码实现
from gurobipy import *
import random
import numpy as np
# Parameters 参数
num_ponits = 5 # I: set of the demand ponits
num_facilities = 10 # J: set of possible facility location
setup_cost = [3,2,3,1,3,3,4,3,2,4] # f: cost of locate each facility
np.random.seed(0)
cover = np.random.randint(2,size=(num_ponits,num_facilities))
#Creat a new model
m = Model("Covering Model")
# Create variables
select = m.addVars(num_facilities, vtype=GRB.BINARY,name='Select') # X
# 添加约束
m.addConstrs((quicksum((cover[i,j]*select[j]) for j in range(num_facilities)) >=1 for i in range(num_ponits)),name='Cover' )
#添加目标函数
m.setObjective(select.prod(setup_cost),GRB.MINIMIZE) #gurobi构建线性表达式,变量的系数为1时使用sum方法,变量的系数不为1时使用prod方法(变量和系数相乘后累加)
m.optimize()
for v in m.getVars():
if v.x >0:
print('%s %g'% (v.varName, v.x))
print('obj:%g'%m.objVal)
参考文献
[1] 运小筹:优化 | 五个经典设施选址模型的详解及其实践:Python调用Gurobi实现