Это легко решить (несколько строк кода) как целочисленную программу. Используя такой инструмент, как GNU Linear Programming Kit , вы определяете свои ограничения декларативным способом и позволяете решателю найти лучшее решение. Здесь пример программы GLPK.
Вы можете кодировать это, используя универсальный язык программирования, такой как Python, но этот тип вещей вы увидите в первых нескольких главах учебника по целочисленному программированию. Самые эффективные алгоритмы уже разработаны другими.
РЕДАКТИРОВАТЬ: ответить на вопрос Мерджит:
Определение:
- матрица Y, где Y_ (ij) = 1, если лента i
воспроизводится перед лентой j, и 0
иначе.
- вектор C, где C_i
указывает временной интервал, когда я
сыграно (например, 1,2,3,4,5,6,7)
- Большой
константа М (ищите термин для
"большой М" в учебнике по оптимизации)
Минимизировать сумму вектора C с учетом следующих ограничений:
Y_(ij) != Y_(ji) // If i is before j, then j must not be before i
C_j < C_k + M*Y_(kj) // the time slot of j is greater than the time slot of k only if Y_(kj) = 1
C_O - C_L = 1 // L must be played immediately before O
C_N > C_L // news tape must be played at some time after L
|C_G - C_P| = 2 // You will need to manipulate this a bit to make it a linear constraint
Это должно помочь вам пройти большую часть пути туда. Вы хотите записать вышеупомянутые ограничения в синтаксисе языка MathProg (как показано в ссылках) и убедиться, что я не пропустил никаких ограничений. Затем запустите решатель GLPK для ограничений и посмотрите, что получится.