Удаление ограничения из модели в gurobi c ++

У меня есть одно ограничение

после некоторой модификации я должен удалить это ограничение: model.addConstr (LHS10_2 ‹= LHS10_1) установлен из модели. model.remove () не работает. Как мне это сделать? Спасибо за помощь.

model.remove (LHS10_2 ‹= LHS10_1) не может работать.

for (i = 1; i <= ULD; i++)
    {
        for (j = 1; j <= station; j++)
        {
            GRBLinExpr LHS10_1 = 0;//自載飛航節線
            GRBLinExpr LHS10_2 = 0;//他航載飛航節線
            for (k = 2; k <= load; k++)
            {
                if (k == 2 || k == 3 || k == 7)
                {
                    for (l = 1; l <= (node - 2); l++)
                    {
                        for (m = 1; m <= Num_FAn[j][k][l]; m++)
                        {
                            LHS10_1 += p*X[i][j][k][l][FSAn[j][k][l][m]][FLAn[j][k][l][m]][FNAn[j][k][l][m]];
                        }
                    }
                }
                if (k == 4 || k == 5)
                {
                    for (l = 1; l <= (node - 2); l++)
                    {
                        for (m = 1; m <= Num_FAn[j][k][l]; m++)
                        {
                            LHS10_2 += X[i][j][k][l][FSAn[j][k][l][m]][FLAn[j][k][l][m]][FNAn[j][k][l][m]];
                        }
                    }
                }
            }
            model.addConstr(LHS10_2 <= LHS10_1);

        }
    }

person Betty    schedule 22.04.2019    source источник


Ответы (1)


Метод GRBModel :: addConstr () возвращает GRBConstr, который следует сохранить в локальной переменной. Позже вы можете использовать GRBModel :: remove (), чтобы снова удалить это конкретное ограничение из модели, т. е. вы можете сделать что-то вроде

// Array to hold added constraint objects
GRBConstr* c = new GRBConstr[nConstr];
for (int k = 0; k < nConstr, ++k) {
    // Create expressions LHS10_2 and LHS10_1 as needed
    // [...]
    // Add k-th constraint, grap object for later removal from model
    c[k] = model.addConstr(LHS10_2 <= LHS10_1);
}
// Do some stuff, optimize, etc.
// [...]
// now delete unwanted constraints from model
for (int k = 0; k < nConstr, ++k) {
    model.remove(c[k]);
}
person Robert    schedule 22.04.2019
comment
Спасибо за репликацию. Но попробовал ваш метод, он не эффективен. У вас есть какой-нибудь способ решить эту проблему? Большое Вам спасибо. - person Betty; 24.04.2019
comment
GRBConstr d; model.addConstr (LHS10_2 ‹= LHS10_1); d = model.addConstr (LHS10_2 ‹= LHS10_1); model.remove (d); mode.update (); - person Betty; 24.04.2019
comment
Что вы имеете в виду под этим? В фрагменте, который вы разместили в комментарии, вы добавляете одно и то же ограничение LHS10_2 <= LHS10_1 дважды, следовательно, после удаления d первое будет сохраняться. - person Robert; 24.04.2019
comment
Извините, я плохо объяснил проблему. Потому что я хочу удалить ограничения из этой модели (ULD = 3, station = 10). Таким образом, всего существует тридцать ограничений для model.addConstr (LHS10_2 ‹= LHS10_1); Метод, на который вы мне ответили, может удалить только одно ограничение. Я хочу знать, как удалить эти ограничения. Я благодарен за вашу помощь. Большое вам спасибо. - person Betty; 24.04.2019
comment
Если вы хотите удалить несколько ограничений из модели, вы должны отслеживать все такие ограничения, которые вы хотите удалить позже. Я обновил свой ответ, чтобы охватить этот случай. - person Robert; 24.04.2019
comment
Спасибо за репликацию. Я могу успешно снять ограничения. Но почему объективное значение не изменится? Большое спасибо. - person Betty; 25.04.2019
comment
Вполне возможно, что удаление ограничений (и разрешение) не изменяет оптимальное целевое значение или решение. - person Robert; 25.04.2019
comment
@Robert, когда вы выполняете итерацию по nConstr и всегда используете условие if для этого ограничения, и если какое-то условие выполняется, вы удаляете это ограничение, мы нарушим порядок ограничений? Например, я перебираю 3 ограничения. Запускаю с с1, удаляю. Теперь, если я вызываю c [2], вызываю ли я исходный c [2] или c [3], поскольку 1 удален? - person independentvariable; 14.02.2020