baster200x
Messages postés47Date d'inscriptionvendredi 7 mars 2008StatutMembreDernière intervention24 juillet 2011
-
18 juin 2011 à 12:07
baster200x
Messages postés47Date d'inscriptionvendredi 7 mars 2008StatutMembreDernière intervention24 juillet 2011
-
30 juin 2011 à 10:16
bonjour les amis
j'ai trouvé la solution pour mes problème que je l'ai poser précédemment sur le forum à propos de l'intégration d'un module d'optimisation (algorithme d'optimisation) VEGA dans un outil Open Source nommé Multicube explorer;
la solution consiste à créer la class .CPP + le fichier header .h de l'algorithme VEGA (ce qui est fait!) avant l'installation de l'outil; le problème qui ce pose c'est que pour le faire marcher, je ne sais pas ce qu'il doit prendre comme paramètre .
m3explorer c'est un outil pour l'exploration des architecture paramétrable,
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
FILE *fichier, *cache, *temps_access, *puissance_access, *pop;
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);
}
main.h:
--------
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 nbTache = 10;
FILE *tempsAg, *puisAg;
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;
}
SVP.... aidez moi à trouver ce que je doit mettre comme paramètre dans les fonctions pour que l'algorithme marche. je serai très reconnaissant
merci beaucoup, je n'oublierai jamais votre soutien .
baster200x
Messages postés47Date d'inscriptionvendredi 7 mars 2008StatutMembreDernière intervention24 juillet 2011 30 juin 2011 à 10:16
BONJOUR .
JE voix qu'il y a personne pour m'aider... j'ai voulu juste savoir quel paramètre utilise dans le premier algorithme .. je sais que je doit utilisé les paramètre suivants:
m3point pour modeliser les points
m3_env te permettra de récuperer tout ce qui concerne les entrées et les sorties ainsi que le plan d’expérience sélectionné par exemple
et autre objet pour faire tourner le code comme m3_map, m3_vector, m3_parser, ....
y on a surement d'autre mais je les connais pas et pour cela j'ai demander l'aide de vous car vous savez plus que moi en programment avec C/C++