я пытаюсь решить ЛП, но это не может не решить ...
Проблема в том, что если у меня есть шесть участков, нужно отправить туда людей для строительства дома. В шести областях есть некоторые подобласти друг для друга, каждая подобласть имеет разную стоимость, и для одной подобласти нужен только один человек, но во всей подобласти есть один человек в одной зоне, которую я могу использовать.
Например:
у меня пять человек могут отправить
Область 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 тика)
как я могу это исправить?
В соответствии с тем, как вы определили свою проблему, некоторые из переменных принудительно равны нулю, но вы делаете сумму равной 3. Самый простой способ отладки - это записать LP в текстовый файл, используя IloCplex.exportmodel()
Я использовал cplex.exportModel ("lpex1.lp"), и он показывает -> Создаваемые имена переменных по умолчанию x1, x2 ... Имена строк по умолчанию c1, c2 ... создаются. Что это означает?




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