首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求解容量选址问题的Gurobi算法

求解容量选址问题的Gurobi算法
EN

Stack Overflow用户
提问于 2021-01-30 22:52:38
回答 1查看 63关注 0票数 0

我正在尝试从名为capa的OR数据库中解决容量定位问题

或文件here

答案应该是:

capa 19240822.449 (capacity 8000)

但我发现:

Best objective 3.145815023928e+08

这肯定是我的代码中的一个问题……有人能帮我吗?也许我在优化公式上做错了什么.或者关于我的运输需求的构建。我真的不知道,因为它在我看来是正确的。

任何帮助都将不胜感激。提前感谢

代码语言:javascript
复制
from itertools import product
from math import sqrt
import gurobipy as gp
from gurobipy import GRB
import time

# Get Clients and Facilities
def getFacilities_Clients(file_list):
    return int(file_list[0]), int(file_list[1])

# Get Facilities Fixed Costs
def getFacilities_STRCapacity_FixedCosts(file_list, num_facilities):
    shift = 2
    capacity = []
    cost = []
    
    #loop to get all i location costs
    for i in range(0,num_facilities*2,2):
        #capacity.append(file_list[i+shift])
        capacity.append(8000)
        cost.append(int(file_list[i+1+shift].replace(".","")))
    
    return capacity, cost

# Get Demand and Allocation Costs for j(customer) to each i(client)
def getClient_Demand_AllocationCosts(file_list, num_facilities, num_customers):
    shift = 2 + (num_facilities*2)
    demand = []
    allocation_cost = []
    
    #loop to get all j Clients 
    j=0
    for r in range(0,num_customers):
    
        #get demand
        demand.append(int(file_list[j+shift]))

        #loop to get all i location costs
        for i in range(0,num_facilities):
            allocation_cost.append(float(file_list[j+1+i+shift]))
            
        #fix j
        j += num_facilities+1
 
    
    return demand, allocation_cost

#Read File from OR datasets
fileName='datasets/ORcapa'
ORlist = []

with open(fileName, "r") as f:
    ORlist = f.read().split()

##### Sets and Indices #####
num_facilities, num_customers = getFacilities_Clients(ORlist)
capacity, fixed_cost = getFacilities_STRCapacity_FixedCosts(ORlist, num_facilities)
cartesian_prod = list(product(range(num_customers), range(num_facilities)))
# shipping costs
demand, alloc_cost = getClient_Demand_AllocationCosts(ORlist, num_facilities, num_customers)
shipping_cost = dict(zip(cartesian_prod, alloc_cost))

shipping_demand={}
for k, v in shipping_cost.items():
    shipping_demand[k] = v * demand[k[0]]

#setup cost
setup_cost = fixed_cost
#demand of customer
dc = demand
#max production
maxp= capacity

start = time.time()
# MIP  model formulation
m = gp.Model('CFLP')

##### Decision Variable #####
x = m.addVars(num_facilities, vtype=GRB.BINARY, name='x')
y = m.addVars(cartesian_prod, ub=1, vtype=GRB.CONTINUOUS, name='y')

##### Constraints #####
m.addConstrs((y[(c,f)] <= x[f] for c,f in cartesian_prod), name='Shipping')
m.addConstrs((gp.quicksum(y[(c,f)] for f in range(num_facilities)) == 1 for c in range(num_customers)), name='Demand')
m.addConstrs((gp.quicksum(dc[c]*y[(c,f)] for c in range(num_customers)) <= maxp[f]*x[f] for f in range(num_facilities)), name='Capacity')

##### Objective Function #####
m.setObjective(x.prod(setup_cost)+y.prod(shipping_demand), GRB.MINIMIZE)

m.Params.Method = 1
# Options are:-1=automatic, 0=primal simplex, 1=dual simplex, 2=barrier, 3=concurrent, 4=deterministic concurrent, 5=deterministic concurrent simplex

m.optimize()
end = time.time()
EN

回答 1

Stack Overflow用户

发布于 2021-02-04 04:23:02

这解决了我的问题:

m.setObjective(x.prod(setup_cost)+y.prod(shipping_cost),GRB.MINIMIZE)

我在计算一个不同的运费价值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65969365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档