python - Pulp 如何处理这些限制?
问题描述
我使用 Pulp 包来解决具有不等式约束的 MILP 问题。MILP 问题试图最小化安装设施平台以通过管道为客户提供服务的成本,以便每个平台可以处理一定数量的客户。代码示例如下所示:
import numpy as np
from pulp import *
import random
CUSTOMERS = range(1,17) ## generate random Customer Ids
FACILITY =['FAC 1','FAC 2'] # Number and Name of Facilities
randomCosts = random.sample(range(90, 100), 2) ## Generate Random Installation Costs
actcost = dict(zip(FACILITY, randomCosts)) ## Assign installation cost to each facility
randompipelineCost = random.sample(range(5, 20), 2) ## Generate Random pipeline Costs
pipelineCost = dict(zip(FACILITY, randompipelineCost))## Assign pipeline cost to each facility
sizeOfPlatforms = [10,10] ## Size of Platforms
maxSizeOfPlatforms = dict(zip(FACILITY, sizeOfPlatforms)) ## Assign Size to each Facility
serviceRandom=[]
serviceCosts = {}
for facility in FACILITY: ## Generate Random Service Costs for each customer
serviceRandom=[]
for i in range (16):
serviceRandom.append(random.randrange(1, 101, 1))
service = dict(zip(CUSTOMERS, serviceRandom))
serviceCosts[facility]=service
print 'CUSTOMERS', CUSTOMERS
print 'FACILITY', FACILITY
print 'Facility Cost', actcost
print 'pipeline Cost',pipelineCost
print 'service Cost', serviceCosts
prob = LpProblem("FacilityLocation",LpMinimize)
##Decision Variables
use_facility = LpVariable.dicts("UseFacility", FACILITY, cat=LpBinary)
use_customer = LpVariable.dicts("UseCustomer",[(i,j) for i in CUSTOMERS for j in FACILITY], cat=LpBinary)
## Objective Function
prob += lpSum(actcost[j]*use_facility[j] for j in FACILITY) + lpSum(pipelineCost[j]*use_facility[j] for j in FACILITY)+ lpSum(serviceCosts[j][i]*use_customer[(i,j)] for i in CUSTOMERS for j in FACILITY)
# Constraints
for j in FACILITY:
prob += lpSum(use_customer[(i,j)] for i in CUSTOMERS) <= maxSizeOfPlatforms[j]
for i in CUSTOMERS:
prob += lpSum(use_customer[(i,j)] for j in FACILITY) == 1
for j in FACILITY:
for i in CUSTOMERS:
prob += use_facility[j] >= lpSum(use_customer[(i,j)])
我的问题是,Pulp 或默认求解器 CPLEX 如何处理这些约束?
解决方案
如果在程序结束时添加
prob.solve(pulp.CPLEX_CMD(keepFiles=True))
print(pulp.LpStatus[prob.status])
for variable in prob.variables():
print ("{} = {}".format(variable.name, variable.varValue))
然后你会看到一些解决方案:
CUSTOMERS range(1, 17)
FACILITY ['FAC 1', 'FAC 2']
Optimal
UseCustomer_(1,_'FAC_1') = 1.0
UseCustomer_(1,_'FAC_2') = 0.0
UseCustomer_(10,_'FAC_1') = 0.0
UseCustomer_(10,_'FAC_2') = 1.0
还有两个文件:FacilityLocation-pulp 和 FacilityLocation-pulp.sol,它们可以帮助您了解发生了什么。
推荐阅读
- opengl - 如何在不需要任何窗口系统库的情况下使用 OpenGL 渲染到内存?
- sybase - sybase插入数据时出现invalid column name error是什么意思?
- python - 如何对依赖下拉列表进行ajax请求
- regex - 即使在线验证器将其标记为正确,基本正则表达式也会失败
- matlab - 不使用 for 循环生成迭代序列
- sql - PSQL,添加“步数增加”列
- python - 将 .NET 类库中的中间结果打印到 Jupyter 笔记本输出单元
- r - 在同一列中查找特定值之后的行
- php - 我的一些服务器的肥皂调用超时
- solidity - Solidity 智能合约:收到自定义令牌后功能未完全运行