Алгоритм перестановки последовательности Весов
у меня есть количество элементов в массиве, каждый из которых связан с определенным весом. Существует бизнес-правило, гласящее, что никакие два смежных элемента не могут иметь общий вес более определенного значения, скажем, 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
большие предметы могут быть только рядом с небольшими предметами.
- сортировка списка
- разрезать пополам
- обратный вторую половину
- поменять местами половинки
- Shuffle (возьмите первый пункт из каждой половины, повторите)
пример: [1,3,8,4,2,4,1,7]
- [1,1,2,3,4,4,7,8]
- [1,1,2,3] [4,4,7,8]
- [1,1,2,3] [8,7,4,4]
- [8,7,4,4] [1,1,2,3]
- [8,1,7,1,4,2,4,3]
Я уверен, что вы не можете сделать лучше, чем это. Если бизнес-правило все равно нарушается, решения нет. Доказать / контрпример слева как упражнение ; -)
Edit: Сначала возьмите самый большой предмет!
Это похоже на проблему упаковки бункера, взгляните на (например)http://en.wikipedia.org/wiki/First_fit_algorithm
Я уверен, что это не то же самое, но это может дать вам некоторые подсказки.
Вам также нужно рассмотреть, что произойдет, если элемент sigle превысит лимит - как бы вы справились с этим?