caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* Re: Problème_de_l'achat_par_lots
@ 2005-07-31 11:46 Diego Olivier Fernandez Pons
  2005-07-31 13:45 ` [Caml-list] Problème_de_l'achat_par_lots Damien Guichard
  0 siblings, 1 reply; 4+ messages in thread
From: Diego Olivier Fernandez Pons @ 2005-07-31 11:46 UTC (permalink / raw)
  To: caml-list; +Cc: damien.guichard

    Bonjour,

Damien a écrit :

> Soit un inventaire recherché par un achateur, et soit une liste de
> lots-inventaires en vente. L'acheteur veut maximiser son
> investissement, c'est-à-dire avoir le moins de pièces manquantes
> possible et le moins de pièces supperflues possible. Comment trouver
> la (les) combinaison(s) de lots la (les) plus avantageuse(s) ?

Désolé de ne répondre que maintenant, j'ai n'ai pas vu le message
initial passer, ce n'est qu'en fouillant dans les archives que je suis
tombé dessus.

> Je ne vois pas bien comment il faut aborder le problème:
> * est-ce un "backpack problem" ?
> * est-ce un "union-find problem" ?
> * est-ce un "genetic-oriented problem" ?
> * sinon qu'est-ce que c'est ?


Il y a deux problèmes dans votre question :

i) le permier est un problème d'optimisation (quel est le problème a
résoudre ? avec quel type de méthode ?)

ii) le second est un problème d'implantation (comment implémenter en
Caml la méthode choisie en i)


i. Le problème d'optimisation

Votre problème est en gros un problème de "covering". Dans un problème
de covering on cherche à minimiser le coût total d'achat sachant qu'on
veut satisfaire (couvrir) la demande.

Dans votre problème on ne cherche pas à satisfaire toute la demande,
mais une sorte de distance (somme de excédents et des déficits) et on
divise par le coût.

plusieurs méthodes :
- programmation linéaire en nombres entiers (PLNE)
- énumération implicite, programmation par contraintes (PPC)

Si vous n'êtes pas familier avec la PLNE, il vaut mieux ne pas choisir
cette méthode, surtout si vous voulez implémenter ensuite en Caml
(c'est compliqué et ça utilise plein de flottants).

ii. Implémentation en Caml d'une méthode d'énumération implicite

Il énumérer intelligement toutes les combinaisons possibles. Pour
cela, il faut un mécanisme de réversibilité qui s'obtient facilement
en Caml par
- des appels de fonctions récursives
- des structures de données persistantes (librairie standard)
- des exceptions

J'avais donné un exemple pour le subset sum (trouver un sous-ensemble
d'éléments ayant une somme fixe S) dans comp.lang.functional
(Backtracking in Haskell), code à la fin du message.

la procédure de base est simple :
- on prend le premier lot
- on essaye en l'ajoutant au panier (appel récursif fonction)
- on essaye en l'interdisant dans le panier (appel récursif fonction)

Dans chaque sous-cas on fait des calculs pour éliminer le plus de lots
dont l'ajout au panier ne sert à rien (par exemple touts les demandes
ont été satifaites) ou ajouter ceux qui sont nécessaires.

Quand on aboutit à une impasse, on lève une exception.

Le code risque d'être un peu plus complexe que pour le subset-sum mais
les principes sont les mêmes.


(* Code pour le subsetsum problem *)

exception Fail

let rec subsetsum = fun remaining candidates ->
  match remaining with
   | 0 -> []
   | _ ->
      match candidates with
        | v :: tail when v <= remaining ->
           (try
                v :: subsetsum (remaining - v) tail
            with Fail ->
                subsetsum remaining tail
           )
        | _ -> raise Fail

# subsetsum 40 [3;8;9;13;12;15;17;19];;
- : int list = [3; 8; 14; 15]

        Diego Olivier




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Caml-list] Problème_de_l'achat_par_lots
  2005-07-31 11:46 Problème_de_l'achat_par_lots Diego Olivier Fernandez Pons
@ 2005-07-31 13:45 ` Damien Guichard
  2005-07-31 15:21   ` Diego Olivier Fernandez Pons
  0 siblings, 1 reply; 4+ messages in thread
From: Damien Guichard @ 2005-07-31 13:45 UTC (permalink / raw)
  To: caml-list; +Cc: damien.guichard


merci pour votre assistance.
cepandant j'ai choisi la méthode du "backpack problem" (problème du
sac-à-dos), bien plus facile à implémenter, et j'en ai fait un exercice
visible sur http://www.ocaml-tutorial.org.

voir ici l'énoncé de l'exercice et la solution à l'aide de la méthode du
sac-à-dos:

http://www.ocaml-tutorial.org/implement_an_inventory_facility

considérations,

- damien

----- Original Message -----
From: "Diego Olivier Fernandez Pons" <Diego.FERNANDEZ_PONS@etu.upmc.fr>
To: <caml-list@inria.fr>
Cc: <damien.guichard@wanadoo.fr>
Sent: Sunday, July 31, 2005 1:46 PM
Subject: [Caml-list] Re: Problème_de_l'achat_par_lots


    Bonjour,

Damien a écrit :

> Soit un inventaire recherché par un achateur, et soit une liste de
> lots-inventaires en vente. L'acheteur veut maximiser son
> investissement, c'est-à-dire avoir le moins de pièces manquantes
> possible et le moins de pièces supperflues possible. Comment trouver
> la (les) combinaison(s) de lots la (les) plus avantageuse(s) ?

Désolé de ne répondre que maintenant, j'ai n'ai pas vu le message
initial passer, ce n'est qu'en fouillant dans les archives que je suis
tombé dessus.

> Je ne vois pas bien comment il faut aborder le problème:
> * est-ce un "backpack problem" ?
> * est-ce un "union-find problem" ?
> * est-ce un "genetic-oriented problem" ?
> * sinon qu'est-ce que c'est ?


Il y a deux problèmes dans votre question :

i) le permier est un problème d'optimisation (quel est le problème a
résoudre ? avec quel type de méthode ?)

ii) le second est un problème d'implantation (comment implémenter en
Caml la méthode choisie en i)


i. Le problème d'optimisation

Votre problème est en gros un problème de "covering". Dans un problème
de covering on cherche à minimiser le coût total d'achat sachant qu'on
veut satisfaire (couvrir) la demande.

Dans votre problème on ne cherche pas à satisfaire toute la demande,
mais une sorte de distance (somme de excédents et des déficits) et on
divise par le coût.

plusieurs méthodes :
- programmation linéaire en nombres entiers (PLNE)
- énumération implicite, programmation par contraintes (PPC)

Si vous n'êtes pas familier avec la PLNE, il vaut mieux ne pas choisir
cette méthode, surtout si vous voulez implémenter ensuite en Caml
(c'est compliqué et ça utilise plein de flottants).

ii. Implémentation en Caml d'une méthode d'énumération implicite

Il énumérer intelligement toutes les combinaisons possibles. Pour
cela, il faut un mécanisme de réversibilité qui s'obtient facilement
en Caml par
- des appels de fonctions récursives
- des structures de données persistantes (librairie standard)
- des exceptions

J'avais donné un exemple pour le subset sum (trouver un sous-ensemble
d'éléments ayant une somme fixe S) dans comp.lang.functional
(Backtracking in Haskell), code à la fin du message.

la procédure de base est simple :
- on prend le premier lot
- on essaye en l'ajoutant au panier (appel récursif fonction)
- on essaye en l'interdisant dans le panier (appel récursif fonction)

Dans chaque sous-cas on fait des calculs pour éliminer le plus de lots
dont l'ajout au panier ne sert à rien (par exemple touts les demandes
ont été satifaites) ou ajouter ceux qui sont nécessaires.

Quand on aboutit à une impasse, on lève une exception.

Le code risque d'être un peu plus complexe que pour le subset-sum mais
les principes sont les mêmes.


(* Code pour le subsetsum problem *)

exception Fail

let rec subsetsum = fun remaining candidates ->
  match remaining with
   | 0 -> []
   | _ ->
      match candidates with
        | v :: tail when v <= remaining ->
           (try
                v :: subsetsum (remaining - v) tail
            with Fail ->
                subsetsum remaining tail
           )
        | _ -> raise Fail

# subsetsum 40 [3;8;9;13;12;15;17;19];;
- : int list = [3; 8; 14; 15]

        Diego Olivier



_______________________________________________
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Caml-list] Problème_de_l'achat_par_lots
  2005-07-31 13:45 ` [Caml-list] Problème_de_l'achat_par_lots Damien Guichard
@ 2005-07-31 15:21   ` Diego Olivier Fernandez Pons
  2005-07-31 17:26     ` alphablock
  0 siblings, 1 reply; 4+ messages in thread
From: Diego Olivier Fernandez Pons @ 2005-07-31 15:21 UTC (permalink / raw)
  To: caml-list; +Cc: damien.guichard

    Bonjour,

> Cepandant j'ai choisi la méthode du "backpack problem" (problème du
> sac-à-dos), bien plus facile à implémenter, et j'en ai fait un
> exercice visible sur http://www.ocaml-tutorial.org.

Traditionnellement, on dit plutôt knapsack (problème du sac à dos),
c'est la terminologie adoptée par les ouvrages de référence :
- Knapsack problems. Martello et Toth 1990
- Knapsack problems. Kellerer, Pferschy et Pisinger 2003

Les problèmes de packing et de covering sont symétriques : dans le
premier cas on maximise le coût sans dépasser la borne (sac à dos),
dans l'autre on minimise le coût sans passer en dessous de la borne
(set-cover).

Votre problème est proche des deux classes sans s'y mouler vraiment.

Cela dit, pour résoudre le problème de sac à dos il y a (encore et
toujours) 3 méthodes :
- programmation linéaire en nombres entiers
- énumération implicite
- programmation dynamique

Je n'avais pas cité la dernière dans mon courrier précèdent car je ne
sais pas si elle est appliquable à votre problème spécifique.

Notez également que subset-sum problem pour lequel j'ai fourni du code
Caml est un cas particulier de knapsack.

> voir ici l'énoncé de l'exercice et la solution à l'aide de la
> méthode du sac-à-dos:
>
> http://www.ocaml-tutorial.org/implement_an_inventory_facility
>

Je n'ai pas trouvé de code Caml.

La page que vous pointez dans l'exercice est très intéressante :
l'auteur dit qu'utiliser une méthode d'énumération implicite est trop
lourd pour le problème de sac à dos, il propose donc une méthode ...
d'énumération implicite.


        Diego Olivier


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Caml-list] Problème_de_l'achat_par_lots
  2005-07-31 15:21   ` Diego Olivier Fernandez Pons
@ 2005-07-31 17:26     ` alphablock
  0 siblings, 0 replies; 4+ messages in thread
From: alphablock @ 2005-07-31 17:26 UTC (permalink / raw)
  To: Diego Olivier Fernandez Pons, caml-list

Bonsoir,

Vous n'avez pas trouvé le code Caml ?
C'est la fonction "place_order", en bas de page, sur un fond-cadre
légèrement grisé.

En fait j'ai programmé cette fonction "à l'intuition" et je suis bien
incapable de dire à quelle catégorie de solution elle appartient
(l'autodidacte a toujours ses lacunes). Ce que je peux affirmer c'est que je
l'ai testée sur des exemples non triviaux dans le domaine qui m'intéresse
(décomposition d'une maquette lego en un inventaire de boîtes de legos à
acheter) et qu'elle fonctionne à merveille. Reste à savoir comment elle va
se comporter en performance quand le catalogue va grossir jusqu'à  plus de
6500 boîtes legos connues. Si vous en avez une idée, ne vous privez pas de
la partager.

Ma page d'exercice
http://www.ocaml-tutorial.org/implement_an_inventory_facility
est sur un Wiki, donc éditable, si vous trouvez un meilleur lien pour le
problème du sac à dos, vous pouvez cliquer sur [edit].

Considérations,

- damien


----- Original Message -----
From: "Diego Olivier Fernandez Pons" <Diego.FERNANDEZ_PONS@etu.upmc.fr>
To: <caml-list@inria.fr>
Cc: <damien.guichard@wanadoo.fr>
Sent: Sunday, July 31, 2005 5:21 PM
Subject: Re: [Caml-list] Problème_de_l'achat_par_lots


    Bonjour,

> Cepandant j'ai choisi la méthode du "backpack problem" (problème du
> sac-à-dos), bien plus facile à implémenter, et j'en ai fait un
> exercice visible sur http://www.ocaml-tutorial.org.

Traditionnellement, on dit plutôt knapsack (problème du sac à dos),
c'est la terminologie adoptée par les ouvrages de référence :
- Knapsack problems. Martello et Toth 1990
- Knapsack problems. Kellerer, Pferschy et Pisinger 2003

Les problèmes de packing et de covering sont symétriques : dans le
premier cas on maximise le coût sans dépasser la borne (sac à dos),
dans l'autre on minimise le coût sans passer en dessous de la borne
(set-cover).

Votre problème est proche des deux classes sans s'y mouler vraiment.

Cela dit, pour résoudre le problème de sac à dos il y a (encore et
toujours) 3 méthodes :
- programmation linéaire en nombres entiers
- énumération implicite
- programmation dynamique

Je n'avais pas cité la dernière dans mon courrier précèdent car je ne
sais pas si elle est appliquable à votre problème spécifique.

Notez également que subset-sum problem pour lequel j'ai fourni du code
Caml est un cas particulier de knapsack.

> voir ici l'énoncé de l'exercice et la solution à l'aide de la
> méthode du sac-à-dos:
>
> http://www.ocaml-tutorial.org/implement_an_inventory_facility
>

Je n'ai pas trouvé de code Caml.

La page que vous pointez dans l'exercice est très intéressante :
l'auteur dit qu'utiliser une méthode d'énumération implicite est trop
lourd pour le problème de sac à dos, il propose donc une méthode ...
d'énumération implicite.


        Diego Olivier

_______________________________________________
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs




^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2005-07-31 17:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-07-31 11:46 Problème_de_l'achat_par_lots Diego Olivier Fernandez Pons
2005-07-31 13:45 ` [Caml-list] Problème_de_l'achat_par_lots Damien Guichard
2005-07-31 15:21   ` Diego Olivier Fernandez Pons
2005-07-31 17:26     ` alphablock

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).