IBM CPLEX - Как вернуть ссылку на именованную переменную? - PullRequest
2 голосов
/ 16 февраля 2012

Я использую IBM CPLEX для моделирования программы ограничений с использованием API C ++.

Я объявил массив bool var следующим образом:

IloEnv env;
IloBoolVarArray bVars(env);

Затем я добавляю 3 переменные кмассив и назначить им имена так:

bVars.add(IloBoolVar(env,"a"));
bVars.add(IloBoolVar(env,"b"));
bVars.add(IloBoolVar(env,"c"));

Мой вопрос:

Нужно ли мне знать индекс переменной (0,1 или 2) в этом массиве, чтобыссылаться / использовать переменную в выражении?

Я не могу найти способ ссылаться на переменную, используя присвоенные имена "a", "b" или "c".

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

«Имя» переменной в конструкторе используется при выполнении «exportModel» для файла .lp.Это полезно для интерактивной отладки, но не для доступа к вашему коду, и совсем не требуется.Если вы хотите использовать элементы массива в выражении, вам нужно знать индекс.Это не ассоциативный массив.Тем не менее, у вас есть немало других вариантов.Вы можете назначить их переменным c ++.

IloBoolVar a(env, "a");
IloBoolVar b(env, "b");
IloBoolVar c(env, "c");

Тип IloBoolVar является дескриптором реализации, поэтому также возможно сохранить значения в массиве, если вам это также необходимо.* В этом случае bvars [0] и a представляют одну и ту же переменную.Вы также можете использовать std :: map или хеш-таблицу для хранения переменных, если вам нужен произвольный доступ по имени.

0 голосов
/ 17 февраля 2012

Вы также можете определить массив как этот

IloBoolVarArray bvars( env , 3 );

Он автоматически создаст массив из 3 логических переменных, к которым вы можете обращаться оператором [], как любой массив.

Если в вашей программе много переменных, было бы лучше и проще использовать целочисленный индекс вместо имени.

...