void analyze(TTPOutputSet bestFront, TTPOutputSet front) { vector<vector<double>> solutionFront = convertTTPOutput(front); vector<vector<double>> trueFront = convertTTPOutput(bestFront); Hypervolume hv; double hvValue = hv.hypervolume(solutionFront, trueFront, trueFront[0].size()); Spread spread; double spreadValue = spread.spread(solutionFront, trueFront, trueFront[0].size()); InvertedGenerationalDistance igd; double igdValue = igd.invertedGenerationalDistance(solutionFront, trueFront, trueFront[0].size()); Epsilon eps; double epsValue = eps.epsilon(solutionFront, trueFront, trueFront[0].size()); cout << "hv: " << hvValue << endl; cout << "spread: " << spreadValue << endl; cout << "igd: " << igdValue << endl; cout << "eps: " << epsValue << endl; }
void ExperimentReport::generateQualityIndicators() { if ((!isSingleObjective_) && (paretoFrontDirectory_.empty())) { generateReferenceFronts(); } // TODO: Check if it is possible to use QualityIndicator class instead each independent class. // Problem: knowing number of objectives of each problem if (indicatorList_.size() > 0) { cout << "PF file: " << paretoFrontDirectory_ << endl; for (int algorithmIndex=0; algorithmIndex<algorithmNameList_.size(); algorithmIndex++) { string algorithmDirectory; algorithmDirectory = experimentBaseDirectory_ + "/data/" + algorithmNameList_[algorithmIndex] + "/"; for (int problemIndex=0; problemIndex<problemList_.size(); problemIndex++) { string problemDirectory = algorithmDirectory + problemList_[problemIndex]; string paretoFrontPath; if (!isSingleObjective_) { if (paretoFrontDirectory_.empty()) { string referenceFrontDirectory = experimentBaseDirectory_ + "/referenceFronts"; paretoFrontPath = referenceFrontDirectory + "/" + problemList_[problemIndex] + ".rf"; } else { paretoFrontPath = paretoFrontDirectory_ + "/" + paretoFrontFile_[problemIndex]; } // if } // if for (int indicatorIndex = 0; indicatorIndex < indicatorList_.size(); indicatorIndex++) { resetFile(problemDirectory + "/" + indicatorList_[indicatorIndex]); if (indicatorList_[indicatorIndex].compare("FIT")==0) { string solutionFrontFile = problemDirectory + "/FUN"; string qualityIndicatorFile = problemDirectory; Fitness * indicators = new Fitness(); vector< vector<double> > solutionFront = indicators->utils_->readFront(solutionFrontFile); qualityIndicatorFile = qualityIndicatorFile + "/FIT"; indicators->fitness(solutionFront, qualityIndicatorFile); delete indicators; } else { for (int numRun=0; numRun<independentRuns_; numRun++) { stringstream outputParetoFrontFilePath; outputParetoFrontFilePath << problemDirectory << "/FUN_" << numRun; string solutionFrontFile = outputParetoFrontFilePath.str(); string qualityIndicatorFile = problemDirectory; double value; cout << "ExperimentReport: Quality indicator: " << indicatorList_[indicatorIndex] << endl; if (indicatorList_[indicatorIndex].compare("HV")==0) { Hypervolume * indicators = new Hypervolume(); vector< vector<double> > solutionFront = indicators->utils_->readFront(solutionFrontFile); vector< vector<double> > trueFront = indicators->utils_->readFront(paretoFrontPath); value = indicators->hypervolume(solutionFront, trueFront, trueFront[0].size()); delete indicators; qualityIndicatorFile = qualityIndicatorFile + "/HV"; } if (indicatorList_[indicatorIndex].compare("SPREAD")==0) { Spread * indicators = new Spread(); vector< vector<double> > solutionFront = indicators->utils_->readFront(solutionFrontFile); vector< vector<double> > trueFront = indicators->utils_->readFront(paretoFrontPath); value = indicators->spread(solutionFront, trueFront, trueFront[0].size()); delete indicators; qualityIndicatorFile = qualityIndicatorFile + "/SPREAD"; } if (indicatorList_[indicatorIndex].compare("IGD")==0) { InvertedGenerationalDistance * indicators = new InvertedGenerationalDistance(); vector< vector<double> > solutionFront = indicators->utils_->readFront(solutionFrontFile); vector< vector<double> > trueFront = indicators->utils_->readFront(paretoFrontPath); value = indicators->invertedGenerationalDistance(solutionFront, trueFront, trueFront[0].size()); delete indicators; qualityIndicatorFile = qualityIndicatorFile + "/IGD"; } if (indicatorList_[indicatorIndex].compare("EPSILON")==0) { Epsilon * indicators = new Epsilon(); vector< vector<double> > solutionFront = indicators->utils_->readFront(solutionFrontFile); vector< vector<double> > trueFront = indicators->utils_->readFront(paretoFrontPath); value = indicators->epsilon(solutionFront, trueFront, trueFront[0].size()); delete indicators; qualityIndicatorFile = qualityIndicatorFile + "/EPSILON"; } cout << "ExperimentReport: Quality indicator file: " << qualityIndicatorFile << endl; if (qualityIndicatorFile.compare(problemDirectory)!=0) { std::fstream out(qualityIndicatorFile.c_str(), std::ios::out | std::ios::app); out << value << endl; out.close(); } // if } // for } // if } // for } // for } // for } // if } // generateQualityIndicators