我尝试使用java从Excel读取列值,这里是代码的一部分:
.....
List<ReportRow> listOfDataFromReport = new ArrayList<ReportRow>();
for(int x = 1; x<=sheet.getPhysicalNumberOfRows(); x++){
ReportRow rr = new ReportRow();
HSSFRow dataRow = sheet.getRow(x);
int idxForColumn1 = map.get("Cost");
int idxForColumn2 = map.get("Level");
HSSFCell cell1 = dataRow.getCell(idxForColumn1);
HSSFCell cell2 = dataRow.getCell(idxForColumn2);
rr.setCost(cell1.getNumericCellValue());
rr.setLevel(cell2.getNumericCellValue());
.....
因此,从 Excel 读取数据的代码工作正常,我遇到的问题是 setters 函数,因为我没有相同的类型,我在另一个类中使用 cplex 求解器:
private IloNumVar Cost = new IloNumVar;
public IloNumVar getCost() {
return Cost;
}
public void setCost(IloNumVar cost) {
Cost = cost;
}
所以我收到此错误:
The method setCost is not applicable for the arguments (double)
所以我想知道是否可以将 IloNumVar 转换为 double 或使用它们的任何解决方案,将值获取为 double 但将其用作 IloNumVar。
编辑
为了解释更多,我使用电力值(来自 Excel)作为输入,以使用它们通过 cplex 求解器解决成本问题。
要从Excel读取数据,我只能使用POI
的getNumericCellValue()
方法来获取值,所以我将变量设置为double
,但是当我使用它们来求解我的模型时,我必须将它们用作 IloNumVar[]
因为我希望优化 24 小时内的能源成本值,具体取决于从 excel 文件获取的功率值。
最佳答案
IloNumVar 是一个 CPLEX/Concert 类,用于对 CPLEX 模型中的变量进行建模。在模型构建阶段,它通常没有单一值。相反,您需要指定 IloNumVar 可以采用的值范围,通常是下限和上限。但是,您可以通过将变量的下限和上限设置为相同的值来将变量设置为始终具有单个值。在大多数情况下,这种情况很少见 - 也许是为了将一些已知值或决策强制到模型中进行调试。
运行并求解模型后,变量应该具有单个值,因为 CPLEX 应该为您选择一个值。然后,您可以使用 getValue() 之类的方法从 IloNumVar 获取该值。
现在观察 - 在大多数模型中,“成本”之类的东西都是已知的常数值,我们希望 CPLEX 决定在该已知成本下使用多少东西。通常,成本是目标函数中某些项的系数。在这种情况下,通常对那些已知值使用 double 值。您没有提及您的模型,因此我们无法判断您在模型中使用这些 IloNumVar 的目的,这可能是一个好的设计决策,也可能不是一个好的设计决策。
关于java - 在 Java 中将 CPLEX 的 IloNumVar 变量转换为 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44398988/