基于weka的优化算法

1 篇文章 0 订阅

/**离线优化
* @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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值