Bob's Sale (réorganisation des paires avec contraintes pour minimiser la somme des produits)

15

J'ai posé cette question sur Stack Overflow il y a un moment: Problème: la vente de Bob . Quelqu'un a également suggéré de poser la question ici.

Quelqu'un a déjà posé une question liée à ce problème ici - sous- forêt de poids minimum de cardinalité donnée - mais pour autant que je comprends cela ne m'aide pas avec mon problème. La réponse la mieux notée sur StackOverflow mérite également d'être examinée.

Voici la copie textuelle de ma question StackOverflow. Il est probablement mal formulé pour ce site (diable, je me sens mal éduqué juste en le demandant ici), alors n'hésitez pas à le modifier:


Remarque: il s'agit d'une reformulation abstraite d'un problème réel concernant la commande des enregistrements dans un fichier SWF. Une solution m'aidera à améliorer une application open-source.

Bob a un magasin et veut faire une vente. Son magasin propose un certain nombre de produits et il a une certaine quantité entière d'unités de chaque produit en stock. Il a également un certain nombre d'étiquettes de prix sur étagère (autant que le nombre de produits), avec les prix déjà imprimés sur eux. Il peut placer n'importe quelle étiquette de prix sur n'importe quel produit (prix unitaire pour un article pour tout son stock de ce produit), cependant certains produits ont une restriction supplémentaire - un tel produit peut ne pas être moins cher qu'un certain autre produit.

Vous devez trouver comment organiser les étiquettes de prix, de sorte que le coût total de toutes les marchandises de Bob soit aussi bas que possible. Le coût total est la somme de l'étiquette de prix attribuée à chaque produit multipliée par la quantité de ce produit en stock.


Donné:

  • N - le nombre de produits et les étiquettes de prix
  • S i , 0≤ i <N - la quantité en stock de produit d'indice i (entier)
  • P j , 0≤ j <N - le prix sur l'étiquette de prix avec l'indice j (entier)
  • K - le nombre de paires de contraintes supplémentaires
  • A k , B k , 0≤ k <K - indices de produit pour la contrainte supplémentaire
    • Tout indice de produit peut apparaître au plus une fois en B. Ainsi, le graphique formé par cette liste d'adjacence est en fait un ensemble d'arbres dirigés.

Le programme doit trouver:

  • M i , 0≤ i <N - mappage de l'indice du produit à l'indice de l'étiquette de prix (P M i est le prix du produit i )

Pour satisfaire aux conditions:

  1. P M A k ≤ P M B k , pour 0≤ k <K
  2. Σ (S i × P M i ) pour 0≤ i <N est minimal

Notez que si ce n'est pas pour la première condition, la solution serait simplement de trier les étiquettes par prix et les produits par quantité, et de faire correspondre les deux directement.

Les valeurs typiques pour l'entrée seront N, K <10000. Dans le problème réel, il n'y a que plusieurs étiquettes de prix distinctes (1,2,3,4).


Voici un exemple des raisons pour lesquelles la plupart des solutions simples (y compris le tri topologique) ne fonctionneront pas:

Vous avez 10 articles avec les quantités 1 à 10, et 10 étiquettes de prix avec les prix 1 à $ 10. Il y a une condition: l'élément avec la quantité 10 ne doit pas être moins cher que l'élément avec la quantité 1.$$

La solution optimale est:

Price, $   1  2  3  4  5  6  7  8  9 10
Qty        9  8  7  6  1 10  5  4  3  2

avec un coût total de Si vous placez la paire de 1,10 près de l'un ou l'autre extrême, le coût total sera plus élevé.$

Vladimir Panteleev
la source
Erm, le bloc préformaté pour l'exemple en bas a été bloqué, et je ne sais pas comment le corriger (la syntaxe Markdown de StackOverflow et les balises <pre> ne semblent pas fonctionner ici).
Vladimir Panteleev
Le balisage pour le bloc préformaté n'a pas été reconnu car les signes dollar ont été traités comme délimiteur TeX (bien que je ne sache pas pourquoi le balisage TeX ruine le balisage pour le bloc préformaté). Parce qu'il ne semble pas y avoir de moyen «correct» d'échapper aux signes du dollar , je l'ai corrigé de manière ad hoc.
Tsuyoshi Ito
quelle est la question? vous voulez un algorithme (efficace) pour trouver une solution optimale? dureté? solution approximative?
Marcos Villagra
1
@Ito, merci. @Marcos - désolé, je cherche un algorithme pour résoudre ce problème, je l'espère assez rapide pour que je puisse l'implémenter dans mon projet. Il existe de nombreuses idées pour une solution approximative, donc une solution exacte serait préférable.
Vladimir Panteleev
1
Pour ce que ça vaut, je pense que la question connexe ( cstheory.stackexchange.com/q/4904/751 ) considère le cas où les prix consistent en k uns et N − k zéros.
mhum

Réponses:

6

J'ai également posté ceci sur votre question d'origine sur Stack Overflow:


Le problème est NP-complet pour le cas général. Cela peut être démontré via une réduction de 3 partitions (qui est une version NP-complete encore solide de l'emballage de bacs).

Soit w 1 , ..., w n les poids des objets de l'instance à 3 partitions, soit b la taille du bac et k = n / 3 le nombre de bacs qui peuvent être remplis. Par conséquent, il y a 3 partitions si les objets peuvent être partitionnés de telle sorte qu'il y a exactement 3 objets par bin.

Pour la réduction, nous fixons N = kb et chaque casier est représenté par b étiquettes de prix du même prix (pensez à P i augmentant chaque b e étiquette). Soit t i , 1≤ ik , le prix des étiquettes correspondant au i ème casier. Pour chaque w i, nous avons un produit S j de quantité w i + 1 (appelons cela le produit racine de w i ) et un autre w i - 1 produits de quantité 1 qui doivent être moins chers que S j (appelez-les les produits de congé).

Pour t i = (2b + 1) i , 1≤ ik , il y a 3 partitions si et seulement si Bob peut vendre pour 2b Σ 1≤ ik t i :

  • S'il existe une solution pour 3 partitions, alors tous les produits b correspondant aux objets w i , w j , w l qui sont affectés au même bac peuvent être étiquetés au même prix sans enfreindre les restrictions. Ainsi, la solution a coûté 2b Σ 1≤ ik t i (puisque la quantité totale de produits au prix t i est 2b ).
  • Considérez une solution optimale de Bob's Sale. Observez d'abord que dans n'importe quelle solution, plus de 3 produits racines partagent le même prix, pour chaque produit racine qui est "trop", il y a une étiquette de prix moins chère qui colle à moins de 3 produits racines. C'est pire que n'importe quelle solution s'il y avait exactement 3 produits racines par étiquette de prix (s'ils existent).
    Maintenant, il peut toujours y avoir une solution de vente de Bob avec 3 étiquettes racine par prix, mais leurs produits de congé ne portent pas les mêmes étiquettes de prix (les bacs s'écoulent en quelque sorte). Dites que l'étiquette de prix la plus chère étiquette un produit racine de w i qui a un produit de congé étiqueté moins cher. Cela implique que les 3 étiquettes racine w i , w j , w létiqueté avec le prix le plus cher ne correspond pas à b . Par conséquent, le coût total des produits étiquetés avec ce prix est d'au moins 2b + 1 .
    Par conséquent, une telle solution a un coût t k (2b + 1) + un autre coût d'affectation. Puisque le coût optimal pour une partition existante 3 est 2b Σ 1≤ ik t i , nous devons montrer que le cas qui vient d'être considéré est pire. C'est le cas si t k > 2b Σ 1≤ ik-1 t i (notons que c'est k-1 dans la somme maintenant). Réglage t i= (2b + 1) i , 1≤ ik , c'est le cas. Cela vaut également, sinon le prix le plus cher est le "mauvais", mais tout autre.

Donc, c'est la partie destructrice ;-) Cependant, si le nombre d'étiquettes de prix différentes est une constante, vous pouvez utiliser la programmation dynamique pour le résoudre en temps polynomial.

Gero Greiner
la source
7

Ceci est un suivi de la réponse de Gero . L'idée est de modifier sa construction pour montrer une forte dureté NP.

tje=(2b+1)jetje=jeP=2b1jektje

wje-1PP

Par conséquent, il n'est possible d'obtenir le prix réclamé que si tous les produits foliaires ont le même prix que leur produit racine, ce qui signifie qu'il existe une partition à 3.

Citant le résultat d'un article SWAT 2010, cet argument montre que même avec un codage unaire des nombres etkF(k)nO(1)nO(k)


Également transféré à la question de débordement de pile d'origine.

Riko Jacob
la source
Je ne peux pas accepter deux réponses, alors je devrai juste vous remercier pour la perspicacité :)
Vladimir Panteleev
0

Cela ressemble à une question de théorie du jeu. Dans ce cas, une solution de force brute très simple est:

Supposons que les contraintes représentent des invariants de la forme

S-> AkSBk | AkBkS | SAkBk

La solution est de continuer à ajouter d'abord les contraintes, puis les éléments. Par exemple: Disons n = 10 et il y a 2 contraintes, A1B1 et A2B2. Ensuite, il y a trois enfants au nœud racine (niveau 2). Chacun de ces 3 nœuds aura 7 enfants de niveau 3, chacun de 21 en aura 6 au niveau 4, etc. Essentiellement, vous exécutez toutes les combinaisons possibles.

                A1B1 --- Niveau 1 
               / | \
              / | \
             / | \
            / | \
    A1A2B2A1 A1B1A2B2 A2B2A1B1 --- Niveau 2

et faire pousser l'arbre. Bien qu'au départ cela ressemble à une solution horrible, je pense que vous pourriez abandonner la chasse aux feuilles très chères en utilisant des heuristiques et des élagages ...

CMR
la source