Подтвердить что ты не робот

Задача: взять изображение 48x48, найти смежные области, которые приведут к самому дешевому решению Lego для создания этого изображения!

Фон

Lego производит X-Large Grey Baseplate, которая представляет собой большую строительную пластину шириной 48 шипов и 48 шипов, что приводит к общая площадь 2304 штырей. Будучи фанатиком Lego, я смоделировал несколько мозаичных проектов, которые можно поместить на эти базовые плиты, а затем, возможно, повеситься на стенах или на дисплее (см. Android, Dream Theater, Галактическая Империя, Покемон).

Задача

Теперь моя задача - получить самую низкую стоимость для покупки этих проектов. Покупка 2304 индивидуальных пластин 1x1 может стать дорогостоящей. Используя BrickLink, по существу eBay для Lego, я могу найти данные, чтобы определить, какие самые дешевые части для заданных цветов. Например, пластина размером 1 × 4,10 (или 0,025 долл. США за шпилька) была бы дешевле, чем пластина размером 6х6 на 2,16 долл. США (или 0,06 долл. США за шпилька). Мы также можем определить список всех возможных пластин, которые можно использовать для сборки изображения:

1x1
1x2
1x3
1x4
1x6
1x8
1x10
1x12    
2x2 corner!    
2x2
2x3
2x4
2x6
2x8
2x10
2x12
2x16    
4x4 corner!    
4x4
4x6
4x8
4x10
4x12    
6x6
6x8
6x10
6x12
6x14
6x16
6x24    
8x8
8x11
8x16    
16x16

Проблема

Для этой проблемы предположим, что у нас есть список всех пластин, их цвет (ы), "вес" или стоимость для каждой пластины. Для простоты мы можем даже удалить угловые элементы, но это было бы интересной задачей для решения. Как вы найдете самые дешевые компоненты для создания изображения 48x48? Как бы вы нашли решение, в котором используются наименьшие компоненты (не обязательно самые дешевые)? Если бы мы добавляли угловые элементы в качестве допустимых частей, как бы вы их объяснили?

Мы можем предположить, что у нас есть некоторый главный список, который получается путем запроса BrickLink, получения средней цены для данного кирпича в заданном цвете и добавления этого в качестве элемента в списке. Таким образом, не было бы черной пластины 16x16 просто потому, что она не была сделана или продана. Тем не менее, 16x16 ярко-зеленая пластинка будет иметь значение 3,74 доллара, идя на текущую доступную среднюю цену.

Надеюсь, что моя рецензия на проблему будет достаточной. Это то, о чем я думал уже несколько дней, и мне любопытно, что вы, ребята, думаете. Я отметил его как "интервью-вопросы", потому что это сложно, а не потому, что я получил его в интервью (хотя я думаю, что это будет интересный вопрос!).

ИЗМЕНИТЬ

Здесь ссылка на 2x2 угловой элемент и на 4x4 corner часть. Ответ не обязательно должен учитывать цвет, но он должен быть расширяемым, чтобы охватить этот сценарий. Сценарий будет заключаться в том, что не все тарелки доступны во всех цветах, поэтому представьте, что у нас есть массив элементов, которые идентифицируют пластину, ее цвет и среднюю стоимость этой пластины (пример ниже). Благодаря Бенджамину за предоставление щедрости!

1x1|white|.07
1x1|yellow|.04
[...]
1x2|white|.05
1x2|yellow|.04
[...]

В этом списке не будет записи:

8x8|yellow|imaginarydollaramount

Это потому, что желтая пластина 8x8 не существует. Сам список тривиален и должен рассматриваться только как предоставление ссылок для решения; это не влияет на само решение.

EDIT2

Изменил некоторые формулировки для ясности.

4b9b3361

Ответ 1

Карл подход в основном звучит, но может использовать некоторые подробности. Он найдет оптимальное решение для затрат, но будет слишком медленным для определенных ресурсов. Большие открытые области особенно будут иметь слишком много возможностей для поиска наивно.

В любом случае, я сделал быструю реализацию на С++ здесь: http://pastebin.com/S6FpuBMc

Он разрешает заполнять пустое пространство (периоды) четырьмя различными кирпичами:

0: 1x1 cost = 1000
1: 1x2 cost = 150
2: 2x1 cost = 150
3: 1x3 cost = 250
4: 3x1 cost = 250
5: 3x3 cost = 1

..........       1112222221
...#####..       111#####11
..#....#..       11#2222#13
..####.#..       11####1#13
..#....#..       22#1221#13
..........       1221122555
..##..#...  -->  11##11#555
..#.#.#...       11#1#1#555
..#..##...       11#11##221
..........       1122112211
......#..#       122221#11#
...####.#.       555####1#0
...#..##..       555#22##22
...####...       555####444  total cost = 7352

Итак, алгоритм заполняет заданную область. Он рекурсивный (DFS):

FindBestCostToFillInRemainingArea()
{  
  - find next empty square
  - if no empty square, return 0
  - for each piece type available
    - if it legal to place the piece with upper-left corner on the empty square
      - place the piece
      - total cost = cost to place this piece + FindBestCostToFillInRemainingArea()
      - remove the piece
  return the cheapest "total cost" found
}

Как только мы выясним самый дешевый способ заполнить суб-область, мы будем кэшировать результат. Чтобы очень эффективно идентифицировать подзону, мы будем использовать 64-битное целое, используя Zobrist хеширование. Предупреждение: столкновение с хешем может привести к неправильным результатам. Как только наша процедура вернется, мы сможем восстановить оптимальное решение на основе наших кешированных значений.

Оптимизация: В этом примере исследуются 41936 узлов (рекурсивные вызовы) (поиск пустого квадрата сверху вниз). Однако, если мы ищем пустые квадраты слева направо, изучаются ~ 900 000 узлов.

Для больших открытых областей: Я бы предложил найти наиболее экономичную деталь и заполнить большую часть открытой области этой частью как шаг до процесса. Другой способ состоит в том, чтобы разделить изображение на несколько регионов и оптимизировать каждую область отдельно.

Удачи! Я буду недоступен до 26 марта, так что, надеюсь, я ничего не пропустил!

Ответ 2

Действия

Шаг 1: Итерация через все решения.

Шаг 2. Найдите самое дешевое решение.

Создание инвентаря предметов

Для массива возможных фигур (включая отдельные куски каждого цвета) сделайте по крайней мере n дубликатов каждого фрагмента, где n = max (плата #/шт. # каждого цвета). Поэтому не более n этой части может покрывать все цвета доски по площади.

Теперь у нас есть огромная коллекция возможных частей, ограниченная, потому что гарантируется, что подмножество этой коллекции полностью заполнит доску.

Затем он становится проблемой подмножества, которая NP-Complete.

Решение задачи подмножества

For each unused piece in the set
  For each possible rotation (e.g. for a square only 1, for a rectangle piece 2, for an elbow piece 4)
    For each possible position in the *remaining* open places on board matching the color and rotation of the piece
      - Put down the piece
      - Mark the piece as used from the set
      - Recursively decent on the board (with already some pieces filled)

Оптимизация

Очевидно, что являясь алгоритмом O (2 ^ n), обрезка дерева поиска на раннем этапе имеет первостепенное значение. Оптимизация должна выполняться раньше, чтобы избежать длительного использования. n - очень большое число; просто рассмотрите плату 48x48 - у вас есть 48x48xc (где c = количество цветов) только для отдельных частей.

Следовательно, 99% дерева поиска должны быть обрезаны с первых нескольких сотен слоев, чтобы этот алгоритм завершился в любое время. Например, сохраните подсчет наименьшего стоимостного решения, найденного до сих пор, и просто прекратите поиск всех нижних слоев и обратного отслеживания всякий раз, когда текущая стоимость плюс (количество пустых позиций платы x самая низкая средняя стоимость для каждого цвета) > текущее решение с наименьшими затратами.

Например, дальнейшая оптимизация, всегда благоприятствующая самым крупным кускам (или наименьшим средним издержкам) сначала, чтобы как можно быстрее уменьшить базовое минимальное решение и сократить как можно больше будущих случаев.

Поиск самого дешевого

Рассчитайте стоимость каждого решения, найдите самый дешевый!

Комментарии

Этот алгоритм является общим. Он не предполагает, что кусок имеет один цвет (у вас могут быть разноцветные кусочки!). Он не предполагает, что большая часть дешевле, чем сумма меньших частей. На самом деле это ничего не значит.

Если некоторые допущения могут быть сделаны, то эту информацию можно использовать для дальнейшего сокращения дерева поиска как можно раньше. Например, при использовании только одноцветных фрагментов вы можете обрезать большие части доски (с неправильными цветами) и обрезать большое количество фигур в наборе (неправильного цвета).

Предложение

Не пытайтесь делать 48x48 одновременно. Попробуйте это на чем-то маленьком, скажем, 8x8, с достаточно маленьким набором штук. Затем постепенно увеличивайте количество штук и размер доски. Я действительно не знаю, как долго будет проходить программа - но мне бы хотелось, чтобы кто-нибудь сказал мне!

Ответ 3

Сначала вы используете заливку заливом, чтобы разбить проблему на заполнение сплошных областей лего кирпичей. Затем для каждого из них вы можете использовать dfs с записью, которую хотите. Наполнение залива тривиально, поэтому я не буду описывать его дальше.

Обязательно следуйте правилу правой руки, расширяя дерево поиска, чтобы не повторять состояния.

Ответ 4

Мое решение будет:

  • Отсортировать все штуки по стоимости шпильки.
  • Для каждого фрагмента в отсортированном списке попробуйте поместить как можно больше в тарелку:
    • Растровое 2D-изображение вашего дизайна, которое ищет области изображения с однородным цветом, формой текущей части и свободными шпильками для каждого шпильки, которые будут использовать кусок.
    • Если цвет найденной области не существует для этой конкретной части, игнорируйте поиск в дальнейшем.
    • Если существует цвет: пометите шпильки, используемые этими частями, и увеличьте счетчик для этой части и этого цвета.
    • Шаг 2 будет выполнен один раз для квадратов, дважды для прямоугольных фигур (один раз по вертикали и один раз по горизонтали) и 4 раза для угловых частей.
  • Итерации до 2 до тех пор, пока плита не будет заполнена или не будет больше типов кусков.

Как только вы дойдете до конца, у вас будет количество штук каждого вида и каждого цвета, который вам нужен, с минимальными затратами.

Если стоимость по окуркам может меняться по цвету, то исходный отсортированный список должен включать не только тип фигуры, но и цвет.