Линейное программирование Python Pulp с динамическими ограничениямиPython

Программы на Python
Anonymous
Линейное программирование Python Pulp с динамическими ограничениями

Сообщение Anonymous »

В настоящее время я использую Solver в Excel, чтобы найти оптимальное решение для производства. Вот текущая настройка:
Изображение


Речь идет об изготовлении обуви на роторном станке, то есть производство ведется партиями в повторениях. Например, одна партия будет «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])
В идеальном мире, если существует более одного оптимального решения, следует выбрать то, у которого наибольшее распространение разницы в прессе (т. е. то, которое с наименьшей максимальной разницей). То есть, если у одного решения абс диф 10 на размер и 10 размеров (всего 100), а у другого 20 + 80 = 100, то первое более оптимально для клиента.

Другим ограничением должно быть min(setup.repetitions для настройки в настройках, если setup.repetitions > 0) > 9 в основном ограничение повторений должно быть следующим:
  • Является целым числом
  • Либо 0 или больше 9. Насколько я понял, это невозможно в линейном программировании. хотя далеко.


Подробнее здесь: https://stackoverflow.com/questions/558 ... constraint

Вернуться в «Python»