Thuật toán Job Sequencing Problem là một thuật toán quan trọng trong lập trình và tối ưu hóa, giúp giải quyết bài toán sắp xếp công việc nhằm tối ưu hóa lợi nhuận hoặc thời gian hoàn thành công việc. Trong bài viết này, chúng ta sẽ tìm hiểu cách cài đặt thuật toán Job Sequencing Problem bằng cách sử dụng một trong những ngôn ngữ lập trình phổ biến như Python.
Mô tả bài toán
Bài toán được định nghĩa như sau: Chúng ta có một danh sách các công việc, mỗi công việc có hai thuộc tính: deadline (thời hạn hoàn thành) và profit (lợi nhuận). Mục tiêu là sắp xếp công việc sao cho tổng lợi nhuận đạt được là lớn nhất, đồng thời tuân thủ các thời hạn của từng công việc.
Ví dụ, giả sử bạn có các công việc với thông tin như sau:
Công việc | Deadline | Profit |
---|---|---|
A | 2 | 100 |
B | 1 | 19 |
C | 2 | 27 |
D | 1 | 25 |
E | 3 | 15 |
Trong đó, mỗi công việc chỉ được thực hiện trong một đơn vị thời gian, và bạn không thể thực hiện nhiều hơn một công việc tại một thời điểm.
Thuật toán giải quyết
Để giải quyết bài toán này, ta có thể sử dụng thuật toán Greedy (tham lam) với các bước như sau:
- Sắp xếp công việc theo lợi nhuận giảm dần: Đầu tiên, chúng ta sắp xếp các công việc sao cho công việc có lợi nhuận cao nhất được xem xét trước.
- Chọn công việc và sắp xếp vào thời gian hợp lý: Tiếp theo, chúng ta duyệt qua danh sách công việc đã sắp xếp và gán từng công việc vào thời gian phù hợp từ thời hạn của nó về trước, sao cho không có hai công việc nào được thực hiện cùng một lúc.
Cài đặt thuật toán bằng Python
Dưới đây là mã nguồn Python để cài đặt thuật toán trên:
class Job:
def __init__(self, job_id, deadline, profit):
self.job_id = job_id
self.deadline = deadline
self.profit = profit
def job_sequencing(jobs):
# Sắp xếp các công việc theo thứ tự lợi nhuận giảm dần
jobs.sort(key=lambda x: x.profit, reverse=True)
n = len(jobs)
# Kết quả lưu trữ công việc theo thời gian
result = [-1] * n
# Slot kiểm tra xem thời gian đó đã bị chiếm chưa
slot = [False] * n
for i in range(n):
# Tìm kiếm từ thời gian cuối cùng mà công việc có thể thực hiện
for j in range(min(n, jobs[i].deadline) - 1, -1, -1):
if not slot[j]:
slot[j] = True
result[j] = i
break
# In ra các công việc đã được chọn
for i in range(n):
if result[i] != -1:
print(jobs[result[i]].job_id)
# Danh sách các công việc
jobs = [Job('A', 2, 100), Job('B', 1, 19), Job('C', 2, 27), Job('D', 1, 25), Job('E', 3, 15)]
# Thực thi thuật toán
job_sequencing(jobs)
Phân tích kết quả
Khi chạy mã trên, chúng ta nhận được danh sách các công việc được chọn sao cho tối đa hóa lợi nhuận mà vẫn theo đúng deadline. Kết quả có thể khác nhau tùy theo dữ liệu đầu vào, tuy nhiên mục tiêu cuối cùng luôn là tối đa hóa lợi nhuận với điều kiện thời gian đã cho.
Kết luận
Việc cài đặt thành công thuật toán Job Sequencing Problem giúp chúng ta giải quyết một bài toán tối ưu hóa phức tạp trong thực tế. Dù đã sử dụng một thuật toán tham lam đơn giản, nền tảng này có thể được mở rộng và cải tiến để giải quyết các bài toán sắp xếp công việc phức tạp hơn với các ràng buộc khác nhau.
Comments