Есть ли способ моделировать динамическое (не) линейное программирование в Python? - PullRequest
0 голосов
/ 10 октября 2019

Это проблема стоимости и объема, когда мы пытаемся найти оптимальный объем, который минимизирует стоимость.

Была использована функция минимизации от Scipy optimize: scipy.optimize.minimize.

Total Cost = Total Purchasing Cost + Total Holding 

Cost where:

Purchasing Cost = Cost1*V1+ Cost2*V2 + Cost3*V3

TV = Total Volume = V1 + V2 + V3

Holding Cost = Average Inventory * Value of Inventory * Cost of Capital (%)

Cost of Capital (%) = 0.1

1. Average Inventory = (Opening Inventory + Closing Inventory)/2

2. Closing Inventory = Opening Inventory + TV - c

  c = consumption

The average inventory affects the total cost, and the closing inventory is related to the opening inventory as below:

Denote Opening Inventory = OI

Denote Closing Inventory = CI

The opening inventory at time 1 is the closing inventory at time 0

 OI[i] = CI[i-1]

 OI[1] = CI[0]

 CI[i-1] = OI[i-1] + TV[i-1] - c[i-1]

 CI[0] = OI[0] + TV[0] - c[0]

Приведенный ниже код является попыткой моделирования ограничения, при котором итоговый запас не может опуститься ниже 1200 или превысить 400

400 <= CI <= 1200

(Следует также отметить, что OI[0]известен и является константой, тогда как OI[i] от 1 до 27 зависит от TV и c.)

OI = np.zeros(n)
OI[0] = OI_init
CI = np.ones(n)
consumption = np.ones(n)*100
CI[0] = OI_init - consumption[0]
c = consumption[0]

# constraint for time 0 only
k1 = {'type': 'ineq', 'fun': lambda x, c=c: -(OI_init + x[0] + x[28] + x[56] -c -1200)}
k2 = {'type': 'ineq', 'fun': lambda x, c=c: OI_init + x[0] + x[28] + x[56] -c - 400}
cons.append(k1)
cons.append(k2)

# constraint for time 1 onwards
for factor in range(1,28):
    OI_cur = 400
    #consp_cur = consumption[factor]
    k = {'type': 'ineq', 'fun': lambda x, OI_cur=OI_cur, i =factor: -(OI_cur + x[i] + x[i+28] + x[i+56] - 100 - 1200)}
    m = {'type': 'ineq', 'fun': lambda x, OI_cur=OI_cur, i =factor: OI_cur + x[i] + x[i+28] + x[i+56] - 100 - 400}
    cons.append(k)
    cons.append(m) 

Ожидаемый результат (или, скорее, желаемый результат) - это объем, который минимизируетстоимость, но сохраняет уровень запасов выше 400 и ниже 1200. Что мы хотим знать, так это как смоделировать ограничение инвентаря, которое обновляется при перемещении т от 1 до 28.

Пожалуйста, прости меня, если мое объяснение неубедительно исбиваю с толку, я впервые задаю вопрос, не стесняйтесь задавать вопросы для дальнейшего разъяснения!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...