Aide dans un Algorithme de croisement en C
J'ai essayé de faire un programme C de croisement mais je ne sais pas comment faire l'appel pour la fonction du croisement et l'affichage du resultat!!
j'ai fait cette fonction de croisement, je veut utiliser les deux matrices populations : pop et child au lieu de pere1, pere2, e1 et e2, Reformuler le code de la fonction CroisementMPX: enlever tout code inutile ou redondant pour optimiser le code.
Le code après test se bloque dans certains cas, est ce qu'il y a une instruction (qui manque) dont la présence va empêcher ce plantage.
Explication S.V.P!!
Je veux aussi le programme principal qui:
-Utilise la fonction Selection pour choisir deux parents de la matrice pop.
-Affiche les deux pères.
-Applique la fonction CroisementMPX.
-Les deux enfants obtenus seront stockés dans la matrice child.
-Affiche les deux enfants ainsi que leurs couts.
(S.V.P toutes modification doivent etre commenté et merci :) )
Mon travail:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| /************************* Croisement PMX ************************/
void croisementMPX(int *pere1, int *pere2, int *e1, int *e2, int taille)
{
int pos1, pos2, i, j, aux;
int *VerifE1 = new int[taille];
int *VerifE2 = new int[taille];
for (i = 0; i < taille; i++)
VerifE1[i] = 0;
for (j = 0; j < taille; j++)
VerifE2[j] = 0;
////////////////Génération de deux positions////////////////
pos1 = 2 + rand() % (taille - 5);
pos2 = 2 + rand() % (taille - 5);
if (pos1 == pos2)
pos2 = pos1 + 2;
if (pos1 > pos2) {
aux = pos2;
pos2 = pos1;
pos1 = aux;
}
/////////////////////////////////////////////////////////////
for (i = 0; i < taille; i++) {
if (i >= pos1 && i < pos2) {
e1[i] = pere1[i];
VerifE1[pere1[i] - 1] = 1;
} else
e1[i] = 0;
}
for (i = 0; i < taille; i++) {
if (i < pos1) {
if (!VerifE1[pere2[i] - 1]) {
e1[i] = pere2[i];
VerifE1[pere2[i] - 1] = 1;
} else if (!VerifE1[pere1[i] - 1]) {
e1[i] = pere1[i];
VerifE1[pere1[i] - 1] = 1;
} else {
for (j = pos1; j < pos2; j++)
if (!VerifE1[pere2[j] - 1]) {
e1[i] = pere2[j];
VerifE1[pere2[j] - 1] = 1;
}
}
}
if (i >= pos2) {
if (!VerifE1[pere2[i] - 1])
{
e1[i] = pere2[i];
VerifE1[pere2[i] - 1] = 1;
} else if (!VerifE1[pere1[i] - 1]) {
e1[i] = pere1[i];
VerifE1[pere1[i] - 1] = 1;
} else {
for (j = pos1; j < pos2; j++) {
if (!VerifE1[pere2[j] - 1]) {
e1[i] = pere2[j];
VerifE1[pere2[j] - 1] = 1;
}
}
}
}
}
// printf("n Enfant2n");
for (i = 0; i < taille; i++) {
if (i >= pos1 && i < pos2) {
e2[i] = pere2[i];
VerifE2[pere2[i] - 1] = 1;
} else
e2[i] = 0;
}
for (i = 0; i < taille; i++) {
if (i < pos1) {
if (!VerifE2[pere1[i] - 1]) {
e2[i] = pere1[i];
VerifE2[pere1[i] - 1] = 1;
} else if (!VerifE2[pere2[i] - 1]) {
e2[i] = pere2[i];
VerifE2[pere2[i] - 1] = 1;
}
else {
for (j = pos1; j < pos2; j++) {
if (!VerifE2[pere1[j] - 1]) {
e2[i] = pere1[j];
VerifE2[pere1[j] - 1] = 1;
}
}
}
}
if (i >= pos2) {
if (!VerifE2[pere1[i] - 1]) {
e2[i] = pere1[i];
VerifE2[pere1[i] - 1] = 1;
} else if (!VerifE2[pere2[i] - 1]) {
e2[i] = pere2[i];
VerifE2[pere2[i] - 1] = 1;
} else {
for (j = pos1; j < pos2; j++) {
if (!VerifE2[pere1[j] - 1]) {
e2[i] = pere1[j];
VerifE2[pere1[j] - 1] = 1;
}
}
}
}
}
free(VerifE1);
free(VerifE2);
} |
MERCI D'AVANCE!!!