Я получаю ошибку в моем файле c ++ / gurobi:
Код ошибки = 10004 Невозможно получить атрибут ‘X’
Я читал, что это может быть связано с ярлыками? Но я не вижу, как возникает проблема.
Это работает для некоторых входных файлов, но не для других. Итак, я создал игрушечный файл, t5.txt во вложении. Этот файл не работает, но удаление последнего столбца и установка 8-7 исправляет его. Я озадачен…
Ниже приведен вывод model.write. Кажется, все имеет смысл, есть идеи, что я делаю не так?
Всякий раз, когда я делаю model.write (test.sol), программа останавливается, поэтому, похоже, что-то не так с решением>
Вложения:
main.cpp -> https://dl.dropboxusercontent.com/u/13564139/main.cpp
input.txt -> https://dl.dropboxusercontent.com/u/13564139/t5.txt
Maximize
15 student_has_projects4.1
Subject To
R0: student_has_projects0.0 + student_has_projects1.0
+ student_has_projects2.0 + student_has_projects3.0
+ student_has_projects4.0 + student_has_projects5.0
+ student_has_projects6.0 + student_has_projects7.0 <= 4
R1: student_has_projects1.0 + student_has_projects2.0 >= 1
R2: student_has_projects2.0 + 2 student_has_projects5.0 <= 2
R3: student_has_projects2.0 + 2 student_has_projects5.0 >= 1
R4: student_has_projects0.0 + student_has_projects3.0
+ student_has_projects4.0 + student_has_projects6.0
+ student_has_projects7.0 >= 1
R5: student_has_projects2.0 + student_has_projects5.0 <= 1
R6: student_has_projects0.1 + student_has_projects1.1
+ student_has_projects2.1 + student_has_projects3.1
+ student_has_projects4.1 + student_has_projects5.1
+ student_has_projects6.1 + student_has_projects7.1 <= 4
R7: student_has_projects1.1 + student_has_projects2.1 >= 1
R8: student_has_projects2.1 + 2 student_has_projects5.1 <= 2
R9: student_has_projects2.1 + 2 student_has_projects5.1 >= 1
R10: student_has_projects0.1 + student_has_projects3.1
+ student_has_projects4.1 + student_has_projects6.1
+ student_has_projects7.1 >= 1
R11: student_has_projects2.1 + student_has_projects5.1 <= 1
R12: student_has_projects0.2 + student_has_projects1.2
+ student_has_projects2.2 + student_has_projects3.2
+ student_has_projects4.2 + student_has_projects5.2
+ student_has_projects6.2 + student_has_projects7.2 <= 4
R13: student_has_projects1.2 + student_has_projects2.2 >= 1
R14: student_has_projects2.2 + 2 student_has_projects5.2 <= 2
R15: student_has_projects2.2 + 2 student_has_projects5.2 >= 1
R16: student_has_projects0.2 + student_has_projects3.2
+ student_has_projects4.2 + student_has_projects6.2
+ student_has_projects7.2 >= 1
R17: student_has_projects2.2 + student_has_projects5.2 <= 1
R18: student_has_projects0.0 + student_has_projects0.1
+ student_has_projects0.2 = 1
R19: student_has_projects1.0 + student_has_projects1.1
+ student_has_projects1.2 = 1
R20: student_has_projects2.0 + student_has_projects2.1
+ student_has_projects2.2 = 1
R21: student_has_projects3.0 + student_has_projects3.1
+ student_has_projects3.2 = 1
R22: student_has_projects4.0 + student_has_projects4.1
+ student_has_projects4.2 = 1
R23: student_has_projects5.0 + student_has_projects5.1
+ student_has_projects5.2 = 1
R24: student_has_projects6.0 + student_has_projects6.1
+ student_has_projects6.2 = 1
R25: student_has_projects7.0 + student_has_projects7.1
+ student_has_projects7.2 = 1
Bounds
Binaries
student_has_projects0.0 student_has_projects0.1 student_has_projects0.2
student_has_projects1.0 student_has_projects1.1 student_has_projects1.2
student_has_projects2.0 student_has_projects2.1 student_has_projects2.2
student_has_projects3.0 student_has_projects3.1 student_has_projects3.2
student_has_projects4.0 student_has_projects4.1 student_has_projects4.2
student_has_projects5.0 student_has_projects5.1 student_has_projects5.2
student_has_projects6.0 student_has_projects6.1 student_has_projects6.2
student_has_projects7.0 student_has_projects7.1 student_has_projects7.2
End
Проблема в том, что ваш экземпляр lp недопустим, поэтому вызов .optimize () приводит к недопустимому состоянию. Из вашего кода
model.write("test2.lp");
model.optimize();
model.write("forum2.sol");
if(model.get(GRB_IntAttr_Status) != GRB_OPTIMAL){
cout << "niet optimaal " << endl;
}
Вы пишете файл .sol, прежде чем проверять успешность. Gurobi получает атрибуты ‘X’ из переменных, когда пишет файл .sol. Если оптимизация не удалась, атрибуты ‘X’ недоступны и выдается исключение. Вы должны убедиться, что gurobi имеет решение, прежде чем писать файл .sol, или получить много атрибутов, включая «X», «Pi» и «ObjVal». ОПТИМАЛЬНО коды состояния уверяет вас, что существует доступное решение, но коды, такие как SUBOPTIMAL, также указывают, что решение доступно, а другие, такие как TIME_LIMIT, NODE_LIMIT, означают, что решение может быть доступно. Вы можете получить атрибут SolCount чтобы получить четкое указание на то, что решение доступно.
Ваш экземпляр проблемы неосуществим, потому что ограничения (R1, R7, R13 подразумевают, что вам нужно как минимум 3 проекта для учащихся 1 и 2, но ограничения (R19, R20) подразумевают, что они могут иметь ровно 1 проект каждый. Это можно увидеть с помощью IIS решатель. В интерактивном gurobi вы можете получить Неприводимая Несогласованная Подсистема
m = read("test2.lp")
m.optimize()
m.computeIIS()
m.write("test2.ilp")
Других решений пока нет …