【问题标题】:How does Pulp handle the constraints?Pulp 如何处理这些限制?
【发布时间】:2020-12-14 23:22:01
【问题描述】:

我使用 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 如何处理这些约束?

【问题讨论】:

    标签: python optimization linear-programming cplex pulp


    【解决方案1】:

    如果你在程序的最后添加

    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 这将帮助您了解发生了什么。

    【讨论】:

    • 嗨,亚历克斯。我不记得我们之前有没有说过。我在这里编辑了很多素材,我注意到你的素材看起来有点草率和随意,就好像你在为聊天室做贡献一样。单词拼写错误,区分大小写错误,并添加了健谈/对话材料。您可以开始使用拼写检查器,并以技术写作为目标吗?
    • 嗨,很难不回答“嗨”或“你好”,更难不写“问候”在最后。可以肯定的是,这并没有直接的帮助,但这会让互动更加愉快。
    • 我理解这种观点。然而,社区故意不希望这些东西在这里——它是一个问答网站,而不是一个论坛。你熟悉关于这个主题的 Meta 讨论吗?
    猜你喜欢
    • 2013-03-30
    • 1970-01-01
    • 2020-06-03
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多