Запись переменных принятия решений и целевой функции в модели оптимизации целлюлозы

#python #optimization #pulp

Вопрос:

Отказ от ответственности: Я новичок в Python.

У меня есть две проблемы с LP, которые мне нужно решить с помощью библиотеки PuLP. Первая модель рассматривает все мои объекты и общий спрос клиентов и решает, какие объекты «открыть» для обслуживания этого спроса, чтобы свести к минимуму транспортные расходы от объекта к клиенту. Эта первая модель будет учитывать только общий спрос на все продукты вместе взятые, а не индивидуальный спрос на артикулы. Эта модель работает нормально.

Результат для первой модели дал мне:

  1. Какие склады мы должны открыть
  2. Какой ОБЩИЙ спрос (все артикулы вместе взятые) будет обслуживать каждый склад и для каких клиентов

    Например:

    Услуги «Объект 5» («Apple») = 350,0
    Услуги «Объект 5» («Motorola») = 200,0
    Услуги «Объект 2» («Huawei») = 300,0
    Услуги «Объект 2» («Samsung») = 150,0

Вторая проблема модели/LP должна быть детализирована до уровня отдельного продукта (артикула) и конкретно указывать мне, на каком объекте следует хранить артикул и какая часть спроса на отдельный продукт (артикул) должна обслуживаться с этого объекта.

Я хочу, чтобы вторая модель использовала только те средства, которые мы рекомендовали открыть на выходе первой модели. Например, если 1-я модель говорит нам открывать только «Объект 2» и «Объект 5», то вторая модель не должна выделять артикулы для любого объекта, кроме «Объекта 2 и 5».

вопрос:

Мне нужна помощь в написании переменных решения и целевой функции 2-й задачи/модели LP.** Мне нужно написать переменные решения/целевую функцию таким образом, чтобы я мог хранить каждый артикул на складе, который ближе всего к большинству клиентов, покупающих артикул. Каждый артикул может храниться только на 1 складе (или на 2 складах, если соблюден определенный порог спроса). Я хочу, чтобы 2-я модель дала мне такой результат:

 **1. STOCKING RECOMMENDATIONS:**  

'FAC 2': SKU 1: stock 200 lbs  
'FAC 2': SKU 2: stock 500 lbs  
'FAC 2': SKU 3: stock 0 lbs  


'FAC 5': SKU 1: stock 0 lbs  
'FAC 5': SKU 2: stock 0 lbs  
'FAC 5': SKU 3: stock 300 lbs  

**2. QTY SERV to CUSTOMER:**   

'FAC 2': SKU 1: service 150 lbs to 'Apple'  
'FAC 2': SKU 1: service 50 lbs to  'Samsung'    
'FAC 2': SKU 2: service 300 lbs to 'Huawei'  
'FAC 2': SKU 2: service 200 lbs to 'Apple'  
'FAC 2': SKU 3: service 0 lbs  


'FAC 5': SKU 1: service 0 lbs  
'FAC 5': SKU 2: service 0 lbs  
'FAC 5': SKU 3: service 100 lbs to 'Samsung'  
'FAC 5': SKU 3: service 200 lbs to 'Motorola' 
 

……………………………………………………………………………………………………………………………………..

 #Here's what I have so far for the second model:

**#lists/dictionaries, etc.**

Customer = ["Apple","Samsung","Huawei","Nokia","Motorolla"]  
Facility = ['Fac-1', 'Fac-2','Fac-3','Fac-4','Fac-5']  
Products = ['45906','48402','80591','102795','107275','128067','129522',]  
total_customer_demand={"Apple":80,"Samsung":270,"Huawei":250,"Nokia":160,"Motorolla":180}  
total_product_demand={'45906':143,'48402':131,'80591':194,'102795':105,'107275':80,'128067':138,'129522':149}  
Max_Supply={'Fac-1':950,'Fac-2':500,'Fac-3':500,'Fac-4':600,'Fac-5':700}  
fixed_cost={'Fac-1':1000,'Fac-2':1000,'Fac-3':1000,'Fac-4':800,'Fac-5':600}  

transportation_cost= {'Fac-1' : {"Apple":4,"Samsung":5,"Huawei":6,"Nokia":8,"Motorolla":10},  
                      'Fac-2' : {"Apple":6,"Samsung":4,"Huawei":3,"Nokia":5,"Motorolla":8},  
                      'Fac-3' : {"Apple":9,"Samsung":7,"Huawei":4,"Nokia":3,"Motorolla":4},  
                      'Fac-4' : {"Apple":3,"Samsung":4,"Huawei":8,"Nokia":4,"Motorolla":4},  
                      'Fac-5' : {"Apple":4,"Samsung":7,"Huawei":5,"Nokia":3,"Motorolla":2}  
                     }  

#Create a list within a list of customer demand for individual products  

indiv_product_demand=[  
    [10,25,26,30,52],#  Product# 45906  
    [14,63,9,39,6],# Product# 48402  
    [16,63,43,26,46], # Product# 80591  
    [4,33,43,13,12], #Product # 102795  
    [4,23,26,21,6], #Product # 107275  
    [18,48,17,9,46], #Product # 128067  
    [14,15,86,22,12] #Product # 129522  
                    ]  

#Make a dictionary out of the list w/in list above that contains customer demand for individual products    
product_demand = makeDict([Products,Customer],indiv_product_demand,0)  

.............................................................................................  
**#OUTPUT FROM 1ST MODEL (Recommended warehouses to use)**  
Establish Facility at site =  Fac-2  
Establish Facility at site =  Fac-5  

#Creating new list of "chosen facilities" which is output from the first model. This list will be used as a decision variable in LpProblem #2  

Tolerance = 0.0001  
chosen_facilities=[]  
for f in Facility:  
    if use_facility[f].varValue>Tolerance:  
        chosen_facilities.append(f)  

print(chosen_facilities)  
['Fac-2', 'Fac-5']  

#Creating a nested dict within a dict for LpVariable "qty_serv_customer"

qty_serv_customer = {} 

for f_ in Facility:
    item_f = {}
    for p_ in Products:
        item_p = {}
        for c_ in Customer:
            item_p[c_] = '' # Your value                                                                                                                      
        item_f[p_] = item_p
    qty_serv_customer[f_] = item_f

**#DECISION VARIABLES**

stock_at_WH = LpVariable.dicts("stock", chosen_facilities, 0, 1, LpBinary)  
qty_serv_customer = LpVariable.dicts("Service", [(cf,p,c) for cf in chosen_facilities for p in Products for c in Customer],0)  

**#SETTING THE 2ND LP PROBLEM**  
APTEW=LpProblem("Allocate_Product_to_each_Warehouse", LpMinimize)  

**#OBJECTIVE FUNCTION**  
APTEW  = (lpSum(fixed_cost[f]*stock_at_WH[cf] for cf in chosen_facilities)    
          lpSum(transportation_cost[f][c]*qty_serv_customer[cf][p][c] for cf in chosen_facilities for p in Products for c in Customer)) ''
 


………………………………………………………………………………………………………………………………………………………………………….

#Я знаю, что моя целевая функция неверна. При запуске кода я получаю сообщение «Ошибка ключа: ‘Fac-2′». Я также думаю, что есть проблема с переменной «qty_serv_customer». Переменные принятия решений и целевую функцию, возможно,придется переписывать с нуля. Заранее спасибо всем, кто может помочь или хотя бы указать мне правильное направление.

Комментарии:

1. Вы пытаетесь использовать «Fac-2» в качестве индекса для объекта, у которого его нет в качестве ключа. Удалите термины вашей целевой функции по одному за раз и посмотрите, в чем проблема. Затем print(object.keys()) , где объект является оскорбительным элементом, чтобы выяснить, почему он настроен не так, как вы думаете.