Проблема сорта Дартов - это конкурс на Конкурсы программирования Al Zimmermann, закончившиеся 20 июня 2010 года:
Предположим, что у вас есть мишень, разделенная на R областей. Каждая область дартс имеет положительное целочисленное значение, связанное с ней. Предположим, что у вас есть D дартс и что вы бросаете каждый из них на мишень. Каждый дротик либо попадает в одну из областей R борту, либо вообще пропускает плату. Ваша оценка - это сумма значений для регионов, в которых дротики земли. Дарт, который пропускает доску, ничего не дает для вашего счета. Если несколько дартов попадают в один и тот же регион, вы накапливаете значение для этого региона несколько раз.
Например, предположим, что R = 5, что области дартборда имеют значения (1, 2, 4, 7, 11) и что D = 3. Если ваши три дарта приземляются в регионах 2, 4 и 11 вы набрали 17 очков. Если один дротик пропустит доску и две другие земли в регионе 7, вы наберете 14 очков.
Задача Дартс заключается в следующем: для заданных R и D определите, какие значения должны быть связаны с областями R для карт Dartboard, чтобы максимизировать наименьший результат, недостижимый, бросая D дартс.
D = number of darts R = number of dartboard regions 3 1 through 40 4 1 through 30 5 1 through 20 6 1 through 10
=============================================== ===================================
ИСПОЛЬЗУЕМЫЙ БАЗОВЫЙ АЛГОРИТМ (объяснено для D = 3
)
-
Я начинаю с массива результата, показанного ниже. 0 и 1 - это оценки, которые должны быть там в областях мишени. 0 указывает, что дротик пропустил доску. Итак, я собираюсь сгенерировать этот массив для 41 элемента (один дополнительный для компенсации 0). 1 является принудительным, потому что иначе нет другого способа генерации 1.
____ ____ | | | | 0 | 1 | |____|____|
-
Я генерирую массив scratch, который показывает, что все итоги достижимы, используя оценки дротика в массиве результатов в трех бросках. Подчеркнутые элементы - это те, которые были использованы для создания царапины.
0 = 0 + 0 + 0 1 = 1 + 0 + 0 2 = 1 + 1 + 0 3 = 1 + 1 + 1 ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ | * | * | * | * | | | | | | | | | | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |__-_|__-_|____|____|____|____|____|____|____|____|____|____|____|
-
Теперь кандидаты для следующего элемента в массиве результатов 2, 3 или 4.
-
2= элемент один больше, чем текущий наибольший элемент
-
4= маленький недостижимый элемент
-
-
Я стараюсь каждый из этих кандидатов по очереди и вижу, что это максимум наименьших недостижимых элементов в каждом случае. Например
(0, 1, 2)
____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ | * | * | * | * | * | * | * | | | | | | | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |__-_|__-_|__-_|____|____|____|____|____|____|____|____|____|____|
(0, 1, 3)
____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ | * | * | * | * | * | * | * | * | | * | | | | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |__-_|__-_|____|__-_|____|____|____|____|____|____|____|____|____|
(0, 1, 4)
____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ | * | * | * | * | * | * | * | | * | * | | | * | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |__-_|__-_|____|____|__-_|____|____|____|____|____|____|____|____|
-
max (7, 8, 7) = 8
. Таким образом, в качестве следующего элемента выбирается 3. -
Если предположить, что была связь, например, если мне пришлось выбирать между (0, 1, 2) и (0, 1, 4), чтобы сломать галстук, я бы подсчитал количество достижимых чисел, которое больше в случае (0, 1, 4). Итак, я бы выбрал (0, 1, 4) более (0, 1, 2).
-
Но в этом случае победитель будет равен (0, 1, 3), а результирующий набор выглядит следующим образом. Затем я повторяю шаги, пока не найду 41 элемент.
____ ____ ____ | | | | | 0 | 1 | 3 | |____|____|____|
-
Алгоритм является жадным в том смысле, что он предполагает, что (решение для R = 20) является подмножеством (решение для R = 30). Итак, я не вычисляю результаты для каждого значения R, но я вычисляю результаты для каждого значения D. Итак, для D = 3 я собираю результат для R = 40, а затем беру первые 30 элементов результата для R = 30, например.
-
Алгоритм является жадным в том смысле, что он предполагает, что цель на каждом шаге (при создании массива result) заключается в достижении минимального недостижимого итога на этапе.
-
Чтобы работать лучше, чем грубая сила, алгоритм устраняет некоторые кандидаты для массива результатов. Например, в случае, показанном на диаграмме ниже (для массива <(0, 1, 4) результата), я рассматриваю только 5, 6 и 7 как кандидатов для следующего элемента и исключаю 2 и 3, хотя они все еще не используются. Это предположение может дать мне субоптимальные результаты в некоторых случаях, но он значительно сокращает количество вычислений, когда царапать растет до тысяч элементов.
____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ | * | * | * | * | * | * | * | | * | * | | | * | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |__-_|__-_|____|____|__-_|____|____|____|____|____|____|____|____|
УЛУЧШЕНИЯ АЛГОРИТМА
-
Поскольку это не давало слишком хороших результатов, я попытался создать множество результатов для каждого значения D. Например, вместо выбора лучшего следующего элемента для результата я мог бы также выберите второй лучший или третий лучший элемент. Итак, за 39 шагов (до 41 элемента в результате), я мог бы генерировать около 3 ^ 39 (для каждого выбора у меня может быть либо лучший, либо второй лучший или третий лучший элемент) случаев, которых слишком много. Итак, я решил пойти с максимальной секундой лучше всего и на треть один лучший выбор. Это уменьшило количество случаев до примерно 40 C 1 * 39 C 1= 577980 результатов. Более того, это приведет к большому числу случаев для более высоких значений R (для более высоких значений D).
-
Из этих результатов ~ 6E5, которые у меня есть, я вычисляю минимальный недостижимый элемент для каждого значения R от 1 до 40. Таким образом, каждое из значений R получает выбор наилучшего из этих значений 6E5.
ПРОБЛЕМЫ
-
Этот алгоритм не создает лучшие результат множества или даже закрывает.
-
Я даже пошел на четвертый и пятый лучший выбор для D = 3, и они не дали каких-либо существенных улучшений в результатах. Итак, я не знал, где я должен настроить свой алгоритм.
Где я могу настроить этот алгоритм для получения лучших результатов?
Есть ли очевидные ошибки, которые делает алгоритм?
Любые комментарии/предложения приветствуются.
Был еще один вопрос по той же теме здесь. Мне больше интересно узнать, где мой алгоритм может быть улучшен.