সময়সূচী সমস্যার এই বিশেষ ক্ষেত্রেটি কি রৈখিক সময়ে সমাধানযোগ্য?


12

অ্যালিস নামে এক শিক্ষার্থী পরের সপ্তাহগুলিতে প্রচুর হোমওয়ার্ক করে। হোমওয়ার্কের প্রতিটি আইটেম তাকে ঠিক একদিন নেয়। প্রতিটি আইটেমের একটি সময়সীমাও থাকে, এবং তার গ্রেডগুলিতে নেতিবাচক প্রভাব পড়ে (একটি আসল সংখ্যাটি ধরে নেওয়া, কেবল তুলনাযোগ্যতা ধরে নেওয়ার জন্য বোনাস পয়েন্ট), যদি সে সময়সীমাটি মিস করে।

কোন ফাংশন লিখুন যা একটি তালিকা দিয়েছে (সময়সীমা, গ্রেড এফেক্ট) একটি শিডিয়ুল তৈরি করেছে যার জন্য কোনও হোমওয়ার্ক কোন দিন কী করা উচিত যা তার গ্রেডগুলিতে খারাপ প্রভাবের যোগফলকে হ্রাস করে।

সমস্ত বাড়ির কাজ শেষ পর্যন্ত করতে হবে, তবে যদি সে কোনও আইটেমের জন্য একটি সময়সীমা মিস করে তবে কিছুক্ষণ দেরি হয় না যে সে কীভাবে দেরি করে।

বিকল্প গঠনে:

এসিএমই কর্পোরেশন গ্রাহকদের জল সরবরাহ করতে চায়। তারা সবাই এক চড়াই রাস্তায় বাস করে। এসিএমইতে রাস্তার পাশে বেশ কয়েকটি কূপ বিতরণ করা হয়েছে। প্রতিটি ভাল এক গ্রাহকের জন্য পর্যাপ্ত জল বহন করে। গ্রাহকরা সরবরাহ করতে বিভিন্ন পরিমাণ অর্থ বিড করেন। জল কেবল উতরাই প্রবাহিত। কোন গ্রাহকরা সরবরাহ করবেন তা চয়ন করে উপার্জন সর্বাধিক করুন।

আমরা বালতি বাছাই করে ডেডলাইনগুলি বাছাই করতে পারি (বা কেবল ধরে নিই আমরা ইতিমধ্যে সময়সীমা অনুসারে বাছাই করেছি)।

আমরা যদি প্রথমে গ্রেড ইফেক্টটি অবতরণ করে বাছাই করি তবে লোভী অ্যালগরিদম দিয়ে আমরা সহজেই সমস্যাটি সমাধান করতে পারি। এই সমাধানটি ও (এন লগ এন) এর চেয়ে ভাল আর হবে না।

মিডিয়ান অফ মিডিয়ানস এবং এলোমেলোভাবে লিনিয়ার ন্যূনতম বিস্তৃত গাছের অ্যালগোরিদম দ্বারা অনুপ্রাণিত হয়ে আমার সন্দেহ হয় যে আমরা লাইনারি সময়ে আমার সাধারণ সময়সূচী / প্রবাহ সমস্যাটিও সমাধান করতে পারি।

আমি খুজছি:

  • একটি (সম্ভাব্য এলোমেলোভাবে) রৈখিক সময় অ্যালগোরিদম
  • অথবা বিকল্পভাবে একটি যুক্তি যে লিনিয়ার সময় সম্ভব নয়

একটি পদক্ষেপ পাথর হিসাবে:

  • আমি ইতিমধ্যে প্রমাণ করেছি যে কোন আইটেমগুলি তাদের সময়সীমার আগে করা যেতে পারে তা কেবল লিনিয়ার সময়ে সম্পূর্ণ সময়সূচী পুনর্গঠনের জন্য যথেষ্ট। (এই অন্তর্দৃষ্টিটি দ্বিতীয় সূত্রের অন্তর্নিহিত যেখানে আমি কেবল শংসাপত্রের বিষয়ে জিজ্ঞাসা করছি))
  • একটি সাধারণ (অবিচ্ছেদ্য!) লিনিয়ার প্রোগ্রাম এই সমস্যার মডেল করতে পারে।
  • এই প্রোগ্রামটির দ্বৈততা ব্যবহার করে, একজন প্রার্থীকে অনুকূলতার জন্য রৈখিক সময়ে প্রস্তাবিত সমাধানটি পরীক্ষা করতে পারেন, যদি কারও দ্বৈত প্রোগ্রামটির সমাধান দেওয়া হয়। (উভয় সমাধান বিট একটি লিনিয়ার সংখ্যায় প্রতিনিধিত্ব করা যেতে পারে।)

আদর্শভাবে, আমি এই মডেলটিতে এই সমস্যাটি সমাধান করতে চাই যা কেবল গ্রেডের প্রভাবগুলির মধ্যে তুলনা ব্যবহার করে এবং সেখানে সংখ্যাটি ধরে নি।

আমার এই সমস্যায় দুটি পন্থা রয়েছে --- একটি সময়সীমা এবং প্রভাব ব্যবহার করে ট্র্যাপের উপর ভিত্তি করে, অন্যটি কুইকসিলিট-এর মতো এলোমেলো পিভট উপাদান বেছে নেওয়ার এবং আইটেমগুলি প্রভাব দ্বারা বিভক্ত করার উপর ভিত্তি করে। উভয়েরই নিকৃষ্টতম কেস যা ও (এন লগ এন) বা আরও খারাপ পারফরম্যান্সকে বাধ্য করে, তবে আমি একটি সাধারণ বিশেষ কেস তৈরি করতে সক্ষম হইনি যা উভয়ের কার্যকারিতা হ্রাস করে।

উত্তর:


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

না line এটি লিনিয়ার সময়ে সমাধানযোগ্য কোনও প্রবাহ সমস্যার কোনও বিশেষ ক্ষেত্রে নয়। কারণ জটিলতা দ্বারা প্রদত্ত এবং নিজের বাছাই করার সময় আমরা হিসাবে জটিলতা পাই এবং অন্যান্য সমস্ত এন প্রক্রিয়া সম্পাদনের জন্য জটিলতা অবশ্যই রৈখিক থাকে না।( এন লগ এন )O(n2)O(nlogn)


1
আমি এই বিষয়টি খুব দৃinc়প্রত্যয়ী যুক্তি হিসাবে পাই না যে লিনিয়ার সময়ে এই সমস্যা সমাধানযোগ্য নয়।
টম ভ্যান ডার জ্যান্ডেন

আমিও করি না পুরো বিষয়টি হ'ল গ্রেড ইফেক্টের দ্বারা বাছাই করা, কারণ আপনার সম্পূর্ণ অনুমানের বিষয়ে তথ্যের প্রয়োজন নেই .. (কুইকসিলেক্টের মতো একই ধারণা।)
ম্যাথিয়াস

@ শীতল-ইউ, এছাড়াও স্পষ্ট করে বলতে চাই, আমি কিছু চালাতে চাই না --- আমি কেবল শিডিউল তৈরি করতে চাই।
ম্যাথিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.