Проблема с кусочным ограничением в Гуроби

#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 — Это могло бы считаться проблемой программирования, если бы вы опубликовали полную программу.