Как добавить ограничения SOCP без утечки памяти на C ++? - PullRequest
0 голосов
/ 28 марта 2020

Я задавал этот вопрос раньше как "увеличение времени решения в oop" здесь; https://www.ibm.com/developerworks/community/forums/html/topic?id=0ef4c99b-3bcc-4105-ac98-57867d5427da, но форум в настоящее время недоступен.

Позже я понял, что квадратичные c ограничения программирования конусов второго порядка создают утечку памяти. Вот краткая версия кода (источник и заголовок можно найти по ссылке на форуме выше):

#include <header.h>
int main() {
 const int n = 10;
 const int ins = 30;
 // Parameters are read

 for (int i = 0; i < ins; i++) {
   IloEnv env;
   IloModel model(env);
   IloNumVarArray d(env, n + 1, 0, IloInfinity, ILOFLOAT);
   IloNumVarArray A(env, n + 1, -IloInfinity, IloInfinity, ILOFLOAT);
   IloNumVarArray C(env, n + 1, -IloInfinity, IloInfinity, ILOFLOAT);
   // Other variables are defined
   model.add((d[1] * d[1]) >= (A[1] * A[1]) + (C[1] * C[1])); // SOCP constraint 1
   model.add((d[2] * d[2]) >= (A[2] * A[2]) + (C[2] * C[2])); // SOCP constraint 2
   // Linear constraints are added according to the parameters of the instance
   // Solve method of IloCplex is called and outputs are collected
   env.end();
 }
}

Когда этот код выполняется, время решения увеличивается с увеличением i и Средство использования памяти Visual Studio показывает, что при каждом l oop происходит утечка памяти. Утечка памяти исчезает, если ограничения SOCP закомментированы. Странно, если добавляется только одно из этих ограничений SOCP, 1 или 2, память не протекает. Утечка происходит, только если они оба (или более других ограничений SOCP) добавлены одновременно.

Есть ли проблема в моем способе добавления этих квадратичных c ограничений?

Спасибо.

Редактировать: Для воспроизведения файла вы можете использовать следующую ссылку: https://drive.google.com/open?id=1AAPaSUhGwdGZ15c3MEb0atRQsrAel-mJ. Включает заголовок, источник и входные данные.

1 Ответ

0 голосов
/ 05 мая 2020

Эта проблема частично решена путем преобразования из CPLEX в GUROBI. По-видимому, у входов были некоторые проблемы с цифрами c, о которых GUROBI сообщает как предупреждение и которые могут быть причиной увеличения времени для подобных случаев в CPLEX. После нескольких изменений параметров оптимизации модель успешно решена без увеличения времени для последовательных экземпляров в GUROBI. Но я хочу упомянуть, что GUROBI все же удалось обеспечить субоптимальные результаты даже при проблемах с цифрами c, и даже в тех случаях не было никакого увеличения времени для последовательных экземпляров.

Кроме того, я хочу добавить что мне предложили изменить MKL_DISABLE_FAST_MM = 0, что упоминается как решение для некоторых утечек памяти в CPLEX. Однако это не решило мою проблему.

...