Как решить CPLEX с помощью Java: строка невозможности 'c2': 0 = -3

я пытаюсь решить ЛП, но это не может не решить ...

Проблема в том, что если у меня есть шесть участков, нужно отправить туда людей для строительства дома. В шести областях есть некоторые подобласти друг для друга, каждая подобласть имеет разную стоимость, и для одной подобласти нужен только один человек, но во всей подобласти есть один человек в одной зоне, которую я могу использовать.

Например:

у меня пять человек могут отправить

Область A1 ---> 3 подобласти: A11, A12, A13

A2 ---> 3 подобласти: A21, A22, A23

A3 ---> 3 подобласти: A31, A32, A33

A4 ---> 3 подобласти: A41, A42, A43

A5 ---> 3 подобласти: A51, A52, A53

A6 ---> 3 подобласти: A61, A62, A63

теперь я использовал cplex, чтобы выбрать минимальную стоимость для отправки людей, если я предполагаю, что у A1 есть минимальная стоимость, поэтому я отправляю трех человек на A11, A12, A13.

Тогда я останусь двумя людьми, которые могут отправить, но ни в одной области нет двух подзон, поэтому я не могу отправлять больше.

с этим кодом

double[][] A = new double[6][];
A[0] = new double[3];
A[1] = new double[3];
A[2] = new double[3];
A[3] = new double[3];
A[4] = new double[3];
A[5] = new double[3];

//cost of sub area
A[0][0] = 999;
A[0][1] = 397;
A[0][2] = 698;

A[1][0] = 1717;
A[1][1] = 1147;
A[1][2] = 1192;

A[2][0] = 1752;
A[2][1] = 1154;
A[2][2] = 1453;

A[3][0] = 2059;
A[3][1] = 1528;
A[3][2] = 1788;

A[4][0] = 601;
A[4][1] = 270;
A[4][2] = 357;

A[5][0] = 1113;
A[5][1] = 815;
A[5][2] = 928;


// x for decision variable, if I dispatch person to sub area x = 1.
IloNumVar[][] x = new IloNumVar[6][];

for (int i = 0; i < x.length; i++) {

    x[i] = cplex.boolVarArray(A[i].length);

}



 IloLinearNumExpr numExpr_total = cplex.linearNumExpr();

    for (int i = 0; i < A.length; i++) {

        IloLinearNumExpr numExpr = cplex.linearNumExpr();           

        for (int j = 0; j < A[i].length; j++) {

            numExpr.addTerm(1.0, x[i][j]);

            numExpr_total.addTerm(1.0, x[i][j]);

       }

       cplex.addEq(numExpr, A[i].length);           
       cplex.addLe(numExpr_total, peopleNum);

    }

    loLinearNumExpr object = cplex.linearNumExpr();

    for (int i = 0; i < A.length; i++) {

        for (int j = 0; j < A[i].length; j++) {

             object.addTerm(A[i][j], x[i][j]);

        }

    }

cplex.addMaximize(object);

поэтому, когда я запускаю программу, я показываю ошибку

CPXPARAM_Read_APIEncoding "UTF8"

Строка невозможности "c2": 0 = -3.

Время предварительного растворения = 0,00 сек. (0,01 тика)

как я могу это исправить?

Часто хороший способ отладки кода Cplex - это записать LP-файл и посмотреть, какая модель на самом деле создается.

Erwin Kalvelagen 20.05.2018 13:27

В соответствии с тем, как вы определили свою проблему, некоторые из переменных принудительно равны нулю, но вы делаете сумму равной 3. Самый простой способ отладки - это записать LP в текстовый файл, используя IloCplex.exportmodel()

Ram Narasimhan 20.05.2018 16:29

Я использовал cplex.exportModel ("lpex1.lp"), и он показывает -> Создаваемые имена переменных по умолчанию x1, x2 ... Имена строк по умолчанию c1, c2 ... создаются. Что это означает?

E Gary 20.05.2018 16:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
845
1

Ответы 1

Как сказал Эрвин, изучение файла .lp вашей модели обычно является лучшим способом начать отладку. Однако мне часто случалось, что основная причина (-ы) недопустимых строк не была очевидна из-за наличия нескольких других ошибочных ограничений или границ. В таких случаях CPLEX предоставляет «корректор конфликтов», который помогает сузить круг потенциальных членов причинно-следственной модели. Здесь - это то, как вы вызываете инструмент с помощью JAVA API.

Ладно, попробую исправить. Спасибо за ваш ответ!

E Gary 22.05.2018 08:33

Другие вопросы по теме