Чи вирішується цей особливий випадок задачі планування у лінійному часі?


12

У студентки Аліси протягом наступних тижнів багато домашніх завдань. Кожен предмет домашнього завдання займає у неї рівно один день. Кожен предмет також має крайній термін і негативно впливає на його оцінки (припустимо реальну кількість, бонусні бали лише за умови, що можна порівняти), якщо вона пропустить термін.

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

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

В альтернативній рецептурі:

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

Ми можемо сортувати терміни за допомогою сортування відра (або просто припустити, що ми вже відсортовані за термінами).

Ми можемо легко вирішити проблему за допомогою жадібного алгоритму, якщо спочатку розберемо вплив за низхідним класом. Це рішення буде не кращим, ніж O (n log n).

Натхненний посередництвом медіанів і рандомізованими лінійними алгоритмами мінімального прольотного дерева , я підозрюю, що ми можемо вирішити і мою просту задачу планування / потоку в (рандомізований?) Лінійний час.

Шукаю:

  • (потенційно рандомізований) лінійний алгоритм часу
  • або в якості альтернативи аргументу, що лінійний час неможливий

Як трамплін:

  • Я вже довів, що достатньо лише знати, які предмети можна зробити до їх терміну, для відновлення повного графіка в лінійний час. (Це розуміння лежить в основі другої рецептури, коли я прошу лише про сертифікат.)
  • Проста (цілісна!) Лінійна програма може моделювати цю проблему.
  • Використовуючи подвійність цієї програми, можна перевірити запропоноване кандидатом рішення у лінійний час на предмет оптимальності, якщо також буде надано рішення подвійної програми. (Обидва рішення можуть бути представлені лінійною кількістю біт.)

В ідеалі я хочу вирішити цю проблему в моделі, яка використовує лише порівняння між впливами класів, і не передбачає чисел там.

У мене є два підходи до цієї проблеми - один заснований на підробках із використанням терміну та впливу, а інший, подібний до QuickSelect, заснований на виборі випадкових елементів зведення і розподілу елементів за допомогою впливу. В обох є найгірші випадки, які змушують O (n log n) або погіршують продуктивність, але мені не вдалося побудувати простий спеціальний випадок, який погіршує продуктивність обох.

Відповіді:


1

Кілька речей, які я дізнався поки що.

Ми можемо обмежитися вирішенням наступної пов'язаної проблеми:

newtype Slot = Slot Int
newtype Schedule a = Schedule [(Slot, [a])]

findSchedule :: Ord a => Schedule a -> Schedule (a, Bool)

Тобто, вводяться вхідні дані, вже відсортовані за термінами, але дозволяють виконувати довільну кількість негативних завдань кожного дня. Дайте висновок, просто позначивши елементи, чи можна їх вчасно запланувати, чи ні.

Наступна функція може перевірити, чи графік, поданий у такому форматі, здійсненний, тобто чи всі пункти в графіку можуть бути заплановані до їх термінів:

leftOverItems :: Schedule a -> [Int]
leftOverItems (Schedule sch) = scanr op 0 sch where
  op (Slot s, items) itemsCarried = max 0 (length items - s + itemsCarried)

feasible schedule = head (leftOverItems schedule) == 0

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

carry1 :: Ord a => Schedule a -> [Bound a]
carry1 (Schedule sch) = map (maybe Top Val . listToMaybe) . scanr op [] $ sch where
  op (Slot s, items) acc = remNonMinN s (foldr insertMin acc items)

-- We only care about the number of items, and the minimum item.
-- insertMin inserts an item into a list, keeping the smallest item at the front.
insertMin :: Ord a => a -> [a] -> [a]
insertMin a [] = [a]
insertMin a (b:bs) = min a b : max a b : bs

-- remNonMin removes an item from the list,
-- only picking the minimum at the front, if it's the only element.
remNonMin :: [a] -> [a]
remNonMin [] = []
remNonMin [x] = []
remNonMin (x:y:xs) = x : xs

remNonMinN :: Int -> [a] -> [a]
remNonMinN n l = iterate remNonMin l !! n

data Bound a = Bot | Val a | Top
  deriving (Eq, Ord, Show, Functor)

-- The curve of minimum reward needed for each deadline to make the cut:
curve :: Ord a => Schedule a -> [Bound a]
curve = zipWith min <$> runMin <*> carry1

-- Same curve extended to infinity (in case the Schedules have a different length)
curve' :: Ord a => Schedule a -> [Bound a]
curve' = ((++) <*> repeat . last) . curve

-- running minimum of items on left:
runMin :: Ord a => Schedule a -> [Bound a]
runMin = scanl1 min . map minWithBound . items . fmap Val

minWithBound :: Ord a => [Bound a] -> Bound a
minWithBound = minimum . (Top:)

-- The pay-off for our efforts, this function uses
-- the candidate solution to classify the left-out items
-- into whether they are definitely _not_ in
-- the optimal schedule (heavy items), or might be in it (light items).
heavyLight :: Ord a => Schedule a -> Schedule a -> ([[a]],[[a]])
heavyLight candidate leftOut =
    unzip . zipWith light1 (curve' candidate) . items $ leftOut
  where
    light1 pivot = partition (\item -> pivot < Val item)

heavyLight не тільки перевіряє запропоновані графіки на оптимальність, але й надає список елементів, які можуть покращити неоптимальний графік.


-4

О(н2)О(нжурналн)


1
Я не вважаю це дуже переконливим аргументом, що ця проблема не може бути вирішена в лінійний час.
Том ван дер Занден

Ні робити I. Всім сенс не уникнути угруповань по градієнту впливу, так як вам не потрібна інформація про повну перестановці .. (Та ж сама ідея, що і в Бистрому виборі .)
Matthias

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