简体   繁体   English

Pulp 如何处理这些限制?

[英]How does Pulp handle the constraints?

I have used Pulp package to solve a MILP problem with inequality constraints.我使用 Pulp package 来解决具有不等式约束的 MILP 问题。 The MILP problem attempts to minimize the cost of installing facility platforms to service customers with pipelines such that each platform can handle certain number of customers. MILP 问题试图最小化安装设施平台以通过管道为客户提供服务的成本,以便每个平台可以处理一定数量的客户。 An example of the code is shown below:代码示例如下所示:

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)])

My question, how does Pulp or the default solver CPLEX handle these constraints?我的问题是,Pulp 或默认求解器 CPLEX 如何处理这些约束?

If at the end of your program you add如果在程序结束时添加

prob.solve(pulp.CPLEX_CMD(keepFiles=True))
print(pulp.LpStatus[prob.status])
for variable in prob.variables():
    print ("{} = {}".format(variable.name, variable.varValue))

then you'll see some solutions:然后你会看到一些解决方案:

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

but also two files: FacilityLocation-pulp and FacilityLocation-pulp.sol that will help you see what happened.还有两个文件:FacilityLocation-pulp 和 FacilityLocation-pulp.sol,它们可以帮助您了解发生了什么。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM