我试图使用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读取数据,我只能使用
getNumericCellValue()
的POI
方法来获取值,因此我将使用double
作为变量,但是当我使用它们来求解模型时,我必须将它们用作IloNumVar[]
,因为我希望优化24小时内的能源成本值取决于取自excel文件的功率值。 最佳答案
IloNumVar是一个CPLEX / Concert类,用于在CPLEX模型中对变量建模。在模型构建阶段,它通常没有单个值。相反,您需要指定IloNumVar可以采用的值的范围,通常是下限和上限。但是,可以通过将变量的上下限设置为相同的值来将变量设置为始终具有单个值。在大多数情况下,这种情况很少见-可能是为了将某些已知值或决策强制进入模型进行调试。
运行并求解模型后,该变量应该具有单个值,因为CPLEX应该为您选择了一个值。然后,您可以使用类似getValue()的方法从IloNumVar获取该值。
现在可以观察到-在大多数模型中,“成本”之类的东西都是已知的常数值,我们希望CPLEX决定以该已知成本使用多少东西。通常,成本是目标函数中某些项的系数。在这种情况下,对那些已知值使用双精度值是正常的。您没有对模型说什么,所以我们无法确定您在模型中使用这些IloNumVars的原因,这可能是一个不错的设计决策。