Знайдіть оптимальне замовлення


9

Я зіткнувся з цією проблемою і намагаюся знайти спосіб її вирішити. Будь-які думки були б дуже вдячні!

Припустимо, нам дають матрицю , наприклад,{1,0,1}n × к

[1010110001011011101110001]

Не пробуючи кожної окремої перестановки, знайдіть впорядкування стовпців що максимально збільшує кількість рядків, для яких перший ненульовий елемент дорівнює .ci1

Для прикладу вище, одне таке впорядкування (воно не унікальне!) - , тобто(c3,c4,c1,c2,c5)

[1010100101100110111100101]

Тут для з рядків перший ненульовий елемент дорівнює .451


Які алгоритмічні підходи ви спробували? Де ви стикалися з цією проблемою? Чи можете ви кредитувати першоджерело? Чи можете ви поділитися чим-небудь про контекст чи мотивацію? Можливо, ця сторінка буде корисною для покращення вашого питання.
DW

1
Я хочу запропонувати крок попередньої обробки: Нехай напівпозитивний стовпець (відповідний рядок) буде стовпцем (відповідним рядком) з лише 0 та 1. Пропозиція полягає у видаленні всіх напівпозитивних стовпців, а також рядків із позначкою 1 у напівпозитивному стовпчику. У вашому прикладі це дозволило б видалити рядки 1, 3 та 4. Тепер вам залишаються рядки та стовпці, які містять -1. Можливо, це не допоможе, але міркувати про це може бути простіше.
Pål GD

Чи можна вважати, що кількість рядків набагато менша за кількість стовпців? Це може полегшити проблему.
Анжела Преторій

1
@ Pål, аналогічна попередня обробка можлива для рядків і стовпців, які не містять 1. Однак я не думаю, що це полегшує міркування про: просто менше.
Пітер Тейлор

1
FWIW це перехресний пост . haijo, якщо ви не отримаєте відповідь на одній стеці і думаєте, що інша може бути кращою, ви можете позначити її та подати запит на міграцію. Перехресне повідомлення не є хорошим етикетом, оскільки відповідачі не знають відповідей, які ви могли отримати на іншому веб-сайті, і можуть витрачати час на їх повторення.
Пітер Тейлор

Відповіді:


4

Ця проблема, яку я називатиму CO для замовлення стовпців, є важкою для NP . Ось зменшення від NP-жорсткої проблеми Vertex Cover (VC) до нього:

Форми задач рішення ВК та СО

Нехай вхідний екземпляр VC буде (V,E,k). Він являє собою запитання: "Дано графік(V,E), чи можна вибрати набір не більше k вершини від V такий, що кожен край в E інцидент хоча б на одній обраній вершині? "Ми побудуємо екземпляр (A,k) CO, що представляє питання: "З огляду на матрицю A з елементами в {1,0,1}, чи можна переставляти стовпці A таким, що 1 з'являється перед -1 принаймні kрядки? "Ці дві проблеми викладені у формі проблеми рішення , згідно з якою відповідь на кожну - ТАК чи НІ: формально кажучи, саме ця форма проблеми є NP-повною (або ні). Це не так складно бачимо, що більш природна форма проблеми оптимізації, викладена у запитанні ОП, є приблизно еквівалентною за рівнем складності: двійковий пошук порогового параметра може бути використаний для вирішення проблеми оптимізації за допомогою рішення рішення проблеми, в той час як один виклик вирішення проблеми оптимізації. з подальшим єдиним порівнянням, достатньо для вирішення проблеми рішення.

Побудова екземпляра CO з екземпляра VC

Дозволяє н=|V| і м=|Е|. Ми побудуємо матрицюА з (н+1)м+н рядки та н+1стовпчики. Топ(н+1)м рядки будуть утворені з м блоки н+1рядки кожен, кожен блок представляє край, який потрібно покрити . Знизун рядки містять вершини "прапори", що призведе до того, що стовпець (відповідний вершині) понесе фіксовану вартість, якщо вона включена в ліву частину рішення СО (відповідна вершині, що міститься у кришці вершини VC розчин).

Для кожної вершини vi, створіть стовпчик, у якому:

  • серед верхів (н+1)м рядки, то j-го блоку н+1 всі рядки містять +1, коли край еj інцидент на vi, і 0 в іншому випадку, і
  • знизу н рядки - це 0, за винятком i-та, що становить -1.

Створіть ще один стовпчик "паркан", який складається з (н+1)м копії -1, далі н копії +1.

Нарешті, встановіть поріг к' для побудованого екземпляра CO: (н+1)м+н-к. Іншими словами, ми дозволяємо максимумкрядки, у яких -1 відображається перед +1. Назвемо цю кількість порушень рядків «вартістю» рішення СО.

Доказ

Відповідність між рішенням для екземпляра CO та набором вершин у вихідному екземплярі VC така: Кожна колонка зліва від огорожі відповідає вершині, яка знаходиться у наборі, і кожному стовпцю праворуч від огорожі відповідає вершина, якої немає.

Інтуїтивно, -1-го місця у верхній частині стовпця "огорожа" примушують вибір підмножини стовпців, які розміщуються зліва, які разом містять +1 у всіх цих позиціях - відповідно до підмножини вершин, які трапляються на кожен край. Кожен із цих стовпців, що з’являється зліва від «огорожі», має на різному рядку десь внизу -1нрядки, несучи вартість 1; + 1 в нижній частині "огорожі" гарантують, що всі стовпці, розміщені праворуч, не несуть таких витрат.

Очевидно, що VC рішення використовує не більше к вершини дають рішення побудованому екземпляру CO із максимальною вартістю к: Просто впорядкуйте стовпчики, що відповідають вершинам, у кришці вершин довільно, за ними стовпець огорожі, а потім усі стовпці, що залишилися в будь-якому порядку.

Залишається показати, що рішення для екземпляру CO має максимум витрат к відповідає кришці вершини з не більше к вершин.

Припустимо, протилежне, що існує рішення для екземпляру CO, що має максимум витрат к який залишає ряд рядків у верхній частині (н+1)мрядки з -1 перед +1. Цей рядок належить до блоку(н+1) рядки, що відповідають певному краю уv. Кожен рядок у цьому блоці у вихідному екземпляріАідентичний за конструкцією; permuting стовпці можуть змінювати ці рядки, але це не впливає на те, що вони однакові. Таким чином, кожен із нихн+1 однакові рядки мають -1 у порівнянні з +1 перед рішенням, що означає принаймні вартість н+1. Алекн<н+1: протиріччя.

Оскільки кожен із м блоки рядків у верхній частині (н+1)мрядки мають +1 перед -1, кожен з відповідних країв прикритий вершиною, що відповідає стовпчику зліва від огорожі: тобто ця підмножина вершин являє собою кришку вершини. Оскільки ніхто з верхів(н+1)м рядки мають -1 перед +1, єдине місце, де може нараховуватися вартість у розчині, знаходиться внизу нряди, від стовпців, розміщених зліва від паркану. Кожен такий стовпець коштував рівно 1, тому враховуючи, що вартість становить максимумк, повинно бути не більше к такі стовпці, а значить, максимум к вершини в обкладинці.

Нарешті, зрозуміло, що екземпляр CO може бути побудований у поліномійному часі з екземпляра VC, це означає, що якщо алгоритм поліноміального часу існував для вирішення CO, будь-який екземпляр VC також міг бути вирішений у поліноміальний час, спочатку побудувавши екземпляр CO, як описано вище, а потім вирішити. Оскільки VC є NP-жорстким, CO теж.


Щоразу, коли є така приємна відповідь, мене змушує замислитись, чи слід "Запитання з питань гарячої мережі" замінити чи приєднати щось на зразок "Цінні відповіді в мережі".
Джон Л.

Не могли б ви пролити трохи світла на те, як ви знайдете відповідь? Це має бути навіть більш освітянським, ніж сама відповідь.
Джон Л.

1
@ Apass.Jack: Дякую! :) У мене немає спеціальної стратегії, і я можу тривалий час блукати в неправильному напрямку. Наприклад, тут я витратив довгий час, думаючи, що міг би скоротити з Гамільтонового циклу (який схожий, наскільки це стосується елементів впорядкування), перш ніж зрозуміти, що моя конструкція дозволить конфігураціям, що відповідають підметрам, і, отже, не буде працювати. Як правило, я завжди пробую скорочення з Vertex Cover або Partition, то, можливо, Clique. "Цінні відповіді мережі" звучать як відмінна ідея :)
j_random_hacker

1
@ Apass.Jack: Однією корисною загальною ідеєю є думати про те, як можна "масштабувати" цільовий екземпляр проблеми, не змінюючи її відповіді - наприклад, якщо цільова проблема (що ми намагаємося довести) - це Vertex Cover, що робить будь-який позитивний ціле число r розрізнені копії графіка, а також множення порога k від rзалишає відповідь незмінною. Часто ви хочете, щоб певні порушення (цільові рішення, що не відповідають дійсним рішенням джерела) "пересилили" певні інші, і в такому випадку ви можете "примножити" гаджети, які відповідають більш важливим порушенням.
j_random_hacker

1
Для скорочення моєї відповіді ми хочемо кодувати примірник проблеми, коли є дві "сили": Спробуйте охопити всі ребра та спробуйте використовувати якомога менше вершин. Перший тут важливіший, тому я "множив" рядки, відповідні ребрам: зараз одне порушення ребер коштуєn+1, значить, гірше пропустити один край, ніж включати всі вершини. І я щойно зрозумів, що мені слід відредагувати відповідь, щоб явно сказати, що ми маємо справу з версіями проблеми цих двох проблем, в яких порогові параметри є частиною екземпляра проблеми ...
j_random_hacker

2

Я не знаю, чи є насправді поліноміальне рішення. Тим не менш, виходячи з коментаря Pål GD, ви можете побудувати функцію спрощення. Початкова матриця спрощується при складанні вихідної послідовностіS.

function simplification:
while(true)
    if any row i$ has no 1 or no -1 left, remove it
    if any column j has no -1 then,
       remove it and put j on the leftmost available position in S,
       remove all rows where column j has 1.
    if any column j has no 1 then, 
       remove it and put j on the rightmost available position in S.
    if no modification has been done on this loop, break

Тоді вам слід провести повне дослідження комбінаторики за допомогою ітераційного вибору функції:

function pick(k):
    put column k on the leftmost available position in S
    remove any row where column k is -1 or 1

Після кожного вибору ви можете зробити спрощення, щоб зменшити кількість можливостей для вивчення. Я пропоную вивчити жадібно, починаючи зі стовпця, що має менше -1, таким чином, ви можете досягти нижньої межі, зробивши критерій зупинки.

На наведеному прикладі дається перше спрощення (як пояснив Pål GD в коментарі)

  • S[0]=c3, видаліть r1, r3
  • S[1]=c4, видаліть r4
  • S[2]=c2 це дозволить вам просту матрицю для вивчення.
    [1111]

Я думаю, що матриця, що робить цей метод досить неефективною, мала б рівно один 1, і один -1 на рядок / стовпець, щось подібне

[110000110000001100001100000011000011]

Тим не менш, спрощення все ще шкодує приблизно половину кроків розвідки. І цей тип матриць можна розділити на кілька незалежних підматриць.


1
@ Apass.Jack Я відредагував точніше. Так, я мав на увазі положення стовпця у вихідній послідовності.
Оптідад

Запропонований як крок спрощення може бути досить корисним для практичних цілей (наприклад, вправ в режимі онлайн програмування?).
Джон Л.

Дякую, насправді мені було цікаво оцінити амортизовану вартість часу, але я не знаю, як це зробити. Чи можливо це? Або це багато в чому залежить від проблеми?
Оптідад

2
Я спробував аналіз амортизованого часу, який видається важким. Підозрюю, що НП - незавершеність. З іншого боку, крок спрощення може бути більш загальним. Для стовпцяi і j таким, що спільна ненульова частина їх є ненульовою частиною i, стовпчик j можна видалити, якщо зайва ненульова частина j не містить 1 та стовпця i можна видалити, якщо зайва ненульова частина jне містить -1.
Джон Л.

1
Ще одне правило домінування: Коли ви маєте дві колонки i і j такий, де є хоча б 1 ряд i має -1 і j має +1, і немає рядка, де i має +1 і j має -1, переваги розміщення ніколи не буває iспочатку. Скажімо такj домінує iв цьому випадку. Ви можете реалізувати цей внутрішній вибір (k) перевіряючи, чи kпереважає над будь-яким із розміщених стовпців: якщо так, ви можете обрізати цю гілку дерева пошуку.
j_random_hacker
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.