Problème d'intégrer mon algorithme

baster200x Messages postés 47 Date d'inscription vendredi 7 mars 2008 Statut Membre Dernière intervention 24 juillet 2011 - 21 juil. 2011 à 10:19
baster200x Messages postés 47 Date d'inscription vendredi 7 mars 2008 Statut Membre Dernière intervention 24 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;
} 

1 réponse

baster200x Messages postés 47 Date d'inscription vendredi 7 mars 2008 Statut Membre Dernière intervention 24 juillet 2011
24 juil. 2011 à 09:11
il n'y a personne pour m'aider ?
0
Rejoignez-nous