begin process at 2012 05 28 12:49:23
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Maths

 > 

algorithme de greedy


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

algorithme de greedy

lundi 2 février 2009 à 18:18:16 | algorithme de greedy

starbluesky

Salut a tous!
S'il vous plait aidez-moi !!

Je suis un étudiant en mastère, je suis débutant en programmation, en effet je travaille sur les méthodes d'optimisation en recherche   opérationnelle, plus précisément  les méta-heuristiques.

Dans ce qui suit mon programme que j'ai écrits en langage C, qui vise à rechercher une solution qui va être utilisée par la suite comme une solution initiale (algorithme de greedy). Je vais essayer d'être bref pour expliquer qu'est ce que je veux faire exactement.

On a des coordonnes des points  qui sont stockes dans un fichier de type TXT, j'ai calcule la distance euclidienne pour avoir une matrice, le but maintenant c'est de trouve une route pour chaque véhicule celle-ci a une capacité limite (Qmax) qui doit être respecte et une distance a parcourus limitée (Dmax) aussi. Chaque client est visité une seule fois et par une seule véhicule.

P.S. : le nombre de voiture est limitée, l'essentiel c' visite tout les clients

Chaque voiture doit débuter de l'entrepôt (vertex 0) et retourne à l'entrepôt a la fin de son trajet.

Voila mon programme il marche mais les résultats sont faux.

Voici les données:

V0 0.0000 0.0000 0.0

V1 30.0000 0.0000 10.0

V2 29.6306 40.6930 30.0

V3 28.5317 90.2705 30.0

V4 6.7302 13.6197 10.0

V5 24.2705 17.6336 10.0

V6 11.2132 1.2132 30.0

Veuillez copiez ces donnes dans un fichier de type TXT et entrez l'adresse dans la fonction « getting data from txt file »

Le problème se localise dans la fonction greedy_algorithm pour les autres se marche normalement.

Pour ces donnes le résultat doit être 4 routes :

Route [0] : 0-6-0

Route [0] : 0-4-5-1-0

Route [0] : 0-2-0

Route [0] : 0-3-0

Aidez-moi s'il vous plait !! Merci d'avance à ceux qui prendront la peine d'essayer de coder ou de lire le message.

LE PROGRAMME:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

/************Global Variables************/
#define vertices 7 // Number of Customers
#define Qmax 30 //Vehicle Capacity
#define Dmax 100 //Maximum Distance Covered by Each Vehicle

struct data
{
    char label[15];
    float x;
    float y;
    float q;
} tab [500];

/************Getting Data from TXT_FILE************/
int get_data ()
{
    FILE *input;
    char s[80];
    int i,n;
    input = fopen("C:\\Users\\User\\Desktop\\TEST_FILE.txt","r"); // veuillez entrez l'adresse ou se localise le fichier de donnees
    if((input)!= NULL)
        printf("File Opened Successfully\n");
    else
        printf("ERROR OCCURRED...File Failed to be Opened!\n");

    n=0;
    while (fgets(s,80,input))
    {
        sscanf (s,"%s%f%f%f", tab[n].label, &tab[n].x, &tab[n].y, &tab[n].q);
        n++ ;
    }
    for (i= 0 ; i <n ; i++)
        printf ("\n%s %3.4f %3.4f %2.0f", tab[i].label, tab[i].x, tab[i].y, tab[i].q);
    return (n);
}

/*****************dynamic allocation for Matrix **********/
float** allocate(int N, int M)
{
    int i;
    float **A = NULL;

    //we allocate memory for N row, it's row pointer
    A = (float**) malloc( sizeof(float*) * N );
    // if allocation succeed we allocate for M column
    if( A != NULL )
        for( i=0; i<N; i++ )
            A[i] = (float*) malloc( sizeof(float) * M );
    if (A == NULL)
    {
        puts("\nFailure to allocate room for pointers");
        exit(0);
    }

    return A;
}

/*************Deallocate Matrix (Free Memory)*******************/
void deallocate( float **A, int N )
{
    int i;
    //free each row
    for( i=0; i<N; i++ )
        free( A[i] );

    free( A );
}

/**********display a table**********/
void display_table( float *vector, int taille )
{
    int i;

    for( i=0; i<taille; i++ )
        printf("[%d] %f\t", i, vector[i]);
}


/******* display a matrix *******8*/
void display_matrix( float **A, int N, int M)
{
    int i, j;

    for(i=0; i<N; i++)
    {
        for(j=0; j<M; j++)
            printf(" %f ", A[i][j]);

        printf("\n");
    }
}

/************compute the Euclidean Distance************/
float** euclidian_distance (float *row, float *column, int t)
{
    int i,j;
    float **matrix;
    float xd=0,yd=0;
    matrix = allocate(vertices, vertices);
   
    printf("\n\nThe Matrix of Distance is:\n");
    for(i=0;i<t;i++)
    {
        for(j=0;j<t;j++)
        {
            xd=tab[i].x-tab[j].x;
            yd=tab[i].y-tab[j].y;
            matrix[i][j]=sqrt((xd*xd)+(yd*yd));
        }
    }
    return (matrix);
}

/**************************search value minimum in matrix*****************************/
float search_value(float **mat, int t, int indice)
{
    float MIN=1000;// each time initialize TEMP to 99.9
    int j;

    for(j=1;j<t;j++)
    {
        if((mat[indice][j]<MIN)&&(mat[indice][j]!=0))
        MIN=mat[indice][j]; // assign the value to TEMP
    }

    return (MIN);
}

/**************************search its indice in matrix*****************************/
int search_indice(float **mat, int t, int indice)
{
    float MIN=1000;// initialize MIN each time
    int j,y;

    for(j=1;j<t;j++)
    {
        if((mat[indice][j]<MIN)&&(mat[indice][j]!=0))
        {
            MIN=mat[indice][j]; // assign the value to MIN
            y=j;
        }
    }
    return (y);
}

/************Construction of Initial Solutions Using Greedy Algorithm************/
void greedy_algo (float **mat, int t )
{
    float **dist, **qte ;
    float MIN;
    int c,i,j,z,k,w,col,x,y;
    float *D,*Q;
    int *indice;
    float *sequence;
    //float **ptr1, *ptr2;
   
    dist = allocate(sizeof (k) , vertices);
    qte = allocate(sizeof (k) , vertices);

    sequence = (float*) malloc (vertices *sizeof (float));
    indice = (int*) malloc (vertices *sizeof(int));

    Q = (float*) malloc(sizeof (k) * sizeof(float) );
    D = (float*) malloc( sizeof (k) * sizeof(float) );

    //initialize table
    for(i=0;i<t;i++)
    {
        Q[i]=0;
        D[i]=0;
    }

    i=0; //initialize row to 0
    j=0;
    for(x=0;x<t;x++)
    {
        for(y=1;y<t;y++)
        {
            while (mat[x][y]!=0)//repeat till the matrix is equal to 0 except column 1
            {
                MIN=search_value(mat,t,i); //printf("\n%f\n",MIN);
                sequence[j]=MIN;
                i=search_indice(mat,t,i); //printf("\n%d\n",i);
                indice[j]=i;
               
                for(z=0;z<t;z++)
                {
                    mat[z][i]=0;// transform the whole column to inorder to avoid return to same point
                }
                j++;
            }
        }
    }
    printf("\n");
    display_table(sequence,t-1);
    puts("\n");
    for(k=0;k<t-1;k++)
        printf("[%d] %d\t",k,indice[k]);

    k=0; //initialize the first route
    col=0;
    w=0;
    for(c=0;c<t-1;c++)
    {
        dist[k][col]=sequence[c]; //printf(" %f\t",dist[k][col]);
        qte[k][col]=tab[indice[c]].q; //printf(" %f\t",qte[k][col]);
       
        Q[k]+=qte[k][col];
        D[k]+=dist[k][col]+mat[indice[c]][0];
       
        if((Q[k]>=Qmax)||(D[k]>=Dmax))
        {
            k++;//goto next road
            col=-1;
            if(c<t-2)
            {
                c++;
                D[k]+=mat[indice[c]][0];//start from the depot
                c--;
            }
        }
        else
            D[k]-=mat[indice[c]][0];
        if (c==t-2)
            D[k]+=mat[indice[c]][0];

        col++;
    }
   
    printf("\n\nmatrice of distance\n");
    display_matrix(dist,k, c);
    printf("Total of Distance of road\n");
    display_table( D, k );
   
    printf("\n\nmatrice of quantity\n");
    display_matrix(qte,k,c);
    printf("Total quantity of road\n");
    display_table( Q, k );

    printf("\n");
    display_matrix(mat,t,t);
}
                 
             
/**************************Principal Program****************************************/
void main (void)
{
    int n;
    FILE *fp;
    float **distance_matrix;
   
    distance_matrix = allocate(vertices, vertices);
   
    fp=fopen("C:\\Users\\Mohamed Anis TRIGUI\\Desktop\\RESULT_FILE_TEST.txt","w");
    n=get_data();
    distance_matrix =euclidian_distance(&tab[100].x, &tab[100].y, vertices);
    display_matrix(distance_matrix,vertices,vertices);
    greedy_algo(distance_matrix, vertices);
}

lundi 2 février 2009 à 18:21:55 | Re : algorithme de greedy

starbluesky

excuser moi pour la faute
les resultats doivent etre

Route [0] : 0-6-0 // 1er route

Route [1] : 0-4-5-1-0 // 2eme route

Route [2] : 0-2-0 // 3eme route

Route [3] : 0-3-0 // 4eme route
4 routes en totales


Cette discussion est classée dans : int, printf, for, matrix, float


Répondre à ce message

Sujets en rapport avec ce message

aidez-moi s'il vous plait !!!!!!!! [ par starbluesky ] Salut a tous! aidez-moi s'il vous plait  !! Je suis un étudiant en mastè HELP [ par alex64100 ] BONOURje doit réaliser un   prog de tri de caractèresvoici mon code#include #include #include #include int main (int argc,  char ar la programmation de l'algorithme du simplexe [ par soums2009 ] salut à tous j'ai un probleme  avec mon code qui implemente l'algoritme du symplexe et je sollicite votre aide pour pouvoir terminer et rendre mon dev Produit matriciel en c renvoit des valeurs complètement fausses [ par bilel59 ] Bonjout à tous, je sollicite votre aide pour la raison indiquée dans le titre, en effet le produif matriciel que j'effectue renvoit des valeurs vraime Return tableau? [ par zut69 ] Bonjour,Je suis en train d'écrire un petit programme sur les matrices en C, mais vu que je veux faire quelque chose d'assez général, j'ai besoin que d A l'aiiiiide!!!! [ par Dorn17 ] Salut j'essaie depuis un moment de créer un programme pouvant résoudre des systèmes du type Ax=b par la méthode de Gauss.Toutefois j'ai des résultats ou est l'erreur : boucles imbriquées [ par pausecpp ] le compilateur ne mentionne aucune "error" ni "warning" pourtant j'ai fait le programme pour que le valeur de S[N][M] changent!!!voici le code ( merci besion d' aide [ par ccfacile ] j'ai  fais un programme sur devc++ pour resoudre l'equation matricielle : A*X=B ,  je vois pas ou est elle euruer ? est ce que vous pouvez aidez SVP, random et printf avec for :( [ par sokotanic ] salutj'ai besoin d'aide#include #include #include //Abdou chez les Almohadesusing namespace std;int main(){    srand(time(NULL));int j,i;i Trie bulle [ par afrikanoo ] #include #include void main(){ clrscr(); int n; <font color="#d3d3d


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales