// runExperiment.java
//
// Author:
// Antonio J. Nebro <antonio@lcc.uma.es>
// Juan J. Durillo <durillo@lcc.uma.es>
// Jorge Rodriguez
//
// Copyright (c) 2011 Antonio J. Nebro, Juan J. Durillo, Jorge Rodriguez
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package jmetal.experiments.util;
import jmetal.core.Algorithm;
import jmetal.core.Problem;
import jmetal.core.SolutionSet;
import jmetal.experiments.Experiment;
import jmetal.experiments.Settings;
import jmetal.util.JMException;
import java.io.File;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Class implementing the steps to run an experiment
*/
public class RunExperiment extends Thread {
public Experiment experiment_ ;
public int id_ ;
public HashMap<String, Object> map_ ;
public int numberOfThreads_ ;
public int numberOfProblems_ ;
// Inicio modificación planificación Threads
static boolean finished;
// Fin modificación planificación Threads
String experimentName_;
String[] algorithmNameList_; // List of the names of the algorithms to be executed
String[] problemList_; // List of problems to be solved
String[] paretoFrontFile_; // List of the files containing the pareto fronts
// corresponding to the problems in problemList_
String[] indicatorList_; // List of the quality indicators to be applied
String experimentBaseDirectory_; // Directory to store the results
String latexDirectory_; // Directory to store the latex files
String rDirectory_; // Directory to store the generated R scripts
String paretoFrontDirectory_; // Directory containing the Pareto front files
String outputParetoFrontFile_; // Name of the file containing the output
// Pareto front
String outputParetoSetFile_; // Name of the file containing the output
// Pareto set
int independentRuns_; // Number of independent runs per algorithm
Settings[] algorithmSettings_; // Paremeter experiments.settings of each algorithm
public RunExperiment(Experiment experiment,
HashMap<String, Object> map,
int id,
int numberOfThreads,
int numberOfProblems) {
experiment_ = experiment ;
id_ = id ;
map_ = map ;
numberOfThreads_ = numberOfThreads ;
numberOfProblems_ = numberOfProblems;
// Inicio modificación planificación Threads
finished = false;
// Fin modificación planificación Threads
}
public void run() {
Algorithm[] algorithm; // jMetal algorithms to be executed
String experimentName = (String) map_.get("experimentName");
experimentBaseDirectory_ = (String) map_.get("experimentDirectory");
algorithmNameList_ = (String[]) map_.get("algorithmNameList");
problemList_ = (String[]) map_.get("problemList");
indicatorList_ = (String[]) map_.get("indicatorList");
paretoFrontDirectory_ = (String) map_.get("paretoFrontDirectory");
paretoFrontFile_ = (String[]) map_.get("paretoFrontFile");
independentRuns_ = (Integer) map_.get("independentRuns");
outputParetoFrontFile_ = (String) map_.get("outputParetoFrontFile");
outputParetoSetFile_ = (String) map_.get("outputParetoSetFile");
int numberOfAlgorithms = algorithmNameList_.length;
algorithm = new Algorithm[numberOfAlgorithms] ;
// Inicio modificación planificación Threads
SolutionSet resultFront = null;
int[] problemData; // Contains current problemId, algorithmId and iRun
while(!finished){
problemData = null;
problemData = experiment_.getNextProblem();
if(!finished && problemData != null){
int problemId = problemData[0];
int alg = problemData[1];
int runs = problemData[2];
// The problem to solve
Problem problem;
String problemName;
// STEP 2: get the problem from the list
problemName = problemList_[problemId];
// STEP 3: check the file containing the Pareto front of the problem
// STEP 4: configure the algorithms
try {
experiment_.algorithmSettings(problemName, problemId, algorithm);
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
problem = algorithm[0].getProblem() ;
// STEP 5: run the algorithms
// STEP 6: create output directories
File experimentDirectory;
String directory;
directory = experimentBaseDirectory_ + "/data/" + algorithmNameList_[alg] + "/" +
problemList_[problemId];
experimentDirectory = new File(directory);
if (!experimentDirectory.exists()) {
boolean result = new File(directory).mkdirs();
System.out.println("Creating " + directory);
}
// STEP 7: run the algorithm
System.out.println(Thread.currentThread().getName() + " Running algorithm: " +
algorithmNameList_[alg] +
", problem: " + problemList_[problemId] +
", run: " + runs);
try {
try {
resultFront= algorithm[alg].execute();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (JMException ex) {
Logger.getLogger(Experiment.class.getName()).log(Level.SEVERE, null, ex);
}
// STEP 8: put the results in the output directory
resultFront.printObjectivesToFile(directory + "/" + outputParetoFrontFile_ + "." + runs);
resultFront.printVariablesToFile(directory + "/" + outputParetoSetFile_ + "." + runs);
if(!finished){
if(experiment_.finished_){
finished = true;
}
}
} // if
} //while
// Fin modificación planificación Threads
}
}