#python #optimization #pulp
Вопрос:
Отказ от ответственности: Я новичок в Python.
У меня есть две проблемы с LP, которые мне нужно решить с помощью библиотеки PuLP. Первая модель рассматривает все мои объекты и общий спрос клиентов и решает, какие объекты «открыть» для обслуживания этого спроса, чтобы свести к минимуму транспортные расходы от объекта к клиенту. Эта первая модель будет учитывать только общий спрос на все продукты вместе взятые, а не индивидуальный спрос на артикулы. Эта модель работает нормально.
Результат для первой модели дал мне:
- Какие склады мы должны открыть
- Какой ОБЩИЙ спрос (все артикулы вместе взятые) будет обслуживать каждый склад и для каких клиентов
Например:
Услуги «Объект 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())
, где объект является оскорбительным элементом, чтобы выяснить, почему он настроен не так, как вы думаете.