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:
- P M A k ≤ P M B k , pour 0≤ k <K
- Σ (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é.
la source
Réponses:
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≤ i ≤ k , 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≤ i ≤ k , il y a 3 partitions si et seulement si Bob peut vendre pour 2b Σ 1≤ i ≤ k t i :
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≤ i ≤ k 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≤ i ≤ k-1 t i (notons que c'est k-1 dans la somme maintenant). Réglage t i= (2b + 1) i , 1≤ i ≤ k , 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.
la source
Ceci est un suivi de la réponse de Gero . L'idée est de modifier sa construction pour montrer une forte dureté NP.
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 etk F( k ) ⋅ nO ( 1 ) nO ( k )
Également transféré à la question de débordement de pile d'origine.
la source
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
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.
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 ...
la source