2011-10-07 8 views
-2

Donc, j'ai 12 listes et chacune d'elles contient 28 éléments avec une valeur. J'essaye de maximiser la valeur de la première liste en commutant des articles avec les 11 autres listes.Algorithme pour trouver la meilleure combinaison

Je peux aussi échanger différentes quantités d'articles. Par exemple, je peux échanger 6 articles des articles 1 et 3 de la liste 2. Ou, je peux échanger 19 articles des articles 1 et 22 de la liste 2. Il y a d'autres articles dans une grande piscine qui ne font pas partie d'une liste Ainsi, si une liste reçoit plus de 28 éléments, les valeurs les plus basses peuvent facilement être supprimées, et si une liste contient moins de 28 éléments, de nouveaux éléments peuvent facilement être ajoutés.

Cependant, une restriction est que je ne peux échanger avec une liste à la fois. Par exemple, je ne peux pas échanger 3 articles de la liste 1 vers la liste 2, échanger 3 articles de la liste 2 vers la liste 3 et échanger 3 articles de la liste 3 vers la liste 1. Lorsque je négocie de la liste 1, je peux seulement commerce avec une seule autre liste à la fois.

Je peux évidemment forcer la force, mais j'ai l'impression que cela prendrait une éternité. Je ne suis pas très bon avec les combinaisons, donc je ne suis pas sûr du nombre de combinaisons possibles si je voulais une force brute. Donc, mes questions sont: est-ce que la force brute est une solution réalisable ici, et si non, quel est l'exemple d'un algorithme qui pourrait m'aider?

Merci, Krzys.

EDIT:

Exemple:

List 1 
[Apple - 12] 
[Banana - 5] 
[Orange - 8] 

List 2 
[Steak - 15] 
[Chicken - 2] 
[Fish - 7] 

List 3 
[Zebra - 20] 
[Horse - 6] 
[Elephant - 10] 

Je vais commencer par la liste 1. Voici ce que le programme ferait:

if (List1.Apple - List2.Steak < BestTradeAvailable) Then BestTradeAvailable = List1.Apple - List2.Steak 
if (list1.Apple - List2.Chicken < BestTradeAvailable) Then BestTradeAvailable = list1.Apple - List2.Chicken 
if (list1.Apple - list2.Fish < BestTradeAvailable) Then BestTradeAvailable = list1.Apple - list2.Fish 
if (list1.Banana - List2.Steak < BestTradeAvailable) Then BestTradeAvailable = list1.Banana - List2.Steak 
if (list1.Banana - List2.Chicken < BestTradeAvailable) Then BestTradeAvailable = list1.Banana - List2.Chicken 
if (list1.Banana - List2.Fish < BestTradeAvailable) Then BestTradeAvailable = list1.Banana - List2.Fish 

etc Je veux aussi faire plusieurs éléments à la fois ainsi:

if (list1.Apple + list1.Banana - List2.Steak + List2.Chicken < BestTradeAvailable) Then BestTradeAvailable = list1.Apple + list1.Banana - List2.Steak + List2.Chicken 

Mais comme je l'ai dit, vous pouvez échanger un élément de la liste 1 et 2 articles de la liste 2:

if (list1.Apple - List2.Steak + List2.Chicken < BestTradeAvailable) Then BestTradeAvailable = List1.Apple - List2.Steak + List2.Chicken 

Donc, fondamentalement, je veux juste essayer trouver le meilleur compromis disponible.

Dans cet exemple, le meilleur trade serait le trading de Apple + Orange à List3 pour Zebra et Elephant, car ce trade augmente la valeur totale de List1 du montant le plus élevé.

+2

Cette question est impossible à comprendre. Travailler un petit exemple pour nous avec, par exemple, quatre listes contenant chacun quatre éléments, démontrant quelle quantité vous tentez de maximiser. –

+0

@EricLippert Je vais travailler sur un exemple. –

+0

Donc, dans votre exemple, quel est le meilleur commerce?Quel résultat attendriez-vous du programme dans ce cas, et pourquoi? –

Répondre

0

Essentiellement, vous devez trier les listes et prendre le top 28?

Les files d'attente prioritaires fonctionneraient.

0

Une solution de force brute ne prendrait que la complexité temporelle O (n^2 * (m-1)) où n est le nombre d'éléments dans la liste et m est le nombre de listes. Si vous voulez chercher toutes les combinaisons, ce serait O (n^2 * (n-1) * (m-1)) complexité du temps qui ne serait que de 232848 combinaisons que vous devez essayer. Ou toutes les combinaisons sont n! si la commande est importante, aussi.

+0

Etes-vous sûr? De ce que j'ai conclu par moi-même, en utilisant nCr, si je sélectionnais 10 joueurs parmi mes 28 que je considérais pour le trading avec d'autres équipes, le nombre de combinaisons que je peux faire avec 10 joueurs sur 28 est 28C10, est 13123110 ... –

+0

Vous avez dit que vous voulez maximiser le compromis de sorte que vous n'avez pas besoin d'ajouter l'ordre des articles aux combinaisons. 28^10 est vrai quand l'ordre est important aussi. – Bytemain

+0

Accrochez-vous, je pensais que nCr est purement pour les combinaisons, alors que nPr est l'ordre des articles? Si ce n'est pas le cas, et que votre réponse est correcte, alors je vais certainement finir par forcer la brute. –

Questions connexes