Алгоритм перестановки последовательности Весов

у меня есть количество элементов в массиве, каждый из которых связан с определенным весом. Существует бизнес-правило, гласящее, что никакие два смежных элемента не могут иметь общий вес более определенного значения, скажем, 100 для простоты.

например, в следующем порядке:

[40,60,40,50]

но не этот (так как 50+60 = 110)

[50,60,40] 

Я пытаюсь реализовать алгоритм, который будет переставлять элементы (если это возможно), так что бизнес-правило выполненный. Например, второй можно переставить на [60,40,50] или [50,40,60]

алгоритм также должен попытаться минимизировать количество перемещаемых элементов, т. е. Первое решение выше является наиболее подходящим, поскольку поддерживается "подстановка" [60,40].

Я не ищу полный ответ или примеры кода, но был бы рад, если бы кто-то мог указать некоторые алгоритмы или категории алгоритмов для этой цели. Было бы гораздо лучше положиться на существующий и доказанный алгоритм, чем некоторые домашние вещи ;)

Примечание: На самом деле количество элементов очень велико, поэтому тестирование всех различных перестановок не является вариантом.

3 ответов


хорошее жадное решение: для первого места возьмите максимальное число. Для каждого следующего места возьмите максимум из неиспользованных номеров, прежде чем удовлетворить ваше условие. Если вы разместите все числа-вы нашли решение. В противном случае решение не существует, почему - это упражнение для вас.

мое доказательство: представьте, что решение существует. Покажите, что мой алгоритм найдет его. Пусть a_1, ..., a_n - любое решение. Пусть a_i - максимальный элемент. Тогда a_i, a_{i-1}, ..., a_1, a_{i+1}, a_{i+2},..., неопределенная величина это тоже решение, потому что a_1


большие предметы могут быть только рядом с небольшими предметами.

  1. сортировка списка
  2. разрезать пополам
  3. обратный вторую половину
  4. поменять местами половинки
  5. Shuffle (возьмите первый пункт из каждой половины, повторите)

пример: [1,3,8,4,2,4,1,7]

  1. [1,1,2,3,4,4,7,8]
  2. [1,1,2,3] [4,4,7,8]
  3. [1,1,2,3] [8,7,4,4]
  4. [8,7,4,4] [1,1,2,3]
  5. [8,1,7,1,4,2,4,3]

Я уверен, что вы не можете сделать лучше, чем это. Если бизнес-правило все равно нарушается, решения нет. Доказать / контрпример слева как упражнение ; -)

Edit: Сначала возьмите самый большой предмет!


Это похоже на проблему упаковки бункера, взгляните на (например)http://en.wikipedia.org/wiki/First_fit_algorithm

Я уверен, что это не то же самое, но это может дать вам некоторые подсказки.

Вам также нужно рассмотреть, что произойдет, если элемент sigle превысит лимит - как бы вы справились с этим?