スケジューリング問題のこの特殊なケースは線形時間で解決できますか?


12

学生のアリスは、今後数週間にわたって多くの宿題をします。宿題の各項目には、ちょうど1日かかります。また、各アイテムには期限があり、期限に間に合わなかった場合、成績にマイナスの影響があります(実数、比較可能性のみを想定した場合のボーナスポイント)。

(期限、成績への影響)のリストを指定して、成績への悪影響の合計を最小化する、その日のうちに宿題を行うスケジュールを計算する関数を作成します。

すべての宿題は最終的に行われなければなりませんが、彼女がアイテムの締め切りに間に合わなかった場合、彼女がそれを遅らせることは重要ではありません。

別の定式化では:

ACME corpは、顧客に水を供給したいと考えています。彼らはすべて1つの上り坂に沿って住んでいます。ACMEには、通り沿いにいくつかの井戸があります。各井戸には、1人の顧客に十分な水が供給されます。顧客は、提供する金額を変えて入札します。水は下り坂でしか流れません。提供する顧客を選択して、収益を最大化します。

バケットの並べ替えを使用して期限を並べ替えることができます(または、既に期限で並べ替え済みであると仮定します)。

グレードの影響を降順に並べ替えれば、貪欲なアルゴリズムで問題を簡単に解決できます。その解決策はO(n log n)に勝るものはありません。

Median of Mediansランダム化線形最小スパニングツリーアルゴリズムに触発され、単純なスケジューリング/フローの問題を(ランダム化?)線形時間でも解決できると思います。

を探しています:

  • (潜在的にランダム化された)線形時間アルゴリズム
  • または、線形時間は不可能であるという議論

踏み台として:

  • 期限までにどの項目を実行できるかを知るだけで、完全なスケジュールを線形時間で再構築するのに十分であることをすでに証明しました。(この洞察は、証明書についてのみ質問している2番目の定式化の根底にあります。)
  • 単純な(積分!)線形プログラムでこの問題をモデル化できます。
  • このプログラムの双対性を使用すると、双対プログラムの解も与えられている場合、候補の提案された解の最適性を線形時間で確認できます。(両方の解は線形のビット数で表すことができます。)

理想的には、グレードの影響の比較のみを使用し、そこでの数値を想定しないモデルでこの問題を解決したいと考えています。

この問題には2つのアプローチがあります。1つは期限とインパクトを使用したトレープに基づいており、もう1つはランダムピボット要素の選択とインパクトによるアイテムの分割に基づいています。どちらも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

提案された候補ソリューションがあり、すべてのアイテムが除外されている場合、候補が最適であるかどうか、またはソリューションを改善する除外アイテムにアイテムがあるかどうかを線形時間でチェックできます。最小スパニングツリーアルゴリズムの用語と同様に、これらのライトアイテムを呼び出します。

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

On2Onログn


1
この問題は線形時間では解決できないという説得力のある議論はありません。
トム・ファン・デル・ザンデン

どちらもI.に全体のポイントをやっていることは、あなたが完全な順列についての情報を必要としないので、卒業生の衝撃でソートを回避することはありません...(QuickSelectのように同じ考え。)
マティアス

@ Sheetal-U、また明確にするために、私は何も実行したくない---ただスケジュールを構築したい。
マティアス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.