org.uma.jmetal.problem.multiobjective.cec2015OptBigDataCompetition.BigOpt2015 Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jmetal-problem Show documentation
Show all versions of jmetal-problem Show documentation
jMetal problem classes, including single- and multi-objective benchmarks
package org.uma.jmetal.problem.multiobjective.cec2015OptBigDataCompetition;
import org.uma.jmetal.problem.impl.AbstractDoubleProblem;
import org.uma.jmetal.solution.DoubleSolution;
import org.uma.jmetal.util.JMetalException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
/**
* Created by ajnebro on 14/1/15.
*/
@SuppressWarnings("serial")
public class BigOpt2015 extends AbstractDoubleProblem {
private List> mixed ;
private List> matrixA ;
private List> icaComponent ;
double f1max = -1000000;
double f2max = -1000000;
double f1min = 10000000;
double f2min = 10000000;
int dTypeG;
boolean scaling;
/** Constructor */
public BigOpt2015(String instanceName) {
loadData(instanceName);
scaling = false ;
setNumberOfVariables(dTypeG*256);
setNumberOfObjectives(2);
setNumberOfConstraints(0);
setName("BigOpt2015");
List lowerLimit = new ArrayList<>(getNumberOfVariables()) ;
List upperLimit = new ArrayList<>(getNumberOfVariables()) ;
for (int i = 0; i < getNumberOfVariables(); i++) {
lowerLimit.add(-8.0);
upperLimit.add(8.0);
}
setLowerLimit(lowerLimit);
setUpperLimit(upperLimit);
}
/** Evaluate() method */
@Override
public void evaluate(DoubleSolution solution) {
List> s1 ;
List s1Temp ;
s1 = new ArrayList<>() ;
for (int i = 0 ; i < dTypeG; i++) {
s1Temp = new ArrayList<>() ;
for (int j = 0 ; j < icaComponent.get(0).size(); j++) {
s1Temp.add(solution.getVariableValue(i*(icaComponent.get(0).size())+j)) ;
}
s1.add(s1Temp) ;
}
List> x1 = multiplyWithOutAMP(matrixA, s1) ;
List> cor1 = correlation(x1, mixed) ;
double sum = 0.0 ;
for (int i = 0 ; i < icaComponent.size(); i++) {
for (int j = 0 ; j < icaComponent.get(i).size(); j++) {
sum += Math.pow(icaComponent.get(i).get(j) - s1.get(i).get(j), 2) ;
}
}
double obj1 = diagonal1(cor1)+diagonal2(cor1) ;
double obj2 = sum/(icaComponent.size() * icaComponent.get(0).size()) ;
if (obj1 > f1max) {
f1max = obj1 ;
}
if (obj1 < f1min) {
f1min = obj1 ;
}
if (obj2 > f1max) {
f1max = obj2 ;
}
if (obj2 < f1min) {
f1min = obj2 ;
}
if (scaling) {
obj2 = (obj2 - f2min)*(f1max - f1min)/(f2max - f2min)+f1min ;
}
solution.setObjective(0, obj1);
solution.setObjective(1, obj2);
}
private void loadData(String problemId, String fName, int dType, int dLength) {
List> list ;
String fileName = "/cec2015Comp/"+problemId+fName ;
InputStream inputStream = createInputStream(fileName) ;
InputStreamReader isr = new InputStreamReader(inputStream);
BufferedReader br = new BufferedReader(isr);
list = new ArrayList<>() ;
String aux ;
try {
aux = br.readLine();
while (aux != null) {
StringTokenizer tokenizer = new StringTokenizer(aux);
List doubleList = new ArrayList<>();
while (tokenizer.hasMoreTokens()) {
double value = new Double(tokenizer.nextToken());
doubleList.add(value) ;
}
list.add(doubleList);
aux = br.readLine();
}
br.close();
} catch (IOException e) {
throw new JMetalException("Error reading file", e);
} catch (NumberFormatException e) {
throw new JMetalException("Format number exception when reading file", e);
}
if (fName.equals("X.txt")) {
mixed = list ;
} else if (fName.equals("S.txt")) {
icaComponent = list ;
} else if (fName.equals("A.txt")) {
matrixA = list ;
} else {
throw new JMetalException("Wrong name: " + fName) ;
}
}
private void loadData(String problemId){
int dType = 4 ;
if(problemId.equals("D4")){
dType=4;
}
else if(problemId.equals("D4N")){
dType=4;
}
else if(problemId.equals("D12")){
dType=12;
}
else if(problemId.equals("D12N")){
dType=12;
}
else if(problemId.equals("D19")){
dType=19;
}
else if(problemId.equals("D19N")){
dType=19;
}
dTypeG = dType;
loadData(problemId, "X.txt", dType, 256);
loadData(problemId, "S.txt", dType, 256);
loadData(problemId, "A.txt", dType, dType);
}
private InputStream createInputStream(String fileName) {
InputStream inputStream = getClass().getResourceAsStream(fileName);
return inputStream ;
}
List newMeanStandardDeviation(List list) {
List result = new ArrayList<>();
double sum = 0 ;
for (double value : list) {
sum += value ;
}
double mean = sum / list.size() ;
double accum = 0 ;
for (double value : list) {
accum += (value - mean) * (value - mean) ;
}
double stdev = Math.sqrt(accum/(list.size()-1)) ;
result.add(mean) ;
result.add(stdev) ;
return result ;
}
double vectorCorrelation(List list1, List list2) {
List a1 = newMeanStandardDeviation(list1) ;
List b1 = newMeanStandardDeviation(list2) ;
double c1 = 0;
double temp1, temp2;
double a = a1.get(1) * b1.get(1) ;
if (Math.abs(a) > 0.00001){
for (int i = 0; i < list1.size(); i++){
temp1 = ((list1.get(i) - list1.get(0)) );
temp2 = ((list2.get(i) - list2.get(0)) );
c1 += temp1*temp2;
}
c1 /= (list1.size()*a);
return c1;
}
else
return 0;
}
List> correlation(List> list1, List> list2) {
List> m ;
List temp ;
m = new ArrayList<>() ;
for (List i : list1) {
temp = new ArrayList<>() ;
for (List j : list2) {
temp.add(vectorCorrelation(i, j)) ;
}
m.add(temp) ;
}
return m ;
}
double diagonal1(List> list){
double sum = 0;
for (int i = 0; i < list.size(); i++){
for (int j = 0; j < list.size(); j++){
if (i == j){
sum += Math.pow(1 - list.get(i).get(j), 2);
}
}
}
return sum/list.size();
}
double diagonal2(List> list){
double sum = 0;
for (int i = 0; i < list.size(); i++){
for (int j = 0; j < list.size(); j++){
if (i == j){
}
else{
sum += Math.pow(list.get(i).get(j), 2);
}
}
}
return sum/list.size()/(list.size()-1);
}
List> multiplyWithOutAMP(List> list1, List> list2) {
List> c ;
List cTemp;
c = new ArrayList<>() ;
for (int row = 0; row < list1.size(); row++) {
cTemp = new ArrayList<>() ;
for (int col = 0; col < list2.get(0).size(); col++) {
cTemp.add(0.0);
}
c.add(cTemp);
}
for (int row = 0; row < list1.size(); row++) {
for (int col = 0; col < list2.get(row).size(); col++) {
for (int inner = 0; inner < list1.get(0).size(); inner++) {
double val = c.get(row).get(col) ;
c.get(row).set(col, val + list1.get(row).get(inner) * list2.get(inner).get(col));
}
}
}
return c;
}
}