Supposons que je mange cinq repas par jour, et comme il y a sept jours par semaine, j'ai des recettes pour sept de chaque repas, pour 35 recettes au total. Chaque recette a un nombre de calories. Chaque jour doit contenir une recette par repas, et chaque recette est fixée à un repas particulier (par exemple, vous ne pouvez pas avoir de crêpes pour le dîner). Les 35 recettes doivent être dans la solution, donc une recette ne peut pas être répétée pendant la semaine.
Je veux trouver la disposition des repas qui donnera le plus de calories par jour - c'est-à-dire que je veux minimiser la différence de calories totales consommées au jour le jour.
Ce n'est pas un problème de devoirs - c'est en fait vrai! Je ne peux pas proposer une meilleure approche que la force brute, et il y a 7! ^ 4 combinaisons, ce qui est beaucoup.
la source
Réponses:
Pour faire une approche plus formelle de votre problème:
Vous avez 5 listes de 7 numéros chacune. Vous devez construire 7 listes de 5 numéros chacune, et trouver la solution qui a la différence minimale entre la liste qui a la plus grande somme de nombres et celle avec le plus petit.
Si vous voulez trouver la solution optimale sans heuristique, je pense que vous n'avez pas d'autre choix que d'énumérer, mais vous n'avez pas à les énumérer toutes.
Quelle que soit la solution que vous trouvez, lorsque vous l'enregistrez comme "la meilleure trouvée jusqu'à présent", enregistrez ses performances concernant votre métrique (je crois que c'est la différence min-max). Ensuite, si une branche de solution est clairement hors route, arrêtez de l'énumérer. Protip: les jours non construits auront au mieux un nombre de calories qui est la moyenne de tous les repas restants. Donc, imaginez que vous avez des listes
[10, 2, 2, 1, 1, 0, 0]
pour les 5 repas, et que vous avez construit la solution 10 à chaque repas pour le jour 1. Vous savez que les jours restants seront en moyenne de 5 calories par jour, donc la différence sera d'au moins 45 et donc si vous avez trouvé précédemment une solution de, disonsmax - min = 10
, vous n'avez pas besoin d'aller plus loin. Vous allez essayer directement un autre menu pour le jour 1.la source
C'est juste un hack mais ça vous rapproche
seulement 3 repas
Vous flopez essentiellement les repas si cela rapproche les deux jours du C # moyen
Une meilleure approche serait de retourner un volé sur Flop et d'itérer jusqu'à la fin.
Flop pourrait devenir plus intelligent. Vous pouvez être en position de ne pas floper le petit déjeuner pour floper le déjeuner et le dîner. Il peut y avoir des permutations de code en dur. Cela ressemble plus à un tri où les valeurs de flop plutôt que le tri.
la source
Calculez d'abord le nombre moyen de calories par repas. Ensuite, calculez le nombre moyen de colories par jour. Ce seront les mesures que l'on peut mesurer. Triez ensuite les repas.
Maintenant, choisissez simplement les plats les plus élevés et les plus bas du genre. Si un repas se situe dans la même plage horaire, vous devrez passer au niveau le plus bas ou le plus élevé suivant jusqu'à ce que vous trouviez un repas qui n'est pas dans cette plage horaire (dîner, etc.). Faites ceci pour les 4 premiers repas (salut / bas). Au 5e repas, choisissez un repas qui vous rapproche le plus de la moyenne. Économisez le 5e repas dans un seau séparé. Rincer et répéter 7 fois.
Ce sera votre premier ensemble de repas. Ce sera assez uniforme. Si vous voulez une distribution optimale, un raffinement supplémentaire pourrait être fait avec le 5ème repas.
Parcourez le 5e seau de repas et essayez d'échanger les 5e repas entre les jours pour voir si les repas s'équilibrent encore plus. Vous devrez toujours appliquer les mêmes règles (pas plus d'un repas par fois). On peut ou non obtenir un ensemble plus uniforme. Utilisez les moyennes calculées plus tôt pour voir s'il y a une amélioration ou non. Il y aura beaucoup moins de combinaisons puisque les 4 premiers repas sont fixes en fonction de haut / bas.
la source