#python #optimization #gurobi #mixed-integer-programming
Вопрос:
Я сталкиваюсь с проблемой в своей модели с кусочными ограничениями, которая делает мою одну из переменных решения равной нулю для каждого значения.
Моя целевая функция заключается в:
begin{equation}
min sum_{t=1}^T p_{t} cdot (1 r) cdot y_{t}
end{equation}
где p
цена, y
количество (переменная решения) и r
надбавка к цене. t
является индексом для периодов времени.
и мои ограничения таковы:
begin{equation}
M q_t > sum_{i=0}^N beta_{i} X_{it} - p_t (1 r) quad forall t=1,dotsc,T
end{equation}
begin{equation}
-M (1-q_t) leq sum_{i=0}^N beta_{i} X_{it} - p_t (1 r)quad forall t=1,dotsc,T
end{equation}
Проблема заключается в том, что значение r
зависит от того, на каком интервале находится значение y
(переменная решения), как показано следующей кусочной функцией:
begin{equation}
r_t (Y_t) =
begin{cases}
% s_0
0 amp; mathrm{if }; Y_t leq b_0 \
% s_1
0.05 amp; mathrm{if }; b_0 < Y_t leq b_1 \
% s_2
0.1 amp; mathrm{if }; b_1 < Y_t leq b_2\[6pt]
... amp; mathrm{if }; ...
end{cases}
end{equation}
где b_0, b_1
и т.д.-набор количественных интервалов = [0, 50, 100, 150, 200, 250]
Я написал кусочные ограничения в Gurobi (Python) в виде:
for t in range(1, T 1):
m.addGenConstrPWL(quantity[t], r,
[0, 50, 50, 100, 100, 150, 150, 200, 200, 250],
[0, 0, 0.05, 0.05, 0.1, 0.1, 0.15, 0.15, 0.2, 0.2]
)
m.addConstr(-M * (1 - q[t]) <= gp.quicksum(beta[i] * X[i, t]
for i in range(N 1)) - p[t] * (1 r),
name = "price threshold 1"
)
for t in range(1, T 1):
m.addGenConstrPWL(quantity[t], r,
[0, 50, 50, 100, 100, 150, 150, 200, 200, 250],
[0, 0, 0.05, 0.05, 0.1, 0.1, 0.15, 0.15, 0.2, 0.2]
)
m.addConstr(M * q[t]) >= gp.quicksum(beta[i] * X[i, t]
for i in range(N 1)) - p[t] * (1 r),
name = "price threshold 2"
)
где M
-большой M, q[t]
двоичная переменная, X[i,t]
заданное/известное значение, beta
двоичная переменная, а r
также двоичная переменная.
Существуют также некоторые другие ограничения, но проблема заключается в этих ограничениях.
Хотя модель оптимизирует программу, она делает все значения beta
переменной равными нулю, чего не должно быть.
Не мог бы кто-нибудь, пожалуйста, указать мне, где я совершаю ошибку, будь то при написании кусочного ограничения или в чем-то другом?
Любая помощь будет высоко оценена. Заранее спасибо.
Комментарии:
1. Я голосую за то, чтобы закрыть этот вопрос, потому что он здесь не подходит и уже был опубликован на ИЛИ StackExchange: or.stackexchange.com/questions/7089/…
2. @salidi — Это могло бы считаться проблемой программирования, если бы вы опубликовали полную программу.