
Речь идет об изготовлении обуви на роторном станке, то есть производство ведется партиями в повторениях. Например, одна партия будет «10x A1» (см. A1 в таблице), что даст 10x размера 36, 20x размера 37... 10x размера 41.
Есть некоторые префиксные настройки; А1, А2; R7... как вы видите в таблице выше.
Затем есть запрошенная переменная (или, скорее, список переменных), которая в основном говорит, что запрошенное клиентом количество по размеру.
Цель – найти такой набор повторений, который максимально точно соответствует запрошенному количеству. Следовательно, в решателе (извините за скриншот не на английском языке) вы можете видеть, что целью является N21 (то есть сумма абсолютных разностей для каждого размера). Переменные: N2:N9 — это количество повторений для каждой настройки, и единственным ограничением является то, что N2:N9 — целое число.
Как можно Я моделирую это поведение с помощью Python? Мой старт:
Код: Выделить всё
from collections import namedtuple
from pulp import *
class Setup(namedtuple('IAmReallyLazy', 'name ' + ' '.join(f's{s}' for s in range(36, 47)))):
# inits with name and sizes 's36', 's37'... 's46'
repetitions = 0
setups = [
Setup('A1', 1, 2, 3, 3, 2, 1, 0, 0, 0, 0, 0),
Setup('A2', 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 0),
Setup('R7', 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 0),
Setup('D1', 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0),
# and others
]
setup_names = [s.name for s in setups]
requested = {
's36': 100,
's37': 250,
's38': 300,
's39': 450,
's40': 450,
's41': 250,
's42': 200,
}
def get_quantity_per_size(size: str) -> int:
return sum([getattr(setup, size) * setup.repetitions for setup in setups])
def get_abs_diff(size: str) -> int:
requested_size = requested.get(size, 0)
return abs(get_quantity_per_size(size) - requested_size)
problem = LpProblem('Optimize Batches', LpMinimize)
# goal is to minimise the sum(get_abs_diff(f's{size}') for size in range(36, 47))
# variables are [setup.repetitions for setup in setups]
# constraints are all([isinstance(setup.repetitions, int) for setup in setups])
Другим ограничением должно быть min(setup.repetitions для настройки в настройках, если setup.repetitions > 0) > 9 в основном ограничение повторений должно быть следующим:
- Является целым числом
- Либо 0 или больше 9. Насколько я понял, это невозможно в линейном программировании. хотя далеко.
Подробнее здесь: https://stackoverflow.com/questions/558 ... constraint