class="java" name="code"> /**离线优化 * @param wekaModel 模型 * @param valuesList 3个Double数组:第1个-正值为条件变量,负值为优化变量;第2个-下限;第3个-上限 * @param findMax true为求最大值;false为求最小值 * @param values * @return 优化后的值 */ public double[] optimize(WekaModel wekaModel, List<Double[]> valuesList, boolean findMax){ //最优参数 Double[] optResult = null; //待优化参数 Double[] values4Opt = valuesList.get(0); //参数下限 Double[] valuesMin = valuesList.get(1); //参数上限 Double[] valuesMax = valuesList.get(2); //最优值 Double optValue = 0.0; //存放每个位号累计的次数 int[] addnums = new int[values4Opt.length]; //每次累加后的值 double[] newvalues = new double[values4Opt.length]; //是否继续遍历 boolean isGoing = true; //addnums[0]为第一个参数累计次数 for(addnums[0]=0; addnums[0]<=grading; ){ //n为参数的个数,每个位号累计times次,下个位号+1,本位号清零 for(int n=0; n<addnums.length-1; n++){ //本参数的累积次数 int addnum = addnums[n]; //判断累加是否完毕 if(addnum >= grading){ //判断是否为最后一列 if(n==addnums.length-2){ //优化结束 isGoing = false; }else{ //下个位号+1,本位号清零 addnums[n] -= grading; //如果该位号为自变量,使用已给值,不枚举 if(values4Opt[n+1] != null){ addnums[n+1] += grading; }else{ addnums[n+1] ++; } } } } if(isGoing==false){ break; //优化结束 } //用值替换位号 for(int i=0; i<values4Opt.length-1; i++){ //根据位号获取配置的上下限信息 Double minValue = valuesMin[i]; Double maxValue = valuesMax[i]; //替换位号sql if(values4Opt[i] != null){ newvalues[i] = values4Opt[i]; }else{ newvalues[i] = minValue +(maxValue-minValue)/(grading-1)*addnums[i]; } } //计算优化公式 newvalues[newvalues.length-1] = this.predict(newvalues); //最优结果处理 if(newvalues[newvalues.length-1] > optValue){ optValue = newvalues[newvalues.length-1]; } //如果该位号为自变量,使用已给值,不枚举 if(values4Opt[0] != null){ addnums[0] += grading; }else{ addnums[0] ++; } } return null; }