Algorithme de fourmis

oubabas Messages postés 1 Date d'inscription mardi 24 mai 2011 Statut Membre Dernière intervention 28 mars 2012 - 28 mars 2012 à 13:45
BunoCS Messages postés 15480 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 12 juin 2024 - 29 mars 2012 à 14:19
salut, tous le monde, svp aidez moi , j'ai un problème dans la compilation de le code ci dessous qui est l'optimisation par colonie de fourmis , l'erreur est au niveau de cette ligne :
list= g_list_nth(cellules[numero].villestill,0); l'erreur qu'il affiche est: cannot convert `Glist*' to `GList*' for argument `1' to `GList* g_list_nth(GList*, int)'

le code est le suivant:
/*
# Header of antsys.c Exemple pour 5 embranchements
# */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "glib.h"
#include "glist.h"


#define TAILLEX 700
#define TAILLEY 700
#define NOMBRE_INDIVIDU 700
#define NODES 5
#define MINPH 1
#define MAXPH 5000

typedef struct cell
{
int Dest;
int Arc;
int State;
int Current;
struct Glist *villestill;
int villevisited[(NODES + 1)];
} cell;

typedef struct
{
int x;
int y;
} vector;

enum { SEARCHING, NOTHING, RETURNING };

float EVAPORATION = 0.20;
int map[TAILLEX][TAILLEY];
int ArcSize[NODES][NODES];
float tabR[NODES][NODES];
float ArcPheromone[NODES][NODES];
vector DestPos[NODES];
cell cellules[NOMBRE_INDIVIDU];

int rdtsc()
{
__asm__ __volatile__("rdtsc");
}
struct GList *g_list_nth(GList *list,int n);






void setPheromone(int from, int to)
{
float ph;

ph = (100 * NODES) / (float)(ArcSize[from][to] + 1 - NODES);
printf("TAUX PHEROMONIQUE : %f\n",ph);
ArcPheromone[from][to] += ph;
if(ArcPheromone[from][to] < MINPH) ArcPheromone[from][to] = MINPH;
if(ArcPheromone[from][to] > MAXPH) ArcPheromone[from][to] = MAXPH;
ArcPheromone[to][from] = ArcPheromone[from][to];
}

void evaporation()
{
int i, j;

for(i = 1; i <= NODES; i++)
{
for(j = 1; j <= NODES; j++)
{
ArcPheromone[i][j] = ArcPheromone[i][j] * (float)(100 - EVAPORATION) / 100;
if(ArcPheromone[i][j] < MINPH) ArcPheromone[i][j] = MINPH;
ArcPheromone[j][i] = ArcPheromone[i][j];
}
}

}
int direction(int numero){
}


void travelling(int Old, int Dest)
{

int length;
int i;

length = ArcSize[Old][Dest];
for(i = 0; i < length; i++)
{
rand() % 100;
}

}

int run(int numero)
{
int dest;
int j = 1;
int i;
struct Glist *list;

cellules[numero].State = NOTHING;
cellules[numero].Current = 1;
cellules[numero].villevisited[j] = 1;
cellules[numero].State = SEARCHING;
dest = direction(numero);
travelling(cellules[numero].Current,dest);
cellules[numero].Current = dest;
j++;
cellules[numero].villevisited[j] = dest;
list = g_list_nth(cellules[numero].villestill,0);
cellules[numero].villestill = glist_remove(cellules[numero].villestill,list->data);
printf("DESTINATION : %i\n",dest);
while(dest != -1)
{
cellules[numero].State = NOTHING;
cellules[numero].Current = dest;
j++;
cellules[numero].villevisited[j] = dest;
cellules[numero].State = SEARCHING;
dest = direction(numero);

if(dest == NODES)
{
cellules[numero].State = RETURNING;
for(i = NODES; i >= 2; i--) setPheromone(cellules[numero].villevisited[i], cellules[numero].villevisited[(i - 1)]);
return -1;
}

travelling(cellules[numero].Current,dest);
printf("DESTINATION : %i\n",dest);
}
return -1;
}

int direction(int numero)
{
float pheromoneSize = 0;
float pheromone = 0;
float tmpheromone = 0;
float temp2;
int j 1, i 1;
int temp1;
int retour;
GList *tmp;

for(j = 1; j <= g_list_length(cellules[numero].villestill); j++)
{
tmp = g_list_nth(cellules[numero].villestill,(j - 1));
printf("%i\n",(int)tmp->data);
if((int)tmp->data == cellules[numero].Current) continue;
pheromoneSize += ArcPheromone[cellules[numero].Current][(int)tmp->data];
}
temp1 = (int)pheromoneSize * 10;
temp2 = (float) (rand() % temp1);
pheromone += (float)(temp2 / (float) 10);
printf("PHEROMONE : %f \n",pheromone);
while(i <= g_list_length(cellules[numero].villestill))
{
tmp = g_list_nth(cellules[numero].villestill,(i - 1));
if(((int)tmp->data NODES) && (g_list_length(cellules[numero].villestill) 1))
{
cellules[numero].villestill = g_list_remove(cellules[numero].villestill,tmp->data);
return NODES;
}
if(((int)tmp->data !NODES) && (g_list_length(cellules[numero].villestill) 1)) return -1;
if(((int)tmp->data == NODES) && (g_list_length(cellules[numero].villestill) != 1))
{
i++;
continue;
}
if((int)tmp->data == cellules[numero].Current)
{
i++;
continue;
}
tmpheromone += ArcPheromone[cellules[numero].Current][(int)tmp->data];
if(tmpheromone > pheromone) break;
if(i == (int)g_list_length(cellules[numero].villestill)) return -1;
i++;
}
printf("(%d villes)\n", g_list_length(cellules[numero].villestill));
retour = (int)tmp->data;
cellules[numero].villestill = g_list_remove(cellules[numero].villestill,tmp->data);
return retour;
}

void init()
{
int i, j, temp1, temp2;
FILE *file = NULL;

file = fopen("ant.conf","r+");
if(file == NULL) perror("fopen()");
fscanf(file,"%f",&EVAPORATION);
fclose(file);

for(i = 1; i <= NOMBRE_INDIVIDU; i++)
{
for(j = 1; j <= NODES; j++)
{
cellules[i].villestill = g_list_append(cellules[i].villestill,GINT_TO_POINTER(j));
}
}

for(i = 0; i <= NODES; i++)
{
for(j = 0; j <= NODES; j++)
{
ArcPheromone[i][j] = 1;
}
}

for(i = 1; i <= NODES; i++)
{
for(j = 1; j <= NODES; j++)
{
if(i != j)
{
temp1 = abs((DestPos[i].x - DestPos[j].x));
temp2 = abs((DestPos[i].y - DestPos[j].y));
temp1 = (temp1 * temp1);
temp2 = (temp2 * temp2);
ArcSize[i][j] = sqrt((temp1 + temp2));
}
}
}

}

void
DrawVille(cairo_t * cr, double x, double y, double col)
{
cairo_set_source_rgba(cr, 1, 0.2, col, 0.6);
cairo_set_line_width(cr, 10.0);
cairo_arc(cr, x, y, 10.0, 0, 2 * M_PI);
cairo_fill(cr);
cairo_stroke(cr);
}

void
DrawArc(cairo_t * cr, double xfrom, double yfrom, double xto, double yto, double ph)
{
cairo_set_line_width(cr, ph);
cairo_move_to(cr, xfrom, yfrom);
cairo_line_to(cr, xto, yto);
cairo_stroke(cr);
}

int predicat(void *val1, void *val2)
{
return (*((int *)val1) - *((int *)val2));
}

int forensic_result(float tab[][NODES], int numeroArc)
{
int i;
int j = 1;
float tabT[NODES];
for(i 1; i < NODES; i++) tabT[i] tab[numeroArc][i];

qsort(tabT,NODES,sizeof(float),predicat);

for(i = 1; i < NODES; i++)
if(tabT[(NODES - 1)] == tab[numeroArc][i]) break;
else j++;
return j;
}

void *start(void *arg)
{
int retour;
int numero;
int best;
int i;
int j;
int nbpassage;

init();

retour = -1;
numero = 1;
nbpassage = 0;
while((retour == -1) && (numero != NOMBRE_INDIVIDU))
{
retour = run(numero);
numero++;
if(numero > 10) evaporation();
}

for(i = 1; i <= NODES; i++)
{
for(j = 1; j <= NODES; j++)
{
if(i != j)
{
printf("%i %i %f\n",i,j,ArcPheromone[i][j]);
}
}
}

for(i = 1; i < (NODES - 1); i++)
{
best = forensic_result(ArcPheromone,i);
if((i (NODES - 1)) || (best (NODES - 1)))
{
nbpassage++;
if(nbpassage <1) ArcPheromone[i][best] 1000.0;
else continue;
}
ArcPheromone[i][best] = 1000.0;
}

}

j'attends vos réponses, Merci d'avance

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
28 mars 2012 à 14:44
Bonjour.

Si tu ne fais pas l'effort de mettre ton code dans des balises de code, on ne fera pas l'effort de lire.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
BunoCS Messages postés 15480 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 12 juin 2024 103
29 mars 2012 à 14:19
Hello,
CptPingu++
Néanmoins, je n'ai pas eu besoin de lire le code pour comprendre:
cannot convert `Glist*' to `GList*'

Si tu regardes ta déclaration, tu as mis un l minuscule au lieu d'un L majuscule
ça arrive souvent, mais il faut faire l'effort de lire les messages du compilo...

@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
Rejoignez-nous