基于weka的优化算法

	/**离线优化
	 * @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;
	}

你可能感兴趣的:(java,优化,weka)