Впорядкування елементів, щоб деякі елементи не знаходилися між іншими


10

Дано ціле число і набір триплетів різних цілих чисел знайдіть алгоритм, який або знаходить перестановку множини такий, що або правильно визначає, що такої перестановки немає. Менш формально ми хочемо перевпорядкувати числа від 1 до ; кожна трійка у вказує на те, що повинен з'являтися перед у новому порядку, але не повинен з'являтися міжS { ( i , j , k ) 1 i , j , k n , i j , j k , i k } , π { 1 , 2 , , n } ( i , j , k ) Sn

S{(i,j,k)1i,j,kn,ij,jk,ik},
π{1,2,,n}n ( i , j , k ) S i k j i k
(i,j,k)S(π(j)<π(i)<π(k))  (π(i)<π(k)<π(j))
n(i,j,k)Sikjiі .k

Приклад 1

Припустимо, і . ТодіS = { ( 1 , 2 , 3 ) , ( 2 , 3 , 4 ) }n=5S={(1,2,3),(2,3,4)}

  • ( 1 , 2 , 3 ) S π ( 1 ) > π ( 3 )π=(5,4,3,2,1) є НЕ допустимим перестановок, так , а .(1,2,3)Sπ(1)>π(3)

  • π=(1,2,4,5,3) є НЕ допустимим перестановок, так , а .(1,2,3)Sπ(1)<π(3)<π(5)

  • (2,4,1,3,5) є дійсною перестановкою.

Приклад 2

Якщо і , немає дійсної перестановки. Так само не існує дійсної перестановки, якщо і ( Я думаю; можливо, тут помилилися).S = { ( 1 , 2 ,n=5S={(1,2,3),(2,1,3)}n=5S={(1,2,3),(3,4,5),(2,5,3),(2,1,4)}

Бонус: Які властивості визначають, чи існує можливе рішення?S


Чому б не перефразувати другу умову як ? Тоді у вас є пряма, більш-менш обмежена проблема задоволення. (Зауважте, що я спростив умову, виходячи з інших припущень.)(σmi,σmj,σmk)S(i>jj>k)
Дейв Кларк,

До речі: яка мотивація цієї проблеми?
Дейв Кларк

@DaveClarke Переглянь мою редакцію. Ця проблема була вилучена з дискусії навколо проблеми планування, яку я обговорював з іншими студентами в лабораторії. По суті, ідея полягає в тому, що у вас багато робочих місць, деякі з яких доводиться виконувати в певному порядку. Однак ви не хочете, щоб деякі завдання були заплановані між завданнями в послідовності, можливо, з дуже тонких причин.
Patrick87

3
Чому сигми? Просто визначте . Вкладені підписки змушують дитину Ісуса плакати. Σ={1,2,,n}
JeffE

@JeffE Чесно кажучи, мені просто подобається привід пограти з рівноцінною річчю. Щось написання коду, що компілюється для цих маленьких є щось, що просто візуально задовольняє . Не бери це у мене, чоловіче. σ
Patrick87

Відповіді:


3

Ось наївний алгоритм. Зрештою, він покладається на грубу силу, але іноді може працювати нормально.

Кожне обмеження складається з двох сполучників; назвемо їх тип- , , і тип , . Кожне обмеження типу може бути рівнозначно записане як диз'юнкція , спираючись на те, що .(σmi,σmj,σmk)Si<k¬(i<j<k)Ai<kB¬(i<j<k)Bi>jj>kij,jk

  1. Зберіть всі обмеження типуЗателефонуйте цьому . Перевірте, чи відповідають вони, а саме, що це лінеаризація замовлення. Це займає -час у кількості обмежень, використовуючи топологічне сортування.Θ O ( | S | )AΘO(|S|)
  2. Для кожного з роз'єднань обмеження типу перевірте, чи відповідає він частковому порядку . Якщо це не узгоджується, вийміть диз'юнкт. Якщо обидві диз'юнкти не узгоджуються з , то не виходить. Щоразу, коли буде видалено лише одне обмеження типу , додайте решта до . Цей крок - .Θ Θ B Θ O ( | S | 2 )BΘΘBΘO(|S|2)
  3. Тепер існує очевидний алгоритм пошуку рішення, а саме розглянути всі комбінації пар диз'юнкцій типу і перевірити їх узгодженість з , але це чітко експоненціально в. Одним з евристичних для підвищення продуктивності було б обробляти пари диз'юнкції типу як гілки дерева --- одна пара утворює корінь, дітям дається друга пара, їх дітям третя і так далі. Використовуючи цю структуру даних, рішення знайдеться шляхом обходу дерева на глибині. Щоразу, коли додається нове обмеження (за допомогою мітки на гілці), можна перевірити узгодженість. Невідповідні підкрепи можна підрізати.Θ | S | БBΘ|S|
    B
  4. Якщо досягнуто листя дерева, ми маємо послідовний набір обмежень, що складається з усіх обмежень типу і одного диз'юнкту обмежень типуЛінеаризуйте результат, щоб отримати бажане впорядкування.БAB

Мій кращий підхід насправді полягав би в тому, щоб кодувати його в набір обмежень і використовувати вирішувач обмежень, такий як Choco. Я б ввів цілих змінних в діапазон і вимагав би, щоб вони були всі чіткі. Тоді я б кодував кожне з вищезазначених обмежень безпосередньо як обмеження, а потім дозволив Чоко займатися своєю справою.x i [ 0 , n - 1 ]nxi[0,n1]


1

Ось часткова відповідь:

Якщо ви видалите обмеження на кожну трійку, то вашою проблемою стає проблема Небезпечності, яка є незавершеною і не існує відомих ефективних алгоритмів для таких проблем. Але з обмеженням , це може змусити якусь приємну структуру, яку можна використовувати, щоб знайти алгоритм поліноміального часу для вашої проблеми.N P i < ki<kNPi<k

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.