Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

ปัญหาการจัดลำดับงานกับกำหนดเวลา


ในปัญหานี้ มีรายการงานให้ ในรายการ กำหนดเวลาและผลกำไรสำหรับแต่ละงานด้วย ทุกงานจะใช้เวลาหน่วยเดียว ดังนั้นกำหนดเวลาขั้นต่ำสำหรับงานคือ 1 หากกำหนดงานได้เพียงงานเดียวในแต่ละครั้ง ให้ทำกำไรสูงสุด

เพื่อแก้ปัญหานี้ เซ็ตย่อยของชุดงานทั้งหมดจะถูกสร้างขึ้นเพื่อตรวจสอบว่าแต่ละเซ็ตย่อยเป็นไปได้หรือไม่ นอกจากนี้ ติดตามผลกำไรสูงสุดสำหรับส่วนย่อยที่เป็นไปได้ทั้งหมดที่สร้างขึ้น

ความซับซ้อนของเวลาของอัลกอริทึมนี้คือ O(n^2)

อินพุตและเอาต์พุต

Input:
A list of jobs with job id, deadline and profit. And the number of jobs n.
{('a', 2, 100), ('b', 1, 19), ('c', 2, 27), ('d', 1, 25), ('e', 3, 15)}
n = 5
Output:
Following is maximum profit sequence of job sequence: c a e

อัลกอริทึม

jobSequence(jobList, n)

ป้อนข้อมูล - รายชื่องานและจำนวนงานที่อยู่ในรายการ

ผลลัพธ์ − ลำดับ วิธีการรับงาน

Begin
   sort the jobs in jobList according to their profit create a list of job sequence and slot to track free time slots
   initially make all slots are free
   for all given jobs i do
      for all jobs in the list from ending of the list do
         if slot[j] is free then
            jobSequence[j] := i
            make slot[j] := fill
            break the loop
      done
   done

   for all slots when it is not free do
      print id of job using jobList[jobSequence[i]]
   done
End

ตัวอย่าง

#include<iostream>
#include<algorithm>
using namespace std;

struct Job {
   char id;
   int deadLine;
   int profit;
};

bool comp(Job j1, Job j2) {
   return (j1.profit > j2.profit);    //compare jobs based on profit
}

int min(int a, int b) {
   return (a<b)?a:b;
}

void jobSequence(Job jobList[], int n) {
   sort(jobList, jobList+n, comp);    //sort jobList on profit

   int jobSeq[n];     // To store result (Sequence of jobs)
   bool slot[n];      // To keep track of free time slots

   for (int i=0; i<n; i++)
      slot[i] = false; //initially all slots are free

   for (int i=0; i<n; i++) {    //for all given jobs
      for (int j=min(n, jobList[i].deadLine)-1; j>=0; j--) {   //search from last free slot
         if (slot[j]==false) {
            jobSeq[j] = i;   // Add this job to job sequence
            slot[j] = true;  // mark this slot as occupied
            break;
         }
      }
   }

   for (int i=0; i<n; i++)
      if (slot[i])
         cout << jobList[jobSeq[i]].id << " ";    //display the sequence
}

int main() {
   Job jobList[] = {{'a',2,100}, {'b',1,19}, {'c',2,27},{'d',1,25},{'e',3,15}};
   int n = 5;
   cout << "Following is maximum profit sequence of job sequence: ";
   jobSequence(jobList, n);
}

ผลลัพธ์

Following is maximum profit sequence of job sequence: c a e