par
macgawel » 08 févr. 2010, 14:22
Lors de la réservation d’un hôtel, selon le nombre de participants, le moteur de réservation doit proposer à l’internaute toutes les répartitions possibles.
Dans ce cas, c'est
relativement simple, vu qu'il faut sortir la liste exhaustive des possibilités.
Par contre on peut vite arriver à un nombre de solutions (et donc à un temps de calcul) important...
Exemple :
$Achambres = Tableau des chambres, capacité=>nombre
$Achambres = (1 => 2, 2 => 4; 3 => 4, 4 => 3)
$demande = nombre de places demandées.
$demande = 21
Comment je ferais :
1. Calculer le nombre maximal de chambres de la plus grande capacité que je peux utiliser.
$tmp = $demande DIV 4 = 5 //21 / 4 = 5 reste 1;
2. Prendre le minimum entre cette valeur et le nombre de chambres
$max_chambres[4] = min( $tmp, $Achambres(4)) // 3;
3. En prenant de $max_chambres[4] à 0 chambres de 4, je refais ce calcul pour $Achambres = (1 => 7, 2 => 4; 3 => 3) et $demande = $demande - ($nb_chambres_prises*capacité).
En gros, avec l'exemple :
Code : Tout sélectionner
Pour 21 personnes, je peux avoir maximum 3 chambres de 4 (vu que nombre de chambres en stock = 3 < 21 / 4 = 5)
Je prends 3 chambres de 4, il me reste 9 personnes à caser.
Pour 9 personnes, je peux avoir maximum 3 chambres de 3 (vu que nombre de chambres en stock = 4 > 9 / 3 = 3)
Je prends 3 chambres de 3, il me reste 0 personne => Fin, Solution
Je prends 2 chambres de 3, il me reste 3 personnes.
Pour 3 personnes, je peux avoir maximum 1 chambre de 2 (vu que nombre de chambres en stock = 4 > 3 / 2 = 1)
Je prends 1 chambre de 2, il me reste 1 personnes.
Pour 1 personne, je peux avoir maximum 1 chambre de 1
Je prends une chambre de 1, il me reste 0 personne => Fin, Solution
Je prends 0 chambre de 2, il me reste 3 personnes.
Pour 3 personnes, je peux avoir maximum 2 chambres de 1 (vu qu'il n'en reste que 2)
Je prends 2 chambres de 1, il me reste 1 personne => Fin, Pas de solution
Je prends 1 chambre de 1, il me reste 2 personnes => Fin, Pas de solution
Je prends 0 chambre de 1, il me reste 3 personnes => Fin, Pas de solution
Je prends 1 chambre de 3
...
Je prends 0 chambre de 3
...
Je prends 2 chambres de 4
...
Avec un algorithme récursif, ça devrait tourner.
[quote="aquaa"]Lors de la réservation d’un hôtel, selon le nombre de participants, le moteur de réservation doit proposer à l’internaute toutes les répartitions possibles.[/quote]Dans ce cas, c'est [i]relativement[/i] simple, vu qu'il faut sortir la liste exhaustive des possibilités.
Par contre on peut vite arriver à un nombre de solutions (et donc à un temps de calcul) important...
Exemple :
$Achambres = Tableau des chambres, capacité=>nombre
$Achambres = (1 => 2, 2 => 4; 3 => 4, 4 => 3)
$demande = nombre de places demandées.
$demande = 21
Comment je ferais :
1. Calculer le nombre maximal de chambres de la plus grande capacité que je peux utiliser.
$tmp = $demande DIV 4 = 5 //21 / 4 = 5 reste 1;
2. Prendre le minimum entre cette valeur et le nombre de chambres
$max_chambres[4] = min( $tmp, $Achambres(4)) // 3;
3. En prenant de $max_chambres[4] à 0 chambres de 4, je refais ce calcul pour $Achambres = (1 => 7, 2 => 4; 3 => 3) et $demande = $demande - ($nb_chambres_prises*capacité).
En gros, avec l'exemple :
[code]Pour 21 personnes, je peux avoir maximum 3 chambres de 4 (vu que nombre de chambres en stock = 3 < 21 / 4 = 5)
Je prends 3 chambres de 4, il me reste 9 personnes à caser.
Pour 9 personnes, je peux avoir maximum 3 chambres de 3 (vu que nombre de chambres en stock = 4 > 9 / 3 = 3)
Je prends 3 chambres de 3, il me reste 0 personne => Fin, Solution
Je prends 2 chambres de 3, il me reste 3 personnes.
Pour 3 personnes, je peux avoir maximum 1 chambre de 2 (vu que nombre de chambres en stock = 4 > 3 / 2 = 1)
Je prends 1 chambre de 2, il me reste 1 personnes.
Pour 1 personne, je peux avoir maximum 1 chambre de 1
Je prends une chambre de 1, il me reste 0 personne => Fin, Solution
Je prends 0 chambre de 2, il me reste 3 personnes.
Pour 3 personnes, je peux avoir maximum 2 chambres de 1 (vu qu'il n'en reste que 2)
Je prends 2 chambres de 1, il me reste 1 personne => Fin, Pas de solution
Je prends 1 chambre de 1, il me reste 2 personnes => Fin, Pas de solution
Je prends 0 chambre de 1, il me reste 3 personnes => Fin, Pas de solution
Je prends 1 chambre de 3
...
Je prends 0 chambre de 3
...
Je prends 2 chambres de 4
...
[/code]
Avec un algorithme récursif, ça devrait tourner.