Предположим, я ем пять раз в день, а поскольку в неделю семь дней, у меня есть рецепты по семь на каждый прием пищи, всего 35 рецептов. Каждый рецепт имеет количество калорий. Каждый день должен содержать один рецепт на каждый прием пищи, и каждый рецепт привязан к определенному приему пищи (например, на ужин не должно быть блинов). Все 35 рецептов должны быть в растворе, поэтому рецепт не может повторяться в течение недели.
Я хочу найти схему питания, которая обеспечит максимально равномерное количество калорий в день, то есть я хочу минимизировать разницу в общем количестве потребляемых калорий изо дня в день.
Это не домашнее задание - это правда! Я не могу придумать лучший подход, чем грубая сила, и есть 7! ^ 4 комбинаций, что много.
algorithms
combinatorics
dfaulken
источник
источник
Ответы:
Чтобы сделать более формальный подход к вашей проблеме:
У вас есть 5 списков по 7 номеров в каждом. Вам нужно построить 7 списков по 5 номеров в каждом и найти решение, которое имеет минимальную разницу между списком, имеющим наибольшую сумму чисел, и списком с наименьшим.
Если вы хотите найти оптимальное решение без эвристики, я считаю, что у вас нет другого выбора, кроме как перечислять, но вам не нужно перечислять все из них.
Какое бы решение вы ни нашли, когда вы зарегистрируете его как «лучшее из найденных», зарегистрируйте его эффективность в отношении вашей метрики (я полагаю, это минимально-максимальная разница). Затем, если ветвь решения явно находится в стороне от этого, прекратите перечислять его. Подсказка: в неурожайные дни в лучшем случае будет учитываться количество калорий, которое является средним для всех оставшихся блюд. Итак, представьте, что у вас есть списки, предназначенные
[10, 2, 2, 1, 1, 0, 0]
для всех 5 приемов пищи, и вы создали решение 10 при каждом приеме пищи в первый день. Вы знаете, что оставшиеся дни будут составлять в среднем 5 калорий в день, поэтому разница будет составлять не менее 45, и если ранее вы нашли решение, скажемmax - min = 10
, вам не нужно идти дальше. Вы непосредственно попробуете другое меню для первого дня.источник
Это всего лишь взлом, но это поможет вам закрыть
только 3 приема пищи.
Вы в основном отказываетесь от еды, если это приближает два дня к среднему значению C #
Лучшим подходом было бы вернуть boolen на флопе и повторять до завершения.
Флоп может стать умнее. Вы можете быть в состоянии не проваливать завтрак, чтобы проваливать обед и ужин. Там может быть жесткий перестановки кода. Это больше похоже на сортировку, где значения флопа, а не сортировки.
источник
Сначала вычислите среднее количество калорий за прием пищи. Затем вычислите среднее количество цветов в день. Это будут показатели, которые можно измерить. Далее сортируй блюда.
Теперь просто выберите самую высокую и самую низкую еду из этого вида. Если еда находится в одном и том же временном интервале, вам придется переходить к следующему наименьшему или максимальному значению, пока вы не найдете блюдо, которого нет в этом временном интервале (ужин и т. Д.). Сделайте это для первых 4-х блюд (привет / низ). На 5-й еде выберите еду, которая приближает вас к среднему. Сэкономьте 5 еду в отдельном ведре. Промыть и повторить 7 раз.
Это будет ваш начальный набор блюд. Это будет довольно даже. Если вы хотите оптимальное распределение, то с 5-ым приемом пищи можно провести дополнительную обработку.
Пройдите через ведро с 5-ым приемом пищи и попробуйте поменять местами 5-й прием пищи между днями, чтобы увидеть, выровняется ли прием пищи еще дальше. Вам все равно придется применять те же правила (не более одного приема пищи за раз). Можно или не может получить более равномерный набор. Используйте вычисленные средние значения ранее, чтобы увидеть, есть ли улучшение или нет. Комбинаций будет намного меньше, поскольку первые 4 приема пищи фиксируются на основе высоких / низких значений.
источник