dor*_*ien 5 c++ math mathematical-optimization linear-programming gurobi
我在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
Run Code Online (Sandbox Code Playgroud)
问题是你的lp实例是不可行的,因此对.optimize()的调用会导致不可行的状态.从你的代码
model.write("test2.lp");
model.optimize();
model.write("forum2.sol");
if(model.get(GRB_IntAttr_Status) != GRB_OPTIMAL){
cout << "niet optimaal " << endl;
}
Run Code Online (Sandbox Code Playgroud)
在检查成功之前,您正在编写.sol文件.Gurobi在写入.sol文件时从变量中获取"X"属性.如果优化失败,则"X"属性不可用并抛出异常.在编写.sol文件之前,你应该确保gurobi有一个解决方案,或者获得许多属性,包括'X','Pi'和'ObjVal'.OPTIMAL 状态代码向您保证有可用的解决方案,但像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")
Run Code Online (Sandbox Code Playgroud)