|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
Organisation d'une boucle ... je cale ! |
Débuté par info, 14 oct. 2005 10:57 - 4 réponses |
| |
| | | |
|
| |
Posté le 14 octobre 2005 - 10:57 |
Bonjour,
Depuis un bon moment, je tourne en rond et ne trouve pas de possibilité. Peut-être pouvez-vous m'aider ?
Ce que je veux réaliser: pour calculer un prix d'une location, je dois combiner un nombre variable de possibilités jusqu'à ce que la durée de la location soit complêtement couverte. L'ordre des possibiltés joue un rôle essentiel dans le résultat final, je dois donc pouvoir les combiner dans tous les ordres possibles, mais en limitant toutefois la combinaison à une profondeur de 10.
Mes possibilités sont - au départ - stockées sur un fichier HF puis je les copie sur une variable tableau/structure MesPoss(n). Ceci afin d'allèger les trafic réseau et d'accélérer la boucle.
par exemple si MesPoss contient 5 enregistrements :
MesPoss[1]:stNo = 1 MesPoss[1]:stNom = "Matin"
MesPoss[1]:stNo = 2 MesPoss[1]:stNom = "Après-midi"
MesPoss[1]:stNo = 3 MesPoss[1]:stNom = "Journée"
MesPoss[1]:stNo = 4 MesPoss[1]:stNom = "Semaine"
MesPoss[1]:stNo = 5 MesPoss[1]:stNom = "Mois"
Ces exemples sont ici très simplifiés, car il y a en plus une notion d'horaires et de Tolérance par rapport aus heures d'ouverture du point de location qui se greffe là-dessus.
En tout cas, et selon la durée de la location, je dois pouvoir obtenir des résultats tels que : 1 journée + 1 matin 1 semaine + 1 journée 1 semaine + 1 journée + 1 après-midi 1 mois + 1 semaine + 1 matin etc ... vous voyez le genre...
Dans un cas bien précis j'ai une période de 8 jours + 3 heures + 23 minutes j'attends donc en gros les possibilités suivantes - 8 journée + 1 après-midi - 1 semaine + 1 journée + 1 après-midi - 1 semaine + 2 journées - 1 mois
ensuite je sélectionne la possibilité la moins chère comme étant la bonne. dans mon exemple, vous l'aurez deviné, ce sera "1 semaine + 1 journée + 1 après-midi "
Pour ce qui est des calculs et comparaisons, je n'ai pas de problème.
Là où je cale sérieusement, c'est que je n'arrive pas à organiser ma/mes boucle(s) afin de considérer l'ensemble des possibilités en permettant d'en reprendre la liste à son début et en excluant seulement celles déjà testées dans les différentes "profondeurs".
j'entends par profondeurs la notion suivante : Prof. 1 Prof. 2 Prof. 3 etc... 8 journée + 1 après-midi 1 semaine + 1 journée + 1 après-midi 1 semaine + 2 journée 1 mois
Savez-vous comment je peux procéder ?
Merci d'avance pour vos suggestions, de mon côté je continue à me creuser la cervelle, et si je trouve LA solution, je vous le dirai.
A bientôt
Christophe |
| |
| |
| | | |
|
| | |
| |
Posté le 14 octobre 2005 - 11:16 |
Mets un rang à ta profondeur
1 = an 2 = mois 3= jours 4 = hr 5 =mn 6=sec
ainsi tu peux faire tous les calculs que tu veux à partir du momment ou tu sais le rang
1 + 2+ 3 + 4 + 5 + 6 si pas de jour 1 +2 +4 +5 +6
j'espère que cela t'aidera |
| |
| |
| | | |
|
| | |
| |
Posté le 14 octobre 2005 - 22:09 |
Salut ! Et bien à l'examen de ton énoncé, je penserais à la décomposition en facteurs premiers. (si tu te rappelle de tes cours de maths)
J'espère que ca t'aideras. |
| |
| |
| | | |
|
| | |
| |
Posté le 16 octobre 2005 - 00:50 |
bonjour
j'ai réalisé a peu de chose près le meme type de traitement (récupérer toutes les combinaisons d'opérations bancaires dont le total fait XXX. en fait je suis passé par une procédure récursive Le principe : Tu as un tableau qui contient tous les cas que tu dois tester. Tu as également le chemin (les identifiants) des cas qui sont en cours de test Dans ton cas, tu peux également rajouter le niveau de profondeur
Première chose, On parcours le tableau On vérifie que l'on a pas encore testé le cas que l'on est sur le point de tester. Ensuite on vérifie si le chemin que l'on teste est une des possibilités si oui, on l'ajoute à un tableau global qui contient les résultats si non, on copie le tableau Racine (Celui passé en paramètre) dans un tableau local On supprime de ce tableau local l'élement en cours Et on rappelle la meme procédure avec le tableau local que l'on vient de traiter et le chemin mis à jour En fait à chaque appel le tableau contiendra un élément de moins.
Un exemple de code :
PROCEDURE MaProcédure(MonTableauRacine = null, CheminEnCours = "")
tableauCopie(MonTAbleauRacine,MonTableau)
TANTQUE i < dimension(MonTableauRacine)
// Vérifie si on a pas déjà testé SI DéjàTesté(CheminEnCours + TAB + MonTableau[i]) = vrai i++ CONTINUER FIN
// Est ce que l'on a trouvé une possibilité ? Si VérifieMesConditions(MonTableau[i])
TableauAjoute(MesRésultat,CheminEnCours + TAB + MonTableau[i])
SINON // On Copie le tableau dans un autre tableau TableauCopie(MonTableau,MonTableauFils)
// Suppression de l'indice en cours de test TableauSupprime(MonTableauFils,i) // On se rappelle pour tester tous les chemins possibles avec // Le tableau de fils fournis MaProcédure(MonTableauFils, CheminEnCours + TAB + MonTableau[i]) FIN FIN
Bien sur c'est un exemple, il faudra sans doute (meme surement) l'adapter à ton cas
Voila...
En espérant t'avoir aidé
Marc |
| |
| |
| | | |
|
| | |
| |
Posté le 27 octobre 2005 - 10:11 |
Merci Marc !
c'est, je crois, une bonne piste !
je me donne le temps de la tester et je communique les résultats. |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|