Ваша миссия состоит в том, чтобы создать алгоритм (программу или функцию), который может оптимизировать упаковку фруктов с конвейерной ленты в пакеты для отправки розничным продавцам, оптимизируя для наибольшего количества пакетов.
Каждая сумка должна весить, по крайней мере, определенное количество, но любое превышение теряется, поскольку этот вес можно использовать для заполнения другой сумки. Ваша машина для расфасовки всегда имеет n
в очереди фрукты из очереди и может только добавить любые из этих n
фруктов в (одну) сумку, которая обрабатывается. Он не может смотреть дальше n
первых элементов в очереди. Программа всегда точно знает, какой вес в сумке уже есть.
Другой способ визуализировать это состоит в том, чтобы иметь конвейерную ленту с загрузочной областью размера n
в конце, откуда фрукты должны быть взяты прежде, чем новый фрукт прибудет. Любые оставшиеся фрукты и неполная сумка в конце отбрасываются.
входные
- Список / массив весов фруктов в очереди (положительные целые числа)
- Минимальный общий вес для сумок (положительное целое число)
- Lookahead
n
(положительное целое число)
Выход
Ваш алгоритм должен возвращать для всех пакетов вес фруктов в них любым удобным для вас и вашего языка способом, будь то стандартное значение, возвращаемое значение или что-то еще. Вы должны быть в состоянии запустить программу и рассчитать свой счет за одну минуту на вашем компьютере.
пример
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]
счет
Ваш алгоритм будет проверен на шести запусках на партии из 10000 апельсинов, которые я приготовил для вас, на перспективах от 2 до 7 включительно с обоих концов. Вы должны упаковать их в пакеты весом не менее 1000 единиц. Апельсины обычно распределяются со средним весом 170 и стандартным отклонением 13, если это поможет.
Ваш счет будет суммой количества сумок из шести пробежек. Самый высокий балл побеждает. Стандартные лазейки запрещены.
Простой пример реализации и тестовый набор шаблонов в Haskell
Ответы:
Питон 3,
99649981пакетИдея этого решения аналогична Jonathan, JayCe и fortraan, но с функцией подсчета =)
Это решение добавляет лучшие подмножества области просмотра в соответствии с
score
.score
обеспечивает порядок по подмножествам по следующей схеме:expected_mean
пытается предсказать, как должны выглядеть остальные значения (при условии, что их выбор является оптимальным).UPD :
Вот еще одно наблюдение: вы можете поместить в пакет любые апельсины из лучшего подмножества, не снижая производительность алгоритма. Перемещение любой его части по-прежнему позволяет перемещать остальную часть впоследствии, и оставшаяся часть должна быть лучшим вариантом (без новых апельсинов), если оценка правильная. Кроме того, таким образом, есть шанс динамически улучшить набор кандидатов, чтобы положить их в пакет, увидев больше апельсинов перед заполнением пакета. И вы хотите знать как можно больше информации, поэтому нет смысла переносить более одного апельсина в сумку в любой момент времени.
Попытайся!
источник
powerset
функции избыточен в этом случае, потому что он вlen(list_)
любом случае равен ?)expected_mean(w)
что дает хорошие результаты:return (w+2) / max(1, round((w+2) / mean))
Питон 3 , 9796 сумок
Опираясь на ответ Джонатана:
Это зависит от powerset из кулинарной книги itertool. Сначала находит оптимальное подмножество буфера на основе минимизации разницы с целевым весом для всех подмножеств, а затем выбирает элемент из этого подмножества на основе того же критерия. Если не выбрано оптимальное подмножество из всего буфера.
источник
C ++ 17, 9961,58 (среднее по некоторым случайным семенам)
(прокрутите вниз для объяснения, если вы не знаете C ++)
(если
<
используется в основном, алгоритм пытается минимизировать количество сумок)Вдохновлен этим ответом .
Ссылка TIO на 250 повторений: попробуйте онлайн!
Определяет функцию (на самом деле она выглядит как функция, это структура),
pick_orange
которая, учитываяvector<int> weights
вес апельсинов иint remain
оставшийся вес пакета, возвращает индекс апельсина, который должен быть выбран.Алгоритм:
повтор
500
раз{
генерирует случайные (фальшивые) апельсины (нормальное распределение со средним 170 и StdDev 13) , пока есть
N_NEW_ORANGES=7
апельсинывыбрать любое подмножество, сумма имеет наименьшее значение, и не меньше , чем
remain
(функцияbacktrack
делает это)пометить все апельсины в этой подгруппе в качестве хорошего
}
усредните число раз, когда апельсины, помеченные как хорошие (настоящих) апельсинов с равным весом,
дают лучший апельсин
В программе есть 3 жестко закодированные константы, которые нельзя вывести из этой проблемы:
N_NEW_ORANGES
(длина прогноза). Увеличение этого делает программу работает экспоненциально дольше (потому что возврат)источник
invalid use of template-name ‘std::normal_distribution’
. Нет проблем с gcc 7.1.0.Python 2 , 9756 сумок
Давайте сделаем апельсиновый прокат ...
Попробуйте онлайн!
Всегда выбирает фрукты из буфера, который минимизирует абсолютную разницу нового веса и целевого веса.
источник
Питон 3, 9806 мешков
Опираясь на ответы Джонатана и Джейси:
Попробуйте онлайн!
Как это устроено
Скажем, в сумке 900 штук, и есть в наличии 2 фрукта: фрукт на 99 ед. И фрукт на 101 ед. Если фрукт из 99 единиц находится ближе к началу списка предпросмотра, он
min
выберет его вместо 101. Если это произойдет, теперь нам потребуется еще один фрукт, чтобы выполнить оставшуюся 1 необходимую единицу. Я изменил программу в пользу более ценных фруктов в этих случаях.Это делается путем сортировки, а затем обращения списка просмотра перед установкой питания.
источник
PHP, 9975 сумок
самый длинный из всех представлений, но должен быть читабельным
Попытайся
источник
Питон 3,
98559928994799569964 сумкиНа основании начального кода Джонатана Аллана, но не для того, чтобы его читали.
Идея: Поскольку 1000/170 = 5,88, мы пытаемся выбирать фрукты, близкие к 1000/6 (я возился с магическими константами). Однако, если последний фрукт в сумке может минимизировать отходы, мы используем это вместо этого.
Это решение имеет целевые суммы сумок для каждого добавленного фрукта. Я, наверное, остановлюсь здесь. Я использовал Nelder-Mead, чтобы найти мой
targets
массив:9956 сумок
Программа для сумок 9947 особенно проста:
источник
targets
? Тренировка по случайным данным?Рубин , 9967 мешков
Попробуйте онлайн!
Если у вас достаточно веса, чтобы заполнить сумку, найдите самое легкое подмножество, которое может заполнить сумку, и используйте самый легкий оранжевый из этого подмножества. В противном случае, получите оставшийся вес как можно ближе к 170.
источник
Ракетка / Схема, 9880 мешков
Чтобы решить, какой фрукт добавить в сумку, сравните оптимальный вес сумки с весом сумки с дополнительным фруктом. Если это оптимальный вес, используйте его. Если это лишний вес, минимизируйте лишнее количество. Если он имеет недостаточный вес, минимизируйте избыточное количество после попытки оставить оптимальный разрыв.
источник
Haskell , 9777 сумок
Это была моя первая попытка:
Попробуйте онлайн!
источник
Haskell , 9981 пакет
Angs → Джонатан Allan → Jayce → fortraan → Alex → Roman Czyborra codegolf питон может циклизации обратно Haskell для некоторой добавленной математической чистоты вдоль одной и той же основной ход мысли
(<miss)==False<True
)для этого целого числа обратный
(m-n)/sqrt(n)==(n+1-m)/sqrt(n+1) <==> n=sqrt(m^2-1/4)-1/2
от https://en.wikipedia.org/wiki/Sum_of_normally_distributed_random_variablesприправленный некоторыми ненужными бессмысленными
Попробуйте онлайн!
не поддаваясь другим числовым коэффициентом усиления на вершину 9981 сетей апельсинов , собранных выше в то время как мои 10k011 мешков пакер захвата непригодных апельсинов обратно из незакрытых сумок были дисквалифицирован user69850 в персонах user202729 → Джо Кинг → овс hencefore заслуженная Баунти пошла Alex
источник