Encuentre la frontera pareto de 2 algoritmos que se ejecutan 10 veces en 7 conjuntos de casos

#include <stdio.h>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <string>
#include <direct.h>
#include <vector>
#define INSTANCE_NUM 7
#define RUN_TIMES 10
#define ALG_NUM 2
#define OBJ_NUM 2
#define eps 1e-8
usando el espacio de nombres std;

struct Chromosome {// Resuelve
    doble f [OBJ_NUM]; // 5 valores objetivo, f [0]: número de vehículos, f [1]: distancia total de viaje; f [2]: tiempo de viaje de ruta larga; f [3] : Tiempo de espera total; f [4]: ​​tiempo de retraso total
    double unit_f [OBJ_NUM]; // 5 objetivos para ecualización
    double min_dis;

};


int indi_num;
vector <Cromosoma> EP;
vector <Cromosoma> total_best;
vector <vector <Cromosoma>> algSets [ALG_NUM];

bool is_dominate (Cromosoma & s1, Cromosoma & s2) {
    if ((int) (s1.f [0] / 100000) <(int) (s2.f [0] / 100000)) {
        return true;
    }
    if ((int) (s1.f [0] / 100000)> (int) (s2.f [0] / 100000)) {
        return false;
    }

    if (s1.f [1]> s2.f [1] + eps || s1.f [0]> s2.f [0] + eps) {
        return false;
    }
    return (s1.f [1] + eps <s2.f [1] || s1.f [0] + eps <s2.f [0]);
}

bool is_the_same (Cromosoma y s1, Cromosoma y s2) {
    return (fabs (s1.f [1] - s2.f [1]) <eps && fabs (s1.f [0] - s2.f [0]) < eps);
}

void update_EP (Chromosome & indi) {
    // Comprueba si otras soluciones en el archivo son dominantes
    int size = EP.size (), i = 0;
    while (i <size)
    {
        if (is_dominate (EP [i], indi) || is_the_same (EP [i], indi))
            return;
        if (is_dominate (indi, EP [i])) {
            EP [i] = EP.back ();
            EP.pop_back (); --size
            ;
        }
        else
            i ++;
    } // s no está dominado por los elementos en el archivo, agréguelo al archivo __archive

     // Agregue el nodo al archivo
    EP.push_back (indi);
}

void get_pareto_front (ruta de cadena) {
    nombre de cadena;
    for (int j = 0; j <RUN_TIMES; j ++) {
        name = ruta + "_run_0" + char (j + '0') + "_obj.txt";
        fstream r_result (nombre, ios :: in);
        r_result >> indi_num;
        para (int i = 0; i <indi_num; i ++) {
            Chromosome chrom;
            para (int j = 0; j <OBJ_NUM; j ++)
                r_result >> chrom.f [j];
            update_EP (chrom);
        }
        r_result.close ();
    }
}

bool is_better (Cromosoma y cromo_1, Cromosoma y cromo_2) {

    bool better = false;
    for (int i = 0; i <OBJ_NUM; ++ i) {
        if (chrome_2.f [i] -chrome_1.f [i]> = 0.000001)
            better = true;
        if (chrome_1.f [ i] -chrome_2.f [i]> 0.000001)
            return false; // Mientras la matriz asociativa de chrome_1 tenga una dirección mayor que la solución anterior, chrome_1 es mala y chrome_2 tiene méritos, devuelve false
    } // matriz asociativa de chrome_2 Todos son mayores que chrome_1, mejor = verdadero, chrome_1 es bueno, chrome_2 es ​​malo
    devuelve mejor;
}

/ * Juzgue si la solución en el archivo es igual a la nueva solución
chrome_1: la solución en el archivo;
chrome_2: la nueva solución
Mientras el valor en una dirección de las dos soluciones sea mayor que 0.00001, las dos soluciones no son iguales. Devuelve false else
return true
* /
bool is_equal (Cromosoma y cromo_1, Cromosoma y cromo_2) {

    for (int i = 0; i <OBJ_NUM; ++ i) (
        if (fabs (chrome_1.f [i] -chrome_2.f [i])> 0.000001) devuelve falso; // Siempre y cuando las dos soluciones estén en cierta dirección El valor de es mayor que 0.00001, las dos soluciones no son iguales. Devuelve falso
    }
    devuelve verdadero;
}

bool update_best (Cromosoma y nuevo_cromosoma) {

    if (total_best.size () == 0)
        total_best.push_back (new_chromosome);
    else {
        // Compare la solución en el archivo EP con new_chromosome
        vector <Chromosome> :: iterator iter = total_best.begin ();
        for (; iter! = total_best.end (); ++ iter) {
            // Compare todo iter en el contenedor con new_chromosome, ¿es mejor que new_chromosome || ¿Es igual a chomosome
            if (is_better (* iter, new_chromosome) || is_equal (* iter, new_chromosome))
                return false;
        } // new_chromosome es mejor que todas las soluciones en EP

         // Eliminar la solución inferior de new_chromosome de EP
        iter = total_best.begin ();
        while (iter! = Total_best.end ()) {
            if (is_better (new_chromosome, * iter)) iter = total_best.erase (iter);
            else ++ iter;
        }
        // Añadir new_chromosome al conjunto de soluciones dominante
        total_best.push_back (new_chromosome);
    }
    return true;
}

bool cmp1 (cromosoma a, cromosoma b) {
    return af [0] <bf [0] || (af [0] == bf [0] && af [1] <bf [1]);
}
/ *
M-NSGA-II \ MTEA \
* /
void main (int argc, char ** argv) {

    instancia de cadena [INSTANCE_NUM] = {"E051-05e", "E076-10e", "E101-08e", "E101-10c", "E121-07c", "E151-12c", "E200-17c"};
    nombre de cadena;
    // 10 ejecutan para cada instancia
    para (int i = 0; i <INSTANCE_NUM; i ++) {// 案例 数目
        for (int a = 0; a <ALG_NUM; a ++) {// 对比 算法 的 数目
            EP.clear () ;
            string path = argv [a + 1] + instancia [i];
            for (int j = 0; j <RUN_TIMES; j ++) {
                name = ruta + "_run_0" + char (j + '0') + "_obj.txt";
                fstream r_result (nombre, ios :: in);
                r_result >> indi_num;
                para (int k = 0; k <indi_num; k ++) {
                    Cromosoma chrom;
                    para (int o = 0; o <OBJ_NUM; o ++)
                        r_result >> chrom.f [o];
                    update_EP (chrom);
                }
                r_result.close ();
            }

            // Recorrer el EP y encontrar la frontera pareto de los dos algoritmos
            algSets [a] .push_back (EP);
        }
        total_best.clear ();
        for (int a = 0; a <ALG_NUM; a ++) {
            for (int j = 0; j <algSets [a] [i] .size (); j ++) {
                update_best (algSets [a] [i] [j]);
            }
        }

        sort (total_best.begin (), total_best.end (), cmp1);
        cadena str = to_string (i);
        ARCHIVO * file_pf = fopen (("front \\" + str + ".txt"). C_str (), "w");
        fprintf (file_pf, "% d \ n", total_best.size ());
        for (int i = 0; i <total_best.size (); i ++)
        {
            fprintf (file_pf, "% .8lf% .8lf \ n", total_best [i] .f [0], total_best [i] .f [ 1]);
        }
        fclose (archivo_pf);
    }
}

4 artículos originales publicados · Me gusta0 · Visitas 132

Supongo que te gusta

Origin blog.csdn.net/zhangkkit/article/details/103926894
Recomendado
Clasificación