baster200x
Messages postés47Date d'inscriptionvendredi 7 mars 2008StatutMembreDernière intervention24 juillet 2011
-
21 juil. 2011 à 10:19
baster200x
Messages postés47Date d'inscriptionvendredi 7 mars 2008StatutMembreDernière intervention24 juillet 2011
-
24 juil. 2011 à 09:11
Slt tous le mande!
je vous adresse pour m'aider à trouver une solution à mon problème!
j'ai un outil Open source Nommé Multicube explorer (M3explorer) je veux intégrer un Algorithme (VEGA) dans l'outil; mais ce qui me reste à faire c'est de changer les variables et les fonctions de l'algorithme avec celle de m3explorer ... et que je modifier le "Makefile" pour l'installer ; j'ai réussi aussi de connaitre les signification des variables tel que:
lig : le nombre de lignes
col : le nombre de colonnes
p : la population dans l'algorithme génétique
t : temps
tc : le temps de commutation d'une configuration à une autre
f : consommation énergétique
p1 : population après modification
malheureusement la doc est en anglais (et personnellement je suis nul en anglais) et voilà la documentation sur l'API de M3explorer: M3explorer API et j'ai rien capté ...
merci à vous
voilà l'algorithme VEGA:
#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;
}