IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Remplissage tableau sous contraintes


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Points : 109
    Points
    109
    Par défaut Remplissage tableau sous contraintes
    Bonjour,

    Je souhaiterai construire des districts sous forme de groupe de secteurs sous certaines contraintes.
    Données du problème :
    const int sizemax=101; // nombre de secteurs
    const int numberDistricts=4; // nombre de districts
    const int parametre_distance = 10 ; // distance max entre deux secteurs

    Pour construire ces districts il faut :
    Step 1
    // choisir un secteur aleatoirement entre deux bornes
    // stocker ce secteur dans la premiere cellule du Tab_District
    // parcourir tous les secteurs différents du secteur déjà inséré dans la première case
    // insérer tous les secteurs dans ce tableau a condition que la distance entre le premier secteur et le nouveau secteur ne
    // dépasse pas un paramètre distance qu'on note par "parametre_distance"
    Step 2
    // remplir tous les autres districts de la meme façon à condition que le secteur en première position soit différentes des
    //secteurs déjà insérés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* pseudo code*/
    /*
    1. Choisir un secteur de base S
    2. vérifier si déjà pris comme secteur de base
    	sinon parcourir tous secteurs différents de S en respectant critère à les ajouter aux districts courants
    		passer au district suivant					
    */
    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    cerr <<"numberDistricts"<<numberDistricts<<endl;
    					cerr <<"sizemax"<<sizemax<<endl;
     
    					srand ((unsigned) time (NULL));
    					int Tab_District[numberDistricts][sizemax];	
    					int borne_max_sec = sizemax-1;
    					int borne_min_sec = 0;
    					// Choisir un secteur de base S
    					for(i=0; i<numberDistricts; ++i)
    					{
    						cerr << " ************ district " << i << "*************" << endl;
    						// Choisir un secteur de base S
    						secteur_principal = rand()%(borne_max_sec - borne_min_sec) + borne_min_sec;
    						//cerr << " secteur " << secteur_principal << endl;
    						Tab_District[i][0] = secteur_principal;
    						test_secteur = true;
    						int t=0;
    						//vérifier si déjà pris comme secteur de base
    						if(Tab_District[t+1][0] == Tab_District[i][0] )
    						{
    							test_secteur = false;
    						}
    						//sinon parcourir tous secteurs différents de S en respectant critère à les ajouter aux districts courants
    						else
    						{
    							for(j=0; j<sizemax; j++)
    							{
    								if(td[Tab_District[i][0]][j] < parametre_distance)
    								{
    									//cerr <<"deplacement"<<td[Tab_District[i][0]][j]<<endl;
    									Tab_District[i][j] = j;
    									cerr << " secteur numero = " << Tab_District[i][j] << endl;
    								}
    							}
    						}
    					}
    Le problème que je rencontre c'est que mes tableaux de districts contiennent parfois les mêmes secteurs (dans la première case).
    Un exemple d'affichage de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    ************ district 1*************
    secteur numero = 34
    secteur numero = 43
    secteur numero = 56
    secteur numero = 62
    secteur numero = 66
    secteur numero = 83
    secteur numero = 91
    secteur numero = 97
     
    ************ district 2*************
    secteur numero = 16
    secteur numero = 22
    secteur numero = 30
    secteur numero = 33
    secteur numero = 35
    secteur numero = 44
    secteur numero = 59
    secteur numero = 67
    secteur numero = 71
    secteur numero = 81
    secteur numero = 84
    ************ district 3*************
    secteur numero = 19
    secteur numero = 29
    secteur numero = 45
    secteur numero = 54
    secteur numero = 77
    ************ district 4*************
    secteur numero = 16
    secteur numero = 22
    secteur numero = 30
    secteur numero = 33
    secteur numero = 35
    secteur numero = 44
    secteur numero = 59
    secteur numero = 67
    secteur numero = 71
    secteur numero = 81
    secteur numero = 84
    Vous voyez très bien qu'il y a un problème dans le district 2 et 4.
    Pour avoir un résultat correct il faut que les deux premières cases de ces deux districts (secteur 16) soient différentes.

    Je vous remercie de me corriger mon code.
    Bonne soirée à tous.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Votre test ligne 19 est complètement à coté de la plaque.

    Mais votre code est extrêmement complexe pour rien.

    - n'utilisez pas rand, c'est du C des années 70, c'est plus que casse-gueule
    - n'utilisez pas des tableau à la C, il existe la classe std::vector ou std::liste qui simplifiera grandement votre code.

    Au lieu de vous prendre la tête avec la détection de secteurs déjà utilisé, le plus simple c'est d'avoir une liste de secteur "libre", que vous mélangez.
    Après mélange, vous prenez le premier de la liste "libre", que vous sortez de la liste "libre" pour ne pas le reprendre.
    Vous le mettez dans votre première listes des "affectés_1", vous scannez la liste des 'libre", dés qu'un secteur est éligible, vous le transférer de la liste des "libre" à la liste des "affectés_1".
    Il ne restera à la fin, dans la liste des "libre" que les secteurs non affectés dans le premier district.
    Vous pouvez donc prendre le premier secteur de la liste "libre" pour le mettre dans "affectés_2", et faire un scanne de la liste des 'libre", etc...

    En plus si "affectés_1", "affectés_2", ne sont pas dans un tableau mais dans une liste de liste, vous n'aurez aucune limite en terme de nombre de district.

  3. #3
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Votre test ligne 19 est complètement à coté de la plaque.

    Mais votre code est extrêmement complexe pour rien.

    - n'utilisez pas rand, c'est du C des années 70, c'est plus que casse-gueule
    - n'utilisez pas des tableau à la C, il existe la classe std::vector ou std::liste qui simplifiera grandement votre code.

    Au lieu de vous prendre la tête avec la détection de secteurs déjà utilisé, le plus simple c'est d'avoir une liste de secteur "libre", que vous mélangez.
    Après mélange, vous prenez le premier de la liste "libre", que vous sortez de la liste "libre" pour ne pas le reprendre.
    Vous le mettez dans votre première listes des "affectés_1", vous scannez la liste des 'libre", dés qu'un secteur est éligible, vous le transférer de la liste des "libre" à la liste des "affectés_1".
    Il ne restera à la fin, dans la liste des "libre" que les secteurs non affectés dans le premier district.
    Vous pouvez donc prendre le premier secteur de la liste "libre" pour le mettre dans "affectés_2", et faire un scanne de la liste des 'libre", etc...

    En plus si "affectés_1", "affectés_2", ne sont pas dans un tableau mais dans une liste de liste, vous n'aurez aucune limite en terme de nombre de district.
    Merci pour ta réponse. En effet, j'ai résolu mon problème

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. remplissage tableau sous condition
    Par gauguin dans le forum C
    Réponses: 6
    Dernier message: 15/02/2007, 17h06
  2. Insérer un tableau sous Word depuis Delphi
    Par muquet dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2005, 11h59
  3. Problème Tableau Sous DW
    Par Lorik dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 04/10/2005, 11h55
  4. [vbexcel]Pb remplissage tableau
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/09/2005, 13h36
  5. Probleme de hauteur de tableau sous netscape
    Par teshub dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 26/08/2005, 16h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo