Я пытаюсь использовать scipy.optimize.linprog, чтобы минимизировать затраты, скажем, на заказ для онлайн-магазина.
Я хочу получить X Количество товара Y, и я знаю, сколько у продавца Z взапас для продукта Y. Эта проблема очень легко решается с помощью линейной программы, подобной этой:
Product1 Product2 Product3
seller1 has 3 4 5
seller2 has 0 1 10
wanted order 2 1 7
, что соответствует lp
min 1*x1 + 1*x2 + 1*x3 + 1*x4 + 0.9*x5 + 0.95*x6
s.t.
x1 <= 3
x2 <= 4
x3 <= 5
x4 <= 0
x5 <= 1
x6 <= 10
x1 + x4 >= 2
x2 + x5 >= 1
x3 + x6 >= 7
, где коэффициенты целевой функции - этоцена данного товара от данного продавца. В коде было бы это: (не показывая основные условия, такие как x1 <= 3 для простоты) </p>
from scipy.optimize import linprog
c = [1, 1, 1, 1, 0.9, 0.95]
A = [[-1, 0, 0, -1, 0, 0], [0, -1, 0, 0, -1, 0], [0, 0, -1, 0, 0, -1]]
b = [-2, -1, -7]
res = linprog(c, A_ub=A, b_ub=b, bounds=[(0, None),(0, None),(0, None)])
print(res)
, который работает совершенно нормально. Проблема сейчас: если я хочу заказать 300 различных продуктов, оптимальным решением было бы всегда сначала выбирать самые дешевые варианты, но это быстро приводит к заказам от множества разных продавцов, которые все взимают фиксированную сумму транспортных расходов (1 единица). )
У кого-нибудь есть идеи о том, как правильно это реализовать? Теоретически это так же просто, как иметь дополнительную переменную для каждого продавца со значением
seller1 = 1 if x1 + x2 + x3 > 0 else 0
и добавить ее к целевой функции
min 1*x1 + 1*x2 + 1*x3 + 1*x4 + 0.9*x5 + 0.95*x6 + seller1 + seller2
, но я не знаю, как правильно реализоватьчто в коде. Каждая комбинация условий, которые я пробовал до сих пор, всегда приводит к тому, что переменные для транспортных расходов равны 0, потому что мне нужно ограничение
seller1 >= 0
, в противном случае оптимальным решением будет оплата транспортных расходов для каждого продавца, даже еслиЯ не покупаю у них никаких продуктов.
Я надеюсь, что кто-то может мне помочь. Заранее спасибо:)