Twoim zadaniem jest zbudowanie algorytmu (programu lub funkcji), który może zoptymalizować pakowanie owoców z przenośnika taśmowego do worków, które zostaną wysłane do sprzedawców, optymalizując pod kątem największej liczby worków.
Każda torebka musi ważyć co najmniej pewną ilość, ale wszelkie nadwyżki tracą zysk, ponieważ tę wagę można wykorzystać do napełnienia innej torebki. Twoja maszyna pakująca zawsze ma przed oczyma n
owoce z kolejki i może tylko dodać te n
owoce do (pojedynczej) torby, która jest przetwarzana. Nie może patrzeć poza n
pierwsze elementy w kolejce. Program zawsze wie dokładnie, ile już ma w wadze.
Innym sposobem na zwizualizowanie tego jest posiadanie przenośnika taśmowego z obszarem ładunkowym n
na końcu, z którego należy pobrać owoc, zanim pojawi się nowy owoc. Wszelkie resztki owoców i niepełną torbę na końcu są odrzucane.
Wejścia
- Lista / tablica wag owoców w kolejce (dodatnie liczby całkowite)
- Minimalna masa całkowita worków (dodatnia liczba całkowita)
- Lookahead
n
(dodatnia liczba całkowita)
Wydajność
Twój algorytm powinien zwracać dla wszystkich toreb masy owoców w nich, w dowolny sposób dogodny dla Ciebie i Twojego języka, niezależnie od tego, czy jest to wartość standardowa, czy wartość zwrotna, czy coś innego. Powinieneś być w stanie uruchomić program i obliczyć swój wynik w ciągu minuty na komputerze.
Przykład
Total weight 1000, lookahead of 3 and fruit queue:
[171,163,172,196,156,175,162,176,155,182,189,142,161,160,152,162,174,172,191,185]
One possible output (indented to show how the lookahead affects the bagging):
[171,163,172, 156,175, 176]
[162, 155,182,189, 161,160]
[152,162,174,172,191,185]
Punktacja
Twój algorytm zostanie przetestowany w sześciu seriach na partii 10000 pomarańczy, którą dla ciebie przygotowałem, na wyprzedzeniach od 2 do 7, w tym na obu końcach. Zapakujesz je w torby o wadze co najmniej 1000 sztuk. Pomarańcze są zwykle rozmieszczone ze średnią masą 170 i standardowym odchyleniem 13, jeśli to jest pomocne.
Twój wynik będzie sumą liczby worków z sześciu serii. Najwyższy wynik wygrywa. Standardowe luki są niedozwolone.
Prosta przykładowa implementacja i płyta testowa pakietu testowego w Haskell
Odpowiedzi:
Worki Python 3,
99649981Idea tego rozwiązania jest podobna do pomysłów Jonathana, JayCe i fortraan, ale z funkcją punktacji =)
To rozwiązanie łączy najlepsze podzbiory obszaru widokowego z widokiem na
score
.score
zapewnia zamówienie na podzestawy przy użyciu następującego schematu:expected_mean
próbuje przewidzieć, jak powinny wyglądać pozostałe wartości (zakładając, że ich wybór jest optymalny).UPD :
Oto kolejna obserwacja: możesz włożyć dowolne pomarańcze z najlepszego podzbioru do torby bez szkody dla wydajności algorytmu. Przesunięcie dowolnej części nadal pozwala przenieść resztę później, a reszta powinna nadal być najlepszą opcją (bez nowych pomarańczy), jeśli punktacja jest prawidłowa. Ponadto w ten sposób istnieje szansa na dynamiczne ulepszenie zestawu kandydatów do włożenia do torby, widząc więcej pomarańczy przed napełnieniem torby. I chcesz wiedzieć jak najwięcej informacji, więc nie ma sensu przenosić do torby więcej niż jednej pomarańczy w danym momencie.
Spróbuj!
źródło
powerset
funkcji jest w tym przypadku zbędny, ponieważ i tak jest równylen(list_)
?)expected_mean(w)
które daje równie dobre wyniki:return (w+2) / max(1, round((w+2) / mean))
Worki Python 3 , 9796
Opierając się na odpowiedzi Jonathana:
Zależy to od zestawu zasilającego z książki kucharskiej itertool. Najpierw znajduje optymalny podzbiór bufora na podstawie minimalizacji różnicy od wagi docelowej dla wszystkich podzbiorów, a następnie wybiera element z tego podzbioru na podstawie tego samego kryterium. Jeśli żaden optymalny podzbiór nie wybierze z całego bufora.
źródło
C ++ 17, 9961,58 (średnia dla niektórych losowych nasion)
(przewiń w dół, aby uzyskać wyjaśnienie, jeśli nie znasz C ++)
(jeśli
<
jest używany w zasadzie, algorytm próbuje zminimalizować liczbę worków)Zainspirowany tą odpowiedzią .
Łącze TIO na 250 powtórzeń: Wypróbuj online!
Definiuje funkcję (właściwie wygląda jak funkcja, jest to struktura),
pick_orange
która, biorąc podvector<int> weights
uwagę wagę pomarańczy iint remain
pozostałą wagę torby, zwraca indeks pomarańczy, którą należy wybrać.Algorytm:
powtarzanie
500
razy{
generuje losowe (fałszywe) pomarańcze (rozkład normalny ze średnią 170 i stddev 13), aż pojawią się
N_NEW_ORANGES=7
pomarańczewybierają dowolny podzbiór, którego suma jest najmniejsza i nie mniejsza niż
remain
(funkcja tobacktrack
robi)oznacza wszystkie pomarańcze w tym podzbiorze jako dobre
}
uśrednij, ile razy pomarańcze oznaczone jako dobre (prawdziwe) pomarańcze o równej wadze
zwracają najlepszą pomarańczę
W programie są 3 stałe zakodowane, których nie można wywnioskować z problemu:
N_NEW_ORANGES
(długość prognozy). Zwiększenie tego powoduje, że program działa wykładniczo dłużej (ponieważ cofanie się)źródło
invalid use of template-name ‘std::normal_distribution’
. Brak problemów z gcc 7.1.0.Worki Python 2 , 9756
Rozwijajmy pomarańczę ...
Wypróbuj online!
Zawsze zbiera owoce z bufora, co minimalizuje bezwzględną różnicę nowej masy i masy docelowej.
źródło
Worki Python 3, 9806
Opierając się na odpowiedziach Jonathana i JayCe:
Wypróbuj online!
Jak to działa
Powiedz, że w torbie znajduje się 900 jednostek i dostępne są 2 owoce: 99 jednostek owoców i 101 jednostek owoców. Jeśli owoc 99 jednostek znajduje się bliżej początku listy oczekujących,
min
wybierze go zamiast 101. Jeśli tak się stanie, będziemy potrzebować kolejnego owocu, aby wypełnić pozostałą potrzebną 1 jednostkę. W tych przypadkach zmieniłem program, aby faworyzować owoce o wyższej wartości.Robi to, sortując, a następnie odwracając listę oczekujących przed ustawieniem zasilania.
źródło
PHP, 9975 worków
najdłuższy ze wszystkich zgłoszeń, ale powinien być czytelny
Spróbuj
źródło
Python 3,
98559928994799569964 WorkiOparty na kodzie startowym Jonathana Allana, ale nieprzygotowany do bycia czytelnym.
Pomysł: Ponieważ 1000/170 = 5,88, staramy się wybierać owoce zbliżone do 1000/6 (bawiłem się magicznymi stałymi). Jeśli jednak ostatni owoc w torbie może zminimalizować straty, używamy tego zamiast tego.
To rozwiązanie ma docelowe wartości sumy dla każdego dodanego owocu. Prawdopodobnie się tu zatrzymam. Użyłem Nelder-Mead, aby znaleźć moją
targets
tablicę:9956 worków
Program worków 9947 jest szczególnie prosty:
źródło
targets
? Trenujesz na losowych danych?Rubin , 9967 worków
Wypróbuj online!
Jeśli masz wystarczająco dużo masy, aby wypełnić torbę, znajdź najlżejszy podzbiór, który może wypełnić torbę, i użyj najlżejszej pomarańczy z tego podzbioru. W przeciwnym razie uzyskaj pozostałą wagę możliwie najbliżej wielokrotności 170.
źródło
Rakieta / Schemat, 9880 worków
Aby zdecydować, który kawałek owocu dodać do torby, porównaj optymalną wagę torby z wagą torby z dodatkowym kawałkiem owoców. Jeśli jest to optymalna waga, użyj jej. Jeśli ma nadwagę, zminimalizuj nadwyżkę. Jeśli ma niedowagę, zminimalizuj nadwyżkę po próbie pozostawienia optymalnej luki.
źródło
Haskell , 9777 worków
To była moja pierwsza próba:
Wypróbuj online!
źródło
Haskell , 9981 worków
The Angs → Jonathan Allan → JayCe → fortraan → Alex → Roman Czyborra python Cegła golfowa mogłaby jeździć z powrotem do Haskell, aby uzyskać pewną matematyczną czystość wzdłuż tego samego głównego nurtu myślenia
(<miss)==False<True
)w tym całkowitą odwrotnej
(m-n)/sqrt(n)==(n+1-m)/sqrt(n+1) <==> n=sqrt(m^2-1/4)-1/2
od A https://en.wikipedia.org/wiki/Sum_of_normally_distributed_random_variablesprzyprawiony niepotrzebnymi bezsensownościami
Wypróbuj online!
bez uzyskiwania innego wzrostu liczbowego na zebranych 9981 sieci pomarańczy, podczas gdy mój pakujący torby 10k011 chwytający niezdrowe pomarańcze z powrotem z niezamkniętych worków został zdyskwalifikowany przez user69850 w osobie user202729 → Jo King → ovs, dlatego zasłużona nagroda trafiła do Alexa
źródło