PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Organisation d'une boucle ... je cale !
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.