Scipy.optimize.linprog с более сложными условиями - PullRequest
0 голосов
/ 01 декабря 2019

Я пытаюсь использовать 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

, в противном случае оптимальным решением будет оплата транспортных расходов для каждого продавца, даже еслиЯ не покупаю у них никаких продуктов.

Я надеюсь, что кто-то может мне помочь. Заранее спасибо:)

...