Załóżmy, że jem pięć posiłków dziennie, a ponieważ jest siedem dni w tygodniu, mam przepisy na siedem każdego posiłku, łącznie na 35 przepisów. Każdy przepis ma liczbę kalorii. Każdy dzień musi zawierać jeden przepis na posiłek, a każdy przepis jest przypisany do konkretnego posiłku (np. Nie możesz zjeść naleśników na obiad). Wszystkie 35 przepisów musi znajdować się w roztworze, więc przepisu nie można powtórzyć w ciągu tygodnia.
Chcę znaleźć układ posiłków, który zapewni najbardziej równomierną liczbę kalorii dziennie - to znaczy chcę zminimalizować różnicę w całkowitej liczbie kalorii spożywanych z dnia na dzień.
To nie jest zadanie domowe - to prawda! Nie mogę wymyślić lepszego podejścia niż brutalna siła, a istnieje 7! ^ 4 kombinacji, co jest dużo.
źródło
Odpowiedzi:
Aby zastosować bardziej formalne podejście do problemu:
Masz 5 list po 7 liczb. Musisz zbudować 7 list po 5 liczb i znaleźć rozwiązanie, które ma minimalną różnicę między listą o największej sumie liczb a tą o najmniejszej.
Jeśli chcesz znaleźć optymalne rozwiązanie bez heurystyki, uważam, że nie masz innego wyboru niż wyliczyć, ale nie musisz wyliczyć ich wszystkich.
Niezależnie od tego, jakie rozwiązanie znajdziesz, kiedy zarejestrujesz je jako „najlepiej znalezione do tej pory”, zarejestruj jego wydajność w odniesieniu do swoich danych (uważam, że jest to różnica min-max). Następnie, jeśli gałąź rozwiązania jest wyraźnie poza drogą, przestań ją wyliczać. Protip: dni niezbudowane będą miały co najwyżej liczbę kalorii, która jest średnią wszystkich pozostałych posiłków. Wyobraź sobie, że masz listy
[10, 2, 2, 1, 1, 0, 0]
dla wszystkich 5 posiłków i zbudowałeś rozwiązanie 10 dla każdego posiłku na dzień 1. Wiesz, że pozostałe dni będą średnio 5 kalorii dziennie, więc różnica będzie wynosić co najmniej 45, a więc jeśli znalazłeś wcześniej rozwiązanie, powiedzmy,max - min = 10
nie musisz iść dalej. Spróbujesz bezpośrednio innego menu dla pierwszego dnia.źródło
To tylko hack, ale zbliży Cię
Tylko 3 posiłki
Zasadniczo klapki posiłki, jeśli zbliżą dwa dni do średniego C #
Lepszym rozwiązaniem byłoby zwrócenie boolen na Flopie i iterowanie aż do ukończenia.
Flop może stać się mądrzejszy. Możesz być w stanie nie flop śniadanie na flop lunch i kolację. Możliwe są permutacje kodu twardego. To bardziej przypomina sortowanie, w którym wartości flopa, a nie sortowanie.
źródło
Najpierw oblicz średnią liczbę kalorii na posiłek. Następnie oblicz średnią liczbę kolorów na dzień. Będą to wskaźniki, które można zmierzyć. Następnie posortuj posiłki.
Teraz wybierz najwyższe i najniższe posiłki z tego rodzaju. Jeśli posiłek znajduje się w tym samym przedziale czasowym, będziesz musiał przejść do następnej najniższej lub najwyższej, aż znajdziesz posiłek, którego nie ma w tym przedziale czasowym (kolacja itp.). Zrób to dla pierwszych 4 posiłków (hi / low). Na 5. posiłek wybierz posiłek, który zbliży Cię do średniej. Zaoszczędź piąty posiłek do osobnego wiadra. Opłucz i powtórz 7 razy.
To będzie twój początkowy zestaw posiłków. To będzie ładne. Jeśli chcesz uzyskać optymalną dystrybucję, możesz dokonać dalszych udoskonaleń przy piątym posiłku.
Przejrzyj wiadro 5. posiłków i spróbuj zamienić posiłki na 5. posiłki między dniami, aby zobaczyć, czy posiłki jeszcze się wyrównają. Nadal będziesz musiał stosować te same zasady (nie więcej niż jeden posiłek na raz). Można, ale nie musi, otrzymać bardziej wyrównany zestaw. Użyj wcześniej obliczonych średnich, aby sprawdzić, czy nastąpiła poprawa, czy nie. Będzie dużo mniej kombinacji, ponieważ pierwsze 4 posiłki są ustalane w oparciu o wysokie / niskie.
źródło