#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);
}
}