Эта проблема выглядит хорошим кандидатом на алгоритм приближения , но это дало бы нам достаточно хороший ответ. Поскольку вы хотите получить оптимальный ответ, это то, что я бы сделал, чтобы улучшить подход грубой силы.
Вместо того, чтобы вслепую пробовать каждую перестановку, я бы использовал подход backtracking , который бы поддерживал лучшее найденное решение и сокращал все ветви, которые превышают стоимость нашего лучшего решения. Я бы также добавил таблицу транспонирования , чтобы избежать повторного поиска в состояниях, которые были достигнуты предыдущими ветвями с использованием различных перестановок ходов.
Я бы также добавил несколько эвристик для изучения ходов, которые с большей вероятностью достигнут хороших результатов перед любыми другими ходами. Например, предпочитайте ходы, которые сначала имеют небольшую стоимость. Мне нужно поэкспериментировать, прежде чем я смогу определить, какая эвристика подойдет лучше всего.
Я бы также попытался найти самую длинную возрастающую подпоследовательность чисел в исходном массиве. Это даст нам последовательность чисел, которые не нужно перемещать, что должно значительно сократить количество ветвей, которые нам нужно исследовать. Это также значительно ускоряет поиск в списке, который почти отсортирован.
Я ожидаю, что эти улучшения смогут обрабатывать списки, которые намного больше 8, но при работе с большими списками случайных чисел, я бы предпочел алгоритм приближения.
По многочисленным просьбам (1 человек), это то, что я бы сделал, чтобы решить эту проблему с помощью генетического алгоритма (метаэвристика, с которым я наиболее знаком).
Во-первых, я бы начал с вычисления самой длинной возрастающей подпоследовательности чисел (см. Выше). Каждый элемент, который не является частью этого набора, должен быть перемещен. Все, что нам нужно знать сейчас, это в каком порядке.
Геномы, используемые в качестве входных данных для генетического алгоритма, представляют собой просто массив, в котором каждый элемент представляет элемент, который необходимо переместить. Порядок, в котором элементы отображаются в массиве, представляет порядок, в котором они должны быть перемещены. Фитнес-функция - это расчет стоимости, описанный в первоначальном вопросе.
Теперь у нас есть все элементы, необходимые для включения проблемы в стандартный генетический алгоритм. Остальное просто дорабатывается. Много-много настроек.