package publication; import biputil2.SequentialFile; /** * Title: * Description: * Copyright: Copyright (c) 2010 * Company: * @author not attributable * @version 1.0 */ public class ag { /** * @param args */ static SequentialFile tempsAg = new SequentialFile(); static SequentialFile puisAg = new SequentialFile(); public static void main(String[] args) { // TODO Auto-generated method stub int nbTache = 10; SequentialFile fichier = new SequentialFile(); SequentialFile cache = new SequentialFile(); SequentialFile temps_access = new SequentialFile(); SequentialFile puissance_access = new SequentialFile(); SequentialFile pop = new SequentialFile(); double T[][] = new double[50][nbTache]; double C[][] = new double[50][nbTache]; fichier.open("resultat.txt", 'r'); String ligne = new String(); ligne = fichier.read(); // Calcul C[configurations][taches]: // Matrice T[configurations][tâches]dimension // 5*5 pop.open("pop.txt", 'w'); for (int i = 0; i < 50; i++) { for (int j = 0; j < nbTache; j++) { ligne = fichier.read(); T[i][j] = Double.parseDouble(ligne); ligne = fichier.read(); C[i][j] = Double.parseDouble(ligne); ligne = fichier.read(); } // System.out.println(); } fichier.close(); //System.out.println("T="); for (int i = 0; i < 50; i++) { for (int j = 0; j < nbTache; j++) { // System.out.print(T[i][j] + " "); } //System.out.println(); } //System.out.println("C="); //System.out.println(); for (int i = 0; i < 50; i++) { for (int j = 0; j < nbTache; j++) { // System.out.print(C[i][j] + " "); } //System.out.println(); } //System.out.println(); // Calcul Taille[configurations] //System.out.println("Taille="); double Taille[] = new double[50]; cache.open("cache.txt", 'r'); ligne = cache.read(); for (int h = 0; h < 50; h++) { Taille[h] = Double.parseDouble(ligne); //System.out.print(Taille[h] + ""); ligne = cache.read(); } cache.close(); //System.out.println(); // Calcul T_acc[configurations]: double Taccess[] = new double[50]; temps_access.open("temps_access.txt", 'r'); ligne = temps_access.read(); for (int h = 0; h < 50; h++) { Taccess[h] = Double.parseDouble(ligne); //System.out.print(Taccess[h] + ""); ligne = temps_access.read(); } temps_access.close(); //System.out.println(); // Calcul P_acc[configurations]: double Paccess[] = new double[50]; puissance_access.open("puissance_access.txt", 'r'); ligne = puissance_access.read(); for (int h = 0; h < 50; h++) { Paccess[h] = Double.parseDouble(ligne); //System.out.print(Paccess[h] + ""); ligne = puissance_access.read(); } puissance_access.close(); //System.out.println(); // Calcul Tc[configurations][configurations] double Tc[][] = new double[50][50]; //System.out.println("Tc="); for (int i = 0; i < 50; i++) { for (int j = 0; j < 50; j++) { if (i == j) { Tc[i][j] = 0; // System.out.print(Tc[i][j] + " "); } else if (Taille[i] < Taille[j]) { Tc[i][j] = 0; // System.out.print(Tc[i][j] + " "); } else { Tc[i][j] = Taccess[i] * (Taille[i] - Taille[j]); // System.out.print(Tc[i][j] + " "); } } //System.out.println(); } //System.out.println(); // Calcul Cc[configurations][configurations] double Cc[][] = new double[50][50]; //System.out.println("Cc="); for (int i = 0; i < 50; i++) { for (int j = 0; j < 50; j++) { if (i == j) { Cc[i][j] = 0; // System.out.print(Cc[i][j] + " "); } else if (Taille[i] < Taille[j]) { Cc[i][j] = 0; // System.out.print(Cc[i][j] + " "); } else { Cc[i][j] = Paccess[i] * (Taille[i] - Taille[j]); //System.out.print(Cc[i][j] + " "); } } // System.out.println(); } // System.out.println(); // Création d'une pop initiale int p[][] = new int[100][nbTache]; // System.out.println("p="); for (int i = 0; i < 100; i++) { // System.out.print(i + " "); for (int j = 0; j < nbTache; j++) { p[i][j] = (int) (Math.random() * 50); //System.out.print(p[i][j] + " "); } //System.out.println(); } // Evaluation des individus ou calcul de Fitness double Ft[] = new double[100]; double Fc[] = new double[100]; int par1[] = new int[nbTache]; int par2[] = new int[nbTache]; int enf1[] = new int[nbTache]; int enf2[] = new int[nbTache]; int p1[][] = new int[100][nbTache]; int p2[][] = new int[100][nbTache]; int In[] = new int[2]; // Evaluation des individus f1(100, nbTache, p, T, Tc, Ft, p1); f2(100, nbTache, p, C, Cc, Fc, p2); selection(100, nbTache, p, Ft, Fc, par1, par2, In); for (int i = 0; i < 100; i++) { System.out.print(i + " "); for (int j = 0; j < nbTache; j++) { System.out.print(p[i][j] + " "); } System.out.println(); } f1(100, nbTache, p, T, Tc, Ft, p1); f2(100, nbTache, p, C, Cc, Fc, p2); // Sélection int k = 0; int l = 1; while (k < 500) { //nombre de génération // croisement croisement(100, nbTache, p, par1, par2, enf1, enf2, In, T, Tc, C, Cc); // System.out.println(); // Mutation mutation(100, nbTache, p, T, Tc, C, Cc); // System.out.println(); // pop après reclassement, croisement et mutation selection(100, nbTache, p, Ft, Fc, par1, par2, In); // System.out.println("p'="); //c la j'ai ajoutée une condition qui teste si c la premiere itération alors //imprimé ou si pair de 10 imprimer aussi car je veux avoir 1 10 20 30 40 50 60 70 80 90 100 if (l % 50 == 0) { System.out.println(l); for (int i = 0; i < 100; i++) { System.out.print(i + " "); // pop.write(""+i); for (int j = 0; j < nbTache; j++) { System.out.print(p[i][j] + " "); // pop.write(""+p[i][j]); } System.out.println(); } f1(100, nbTache, p, T, Tc, Ft, p1); f2(100, nbTache, p, C, Cc, Fc, p2); } //jusque la k++; l++; } pop.close(); // selection(100, nbTache, p, Ft, Fc, par1, par2, In); //f1(100, nbTache, p, T, Tc, Ft, p1); //f2(100, nbTache, p, C, Cc, Fc, p2); } // fin main public static void f1(int lig, int col, int p[][], double t[][], double tc[][], double f[], int p1[][]) { double s1 0, s2 0; double S1[] = new double[lig]; double S2[] = new double[lig]; for (int i = 0; i < lig; i++) { for (int j = 0; j < col; j++) { s1 = s1 + t[p[i][j]][j]; // p[i]{j]= N°Configuration [j]=N° de la // tache } S1[i] = s1; s1 = 0; } for (int i = 0; i < lig; i++) { for (int j = 0; j < col - 1; j++) { s2 = s2 + tc[p[i][j]][p[i][j + 1]]; // p[i]{j]= N°Configuration // [j+1]=N°configuration // suivante dans la solution // en cours } S2[i] = s2; s2 = 0; } tempsAg.open("tempsAg.txt", 'w'); System.out.println(" Ft"); for (int i = 0; i < lig; i++) { f[i] = S1[i] + S2[i]; tempsAg.write("" + f[i]); System.out.println(f[i] + " "); } tempsAg.close(); } public static void f2(int lig, int col, int p[][], double c[][], double cc[][], double f[], int p2[][]) { double s1 0, s2 0; double S1[] = new double[lig]; double S2[] = new double[lig]; for (int i = 0; i < lig; i++) { for (int j = 0; j < col; j++) { s1 = s1 + c[p[i][j]][j]; } S1[i] = s1; s1 = 0; } for (int i = 0; i < lig; i++) { for (int j = 0; j < col - 1; j++) { s2 = s2 + cc[p[i][j]][p[i][j + 1]]; } S2[i] = s2; s2 = 0; } puisAg.open("puisAg.txt", 'w'); System.out.println("Fc"); for (int i = 0; i < lig; i++) { f[i] = S1[i] + S2[i]; System.out.println(f[i] + " "); puisAg.write("" + f[i]); } puisAg.close(); } // Appliquer l'algorithme VEGA pour la selection des individus qui feront // objet d'un croisement et/ou Mutation public static void selection(int lig, int col, int p[][], double f1[], double f2[], int par1[], int par2[], int ind[]) { // Sous pop 1 les 50 premiers individus sont classés selon F1 double z; int x; //Classement selon F1 for (int i = 0; i < ( (lig / 2) - 1); i++) { for (int j = i + 1; j < lig / 2; j++) { if (f1[j] < f1[i]) { z = f1[i]; f1[i] = f1[j]; f1[j] = z; for (int h = 0; h < col; h++) { x = p[i][h]; p[i][h] = p[j][h]; p[j][h] = x; } } } } double z1; int x1; //classement selon F2 for (int i = (lig / 2); i < lig - 1; i++) { for (int j = i + 1; j < lig; j++) { if (f2[j] < f2[i]) { z1 = f2[i]; f2[i] = f2[j]; f2[j] = z1; for (int h = 0; h < col; h++) { x1 = p[i][h]; p[i][h] = p[j][h]; p[j][h] = x1; } } } } ind[0] = (int) (Math.random() * 50); // int id1 = (int) (Math.random() * 10); //System.out.println("id1=" + id1); ind[1] = (int) (Math.random() * 50) + 50; // int id2 = (int) (Math.random() * 10); // ind[0]=id1; // ind[1]=id2; //System.out.println("id2=" + id2); for (int i = 0; i < lig; i++) { if (i == ind[0]) { for (int j = 0; j < col; j++) { par1[j] = p[i][j]; //System.out.print(par1[j]); } } } for (int i = 0; i < lig; i++) { if (i == ind[1]) { // System.out.println(); for (int j = 0; j < col; j++) { par2[j] = p[i][j]; //System.out.print(par2[j]); } } } //System.out.println(); } // fin selection public static void croisement(int lig, int col, int p[][], int par1[], int par2[], int enf1[], int enf2[], int ind[], double t[][], double tc[][], double c[][], double cc[][]) { for (int j = 0; j < col / 2; j++) { enf1[j] = par1[j]; enf2[j] = par2[j]; } for (int j = col / 2; j < col; j++) { enf1[j] = par2[j]; enf2[j] = par1[j]; } if (fti(col, enf1, t, tc) < fti(col, par1, t, tc)) { for (int j = 0; j < col; j++) { p[ind[0]][j] = enf1[j]; // System.out.print(enf1[j]); } } // System.out.println(); if (fci(col, enf2, c, cc) < fci(col, par2, c, cc)) { for (int j = 0; j < par1.length; j++) { p[ind[1]][j] = enf2[j]; // System.out.print(enf2[j]); } } } public static void mutation(int lig, int col, int p[][], double t[][], double tc[][], double c[][], double cc[][]) { int mut[] = new int[lig]; int mut1[] = new int[lig]; int id = (int) (Math.random() * 100); //System.out.println(id); for (int i = 0; i < lig; i++) { if (i == id) { for (int j = 0; j < col; j++) { mut[j] = p[i][j]; mut1[j] = mut[j]; // System.out.print(mut[j]); } } } // System.out.println(); int id1 = (int) (Math.random() * col); //System.out.println(id1); for (int j = 0; j < col; j++) { if (j == id1) { mut1[j] = 49 - mut[j]; // } } if ( (fti(col, mut1, t, tc) < fti(col, mut, t, tc)) && (fti(col, mut1, t, tc) < fti(col, mut, t, tc))) { for (int j = 0; j < col; j++) { p[id][j] = mut1[j]; // System.out.print(mut1[j]); } } } public static double fti(int col, int individu[], double t[][], double tc[][]) { double s1 0, s2 0; for (int j = 0; j < col; j++) { s1 = s1 + t[individu[j]][j]; // p[i]{j]= N°Configuration [j]=N° de la // tache } for (int j = 0; j < col - 1; j++) { s2 = s2 + tc[individu[j]][individu[j + 1]]; // p[i]{j]= // N°Configuration // [j+1]=N°configuration // suivante dans la solution // en cours } return s1 + s2; } public static double fci(int col, int individu[], double c[][], double cc[][]) { double s1 0, s2 0; for (int j = 0; j < col; j++) { s1 = s1 + c[individu[j]][j]; // p[i]{j]= N°Configuration [j]=N° de la // tache } for (int j = 0; j < col - 1; j++) { s2 = s2 + cc[individu[j]][individu[j + 1]]; // p[i]{j]= // N°Configuration // [j+1]=N°configuration // suivante dans la solution // en cours } return s1 + s2; } }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question#include <stdio.h> #include <stdlib.h> int nbTache = 10; FILE *fichier, *cache, *temps_access, *puissance_access, *pop, *tempsAg, *puisAg; void f1(int lig, int col, int ** p, double ** t,double ** tc, double * f, int ** p1); void f2(int lig, int col, int ** p, double ** c, double ** cc, double * f, int ** p2); void selection(int lig, int col, int ** p, double * f1, double * f2, int * par1, int * par2, int * ind); void croisement(int lig, int col, int ** p, int * par1, int * par2, int * enf1, int * enf2, int * ind, double ** t, double ** tc, double ** c, double ** cc); void mutation(int lig, int col, int ** p, double ** t, double ** tc, double ** c, double ** cc); double fti(int col, int * individu, double ** t, double ** tc); double fci(int col, int * individu, double ** c, double ** cc); int main(int argc, char ** argv) { double ** T = new double*[50]; for(int i 0;i < 50;++i) T[i] new double[nbTache]; double ** C = new double*[50]; for(int i 0;i < 50;++i) C[i] new double[nbTache]; pop = fopen("pop.txt", "r"); fichier = fopen("resultat.txt", "r"); for (int i = 0; i < 50; i++) for (int j = 0; j < nbTache; j++) fscanf(fichier, "%lf%lf", &T[i][j], &C[i][j]); fclose(fichier); double * Taille = new double[50]; cache = fopen("cache.txt", "r"); for (int h = 0; h < 50; h++) fscanf(cache, "%lf", &Taille[h]); fclose(cache); double *Taccess = new double[50]; temps_access = fopen("temps_access.txt", "r"); for (int h = 0; h < 50; h++) fscanf(temps_access, "%lf", &Taccess[h]); fclose(temps_access); double * Paccess = new double[50]; puissance_access = fopen("puissance_access.txt", "r"); for (int h = 0; h < 50; h++) fscanf(puissance_access, "%lf", &Paccess[h]); fclose(puissance_access); double ** Tc = new double*[50]; for(int i 0;i < 50;++i) Tc[i] new double[50]; for (int i = 0; i < 50; i++) for (int j = 0; j < 50; j++) { if (i j) Tc[i][j] 0; else if (Taille[i] < Taille[j]) Tc[i][j] = 0; else Tc[i][j] = Taccess[i] * (Taille[i] - Taille[j]); } double ** Cc = new double*[50]; for(int i 0;i < 50;++i) Cc[i] new double[50]; for (int i = 0; i < 50; i++) for (int j = 0; j < 50; j++) { if (i j) Cc[i][j] 0; else if (Taille[i] < Taille[j]) Cc[i][j] = 0; else Cc[i][j] = Paccess[i] * (Taille[i] - Taille[j]); } int ** p = new int*[100]; for(int i 0;i < 100;++i) p[i] new int[nbTache]; for (int i = 0; i < 50; i++) for (int j = 0; j < 50; j++) p[i][j] = rand(); // Evaluation des individus ou calcul de Fitness double * Ft = new double[100]; double * Fc = new double[100]; int * par1 = new int[nbTache]; int * par2 = new int[nbTache]; int * enf1 = new int[nbTache]; int * enf2 = new int[nbTache]; int ** p1 = new int*[100]; for(int i 0;i < 100;++i) p1[i] new int[nbTache]; int ** p2 = new int*[100]; for(int i 0;i < 100;++i) p2[i] new int[nbTache]; int * In = new int[2]; // Evaluation des individus f1(100, nbTache, p, T, Tc, Ft, p1); f2(100, nbTache, p, C, Cc, Fc, p2); selection(100, nbTache, p, Ft, Fc, par1, par2, In); for (int i = 0; i < 100; i++) { printf("%d ", i); for (int j = 0; j < nbTache; j++) printf("%d ", p[i][j]); printf("\n"); } f1(100, nbTache, p, T, Tc, Ft, p1); f2(100, nbTache, p, C, Cc, Fc, p2); // Sélection int k = 0; int l = 1; while (k < 500) { //nombre de génération // croisement croisement(100, nbTache, p, par1, par2, enf1, enf2, In, T, Tc, C, Cc); // Mutation mutation(100, nbTache, p, T, Tc, C, Cc); // pop après reclassement, croisement et mutation selection(100, nbTache, p, Ft, Fc, par1, par2, In); //c la j'ai ajoutée une condition qui teste si c la premiere itération alors //imprimé ou si pair de 10 imprimer aussi car je veux avoir 1 10 20 30 40 50 60 70 80 90 100 if (l % 50 == 0) { printf("%d\n", l); for (int i = 0; i < 100; i++) { printf( "%d ", i); for (int j = 0; j < nbTache; j++) { printf("%d ", p[i][j]); } printf("\n"); } f1(100, nbTache, p, T, Tc, Ft, p1); f2(100, nbTache, p, C, Cc, Fc, p2); } k++; l++; } fclose(pop); } void f1(int lig, int col, int ** p, double ** t,double ** tc, double * f, int ** p1) { double s1, s2; double * S1 = new double[lig]; double * S2 = new double[lig]; for (int i = 0; i < lig; i++) { s1 = 0; for (int j = 0; j < col; j++) s1 += t[p[i][j]][j]; S1[i] = s1; } for (int i = 0; i < lig; i++) { s2 = 0; for (int j = 0; j < col-1; j++) s2 += tc[p[i][j]][p[i][j + 1]]; S2[i] = s2; } tempsAg = fopen("tempsAg.txt", "w"); printf(" Ft\n"); for (int i = 0; i < lig; i++) { f[i] = S1[i] + S2[i]; fprintf(tempsAg, "%lf\n", f[i]); } fclose(tempsAg); } void f2(int lig, int col, int ** p, double ** c, double ** cc, double * f, int ** p2) { double s1, s2; double * S1 = new double[lig]; double * S2 = new double[lig]; for (int i = 0; i < lig; i++) { s1 = 0; for (int j = 0; j < col; j++) s1 += c[p[i][j]][j]; S1[i] = s1; } for (int i = 0; i < lig; i++) { s2 = 0; for (int j = 0; j < col - 1; j++) s2 += cc[p[i][j]][p[i][j + 1]]; S2[i] = s2; } puisAg = fopen("puisAg.txt", "w"); printf("Fc\n"); for (int i = 0; i < lig; i++) { f[i] = S1[i] + S2[i]; fprintf(puisAg, "%lf\n", f[i]); printf("%lf\n", f[i]); } fclose(puisAg); } // Appliquer l'algorithme VEGA pour la selection des individus qui feront // objet d'un croisement et/ou Mutation void selection(int lig, int col, int ** p, double * f1, double * f2, int * par1, int * par2, int * ind) { // Sous pop 1 les 50 premiers individus sont classés selon F1 double z; int x; //Classement selon F1 for (int i = 0; i < ( (lig / 2) - 1); i++) { for (int j = i + 1; j < lig / 2; j++) { if (f1[j] < f1[i]) { z = f1[i]; f1[i] = f1[j]; f1[j] = z; for (int h = 0; h < col; h++) { x = p[i][h]; p[i][h] = p[j][h]; p[j][h] = x; } } } } double z1; int x1; //classement selon F2 for (int i = (lig / 2); i < lig - 1; i++) { for (int j = i + 1; j < lig; j++) { if (f2[j] < f2[i]) { z1 = f2[i]; f2[i] = f2[j]; f2[j] = z1; for (int h = 0; h < col; h++) { x1 = p[i][h]; p[i][h] = p[j][h]; p[j][h] = x1; } } } } ind[0] = rand() % 50; ind[1] = rand() % 50; for (int i = 0; i < lig; i++) { if (i == ind[0]) { for (int j = 0; j < col; j++) { par1[j] = p[i][j]; } } } for (int i = 0; i < lig; i++) { if (i == ind[1]) { for (int j = 0; j < col; j++) { par2[j] = p[i][j]; } } } } void croisement(int lig, int col, int ** p, int * par1, int * par2, int * enf1, int * enf2, int * ind, double ** t, double ** tc, double ** c, double ** cc) { for (int j = 0; j < col / 2; j++) { enf1[j] = par1[j]; enf2[j] = par2[j]; } for (int j = col / 2; j < col; j++) { enf1[j] = par2[j]; enf2[j] = par1[j]; } if (fti(col, enf1, t, tc) < fti(col, par1, t, tc)) { for (int j = 0; j < col; j++) { p[ind[0]][j] = enf1[j]; } } if (fci(col, enf2, c, cc) < fci(col, par2, c, cc)) { for (int j = 0; j < nbTache; j++) { p[ind[1]][j] = enf2[j]; } } } void mutation(int lig, int col, int ** p, double ** t, double ** tc, double ** c, double ** cc) { int * mut = new int[lig]; int * mut1 = new int[lig]; int id = rand() % 100; for (int i = 0; i < lig; i++) { if (i == id) { for (int j = 0; j < col; j++) { mut[j] = p[i][j]; mut1[j] = mut[j]; } } } int id1 = rand() % col; for (int j = 0; j < col; j++) { if (j == id1) { mut1[j] = 49 - mut[j]; } } if ( (fti(col, mut1, t, tc) < fti(col, mut, t, tc)) && (fti(col, mut1, t, tc) < fti(col, mut, t, tc))) { for (int j = 0; j < col; j++) { p[id][j] = mut1[j]; } } } double fti(int col, int * individu, double ** t, double ** tc) { double s1 0, s2 0; for (int j = 0; j < col; j++) { s1 += t[individu[j]][j]; // p[i]{j]= N°Configuration [j]=N° de la // tache } for (int j = 0; j < col - 1; j++) { s2 += tc[individu[j]][individu[j + 1]]; // p[i]{j]= // N°Configuration // [j+1]=N°configuration // suivante dans la solution // en cours } return s1 + s2; } double fci(int col, int * individu, double ** c, double ** cc) { double s1 0, s2 0; for (int j = 0; j < col; j++) { s1 += c[individu[j]][j]; // p[i]{j]= N°Configuration [j]=N° de la // tache } for (int j = 0; j < col - 1; j++) { s2 += cc[individu[j]][individu[j + 1]]; // p[i]{j]= // N°Configuration // [j+1]=N°configuration // suivante dans la solution // en cours } return s1 + s2; }