Cherche un algorithme

Résolu
baster200x Messages postés 47 Date d'inscription vendredi 7 mars 2008 Statut Membre Dernière intervention 24 juillet 2011 - 23 mai 2011 à 10:47
baster200x Messages postés 47 Date d'inscription vendredi 7 mars 2008 Statut Membre Dernière intervention 24 juillet 2011 - 26 mai 2011 à 12:14
bonjour
je cherche un algorithme nommé Vector Evaluation Genetic Algorithme (VEGA) mais en C/C++, je l'ai déjà en java mais puisque Il existe des concepts du C++ intranscriptible en Java (gestion fine de la mémoire, templates qui n'ont rien à voir avec les Generics de Java, RAII au lieu du gc, etc...).
merci de m'aider .

11 réponses

baster200x Messages postés 47 Date d'inscription vendredi 7 mars 2008 Statut Membre Dernière intervention 24 juillet 2011
24 mai 2011 à 14:23
ow!!! personne ne répondre ?
3
elkasimi2007 Messages postés 20 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 26 mai 2011
24 mai 2011 à 18:59
Salut,
envoie moi l'algorithme en pseudo code svp ou même en JAVA j’essaierai de t'aider
3
baster200x Messages postés 47 Date d'inscription vendredi 7 mars 2008 Statut Membre Dernière intervention 24 juillet 2011
25 mai 2011 à 12:20
merci pour la réponse; voila l'algorithme,
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;
}
}


je vous remercie beaucoup
cordiale salutation
j'attends votre réponse avec patience
3
elkasimi2007 Messages postés 20 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 26 mai 2011
25 mai 2011 à 12:49
import biputil2.SequentialFile normalement doit être converti en C/C++ par
#include "SequentialFile.h"

donc j'aurai besoin du code de la classe biputil2.SequentialFile pour la traduire en C/C++ sinon je vais considérer que c'est un ficher normal et je vais utiliser que le type FILE* du C pour lire les données.


a bientôt
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
baster200x Messages postés 47 Date d'inscription vendredi 7 mars 2008 Statut Membre Dernière intervention 24 juillet 2011
25 mai 2011 à 14:26
oui , vous pouvez utiliser la notion de fichier dans le c comme vous avez dites " type FILE* " ...
je n'oublierai pas votre aide, merci
3
elkasimi2007 Messages postés 20 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 26 mai 2011
25 mai 2011 à 19:41
voila ce que j'ai réalisé :
le code compile bien chez moi si t'as des soucis ne t'hésite pas. Pourtant je crois que les deux fonctions f1 et f2 peuvent être groupé en une seule fonction f et en changeant que le paramètre p1 ou p2, même remarque pour fti et fci.

----------------------------------------------------------------------------------------


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

à bientôt
3
elkasimi2007 Messages postés 20 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 26 mai 2011
25 mai 2011 à 19:47
#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;
}

3
baster200x Messages postés 47 Date d'inscription vendredi 7 mars 2008 Statut Membre Dernière intervention 24 juillet 2011
26 mai 2011 à 09:47
merci beaucoup cher amie tu m'as souvé la vie ... je te dois une !
3
baster200x Messages postés 47 Date d'inscription vendredi 7 mars 2008 Statut Membre Dernière intervention 24 juillet 2011
26 mai 2011 à 10:28
re-bonjour mon amie,
j'ai des problème lors de la compilation du fichier; il m'affiche les messages suivants:

je crois que je dois mettre
int i; avant la boucle ... que voyez vous ?
3
elkasimi2007 Messages postés 20 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 26 mai 2011
26 mai 2011 à 10:43
pour moi je l'ai compilé en tant que fichier C++
càd portant l'extension .cpp normalement tu copie coller le code dans un ficher pourtant l'extension .cpp tu le compile avec un compilateur dev-C++ ou codeblocks ou visual studio c++ express normalement ça doit marcher.

je crois que l'origine de ton erreur réside dans le fait que tu as nommer ton fichier .c au lieu de .cpp n'est ce pas ??

A bientôt
3
baster200x Messages postés 47 Date d'inscription vendredi 7 mars 2008 Statut Membre Dernière intervention 24 juillet 2011
26 mai 2011 à 12:14
c bon j'ai pas fait attention à l'extension .cpp avant j'ai utilisé .c c'est pour ça sa n'a pas marché
--------------------------------------------------------------------
Compiling: main.cpp
Process terminated with status 0 (0 minutes, 1 seconds)
0 errors, 0 warnings

--------------------------------------------------------------------
merci encore ...
3
Rejoignez-nous