mercredi 25 février 2015

Add all values to SortedMap (Java)



This is a very simplified excerpt of my code I am using to get the lowest computed value and its parameters using SortedMap:



import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.Map.Entry;

public class Main {

public static void main(String[] args) throws Exception {
getMinValue();
}

public static Parameter getMinValue() throws Exception {

SortedMap<Double, Parameter> minFromMap = new TreeMap<Double, Parameter>();
List<Double> real = new ArrayList<>(
Arrays.asList(4.0, 3.0, 3.0, 1.0, 0.0, 2.0, 5.0, 1.0, 0.0, 0.0,
1.0, 7.0, 4.0, 1.0, 2.0, 4.0, 0.0));
int k = 2;
BigDecimal step = new BigDecimal("0.1");

for (BigDecimal alphaNew = BigDecimal.ZERO; alphaNew
.compareTo(BigDecimal.ONE) < 0; alphaNew = alphaNew.add(step)) {

for (BigDecimal betaNew = BigDecimal.ZERO; betaNew
.compareTo(BigDecimal.ONE) < 0; betaNew = betaNew.add(step)) {

for (BigDecimal lambda = BigDecimal.ZERO; lambda
.compareTo(BigDecimal.ONE) < 0; lambda = lambda
.add(step)) {

Parameter param = new Parameter();
param.setAlpha(alphaNew.doubleValue());
param.setBeta(betaNew.doubleValue());
param.setGamma(lambda.doubleValue());
param.setK(k);

double sumUp = 0;
double value = 0;

int observations = 0;
for (int i = 0; i < real.size(); i++) {
double pow = Math.pow(real.get(i), 2);
sumUp += pow;
observations++;
}
value = Math.sqrt(sumUp / observations);
param.setValue(value);
minFromMap.put(value, param);
}
}
}

for (Entry<Double, Parameter> en : minFromMap.entrySet()) {
System.out.println("Value: " + en.getKey() + " Alpha: "
+ en.getValue().getAlpha() + " Beta: "
+ en.getValue().getBeta() + " Lambda: "
+ en.getValue().getGamma() + " k: " + en.getValue().getK());
}

Parameter param = new Parameter();

param.setAlpha(minFromMap.get(minFromMap.firstKey()).getAlpha());
param.setBeta(minFromMap.get(minFromMap.firstKey()).getBeta());
param.setGamma(minFromMap.get(minFromMap.firstKey()).getGamma());
param.setK(minFromMap.get(minFromMap.firstKey()).getK());
param.setValue(minFromMap.get(minFromMap.firstKey()).getValue());

return param;
}
}

public class Parameter {

private double alpha;
private double beta;
private double gamma;
private int k;
private double value;

public double getAlpha() {
return alpha;
}

public void setAlpha(double alpha) {
this.alpha = alpha;
}

public double getBeta() {
return beta;
}

public void setBeta(double beta) {
this.beta = beta;
}

public double getGamma() {
return gamma;
}

public void setGamma(double gamma) {
this.gamma = gamma;
}

public int getK() {
return k;
}

public void setK(int k) {
this.k = k;
}

public double getValue() {
return value;
}

public void setValue(double value) {
this.value = value;
}
}


I use SortedMap to get the lowest computed value depending on the parameters Alpha, Beta and Gamma. (I know this is not the case here because it is a very simplified excerpt.)


I would like to get all possible values (variable value) stored depending on Alpha, Beta and Gamma in minFromMap and to get the parameters for which value is the lowest value. However, the output of the posted code is:



Value: 2.990180006385608 Alpha: 0.9 Beta: 0.9 Lambda: 0.9 k: 2



I know that the value does not change and that's why only one entry is stored in the SortedMap but as just mentioned: is there any possibility to store all entries with values and parameters and to sort them like SortedMap? Can anyone help me solving this issue? Thanks.




Aucun commentaire:

Enregistrer un commentaire