gurobi - 错误代码= 10004无法检索属性“X”

时间:2013-10-09 10:56:19

标签: 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

1 个答案:

答案 0 :(得分:7)

问题是你的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在写入.sol文件时从变量中获取“X”属性。如果优化失败,则“X”属性不可用并抛出异常。在编写.sol文件之前,你应该确保gurobi有一个解决方案,或者获得许多属性,包括'X','Pi'和'ObjVal'。 OPTIMAL status codes向您保证有可用的解决方案,但像SUBOPTIMAL这样的代码也表明有可用的解决方案,而其他像TIME_LIMIT,NODE_LIMIT则意味着可能有可用的解决方案。您可以获取属性SolCount以获得确定存在可用解决方案的明确指示。

你的问题实例是不可行的,因为约束(R1,R7,R13意味着学生1和2需要至少3个项目,但约束(R19,R20)意味着他们每个项目可以只有1个项目。你可以看到使用IIS解算器。在交互式gurobi中,您可以获得Irreducible Inconsistent Subsystem

m = read("test2.lp")
m.optimize()
m.computeIIS()
m.write("test2.ilp")