You are on page 1of 8

CHUYÊN ĐỀ BÀI TOÁN LẬP LỊCH

I. Một số thuật toán


1.Thuật toán Johnson
Bài toán 1:
'Mỗi một chi tiết D1,D2,...Dn cần phải được lần lượt gia công trên 2 máy A,B. Thời gian
gia công chi tiết Di trên máy A là ai trên máy B là bi (i=1,2..n). Hãy tìm lịch (trình tự gia
công) các chi tiết trên hai máy sao cho việc hoàn thành gia công tất cả các chi tiết là sớm
nhất'.

Thuật Johnson:
Chia các chi tiết thành 2 nhóm: nhóm N1, gồm các chi tiết Di thoả mãn a1 < b1, tức là
min(ai,bi) = ai và nhóm N2 gồm các chi tiết Di thoả mãn ai >bi tức là min(ai,bi)=bi. Các chi
tiết Di thoả mãn ai =bi xếp vào nhóm nào cũng được.
Sắp xếp các chi tiết trong N1 theo chiều tăng của các ai và sắp xếp các chi tiết trong N2
theo chiều giảm của các bi
Nối N2 vào đuôi N1, dãy thu được (đọc từ trái sang phải) sẽ là lịch gia công.

Bài toán 2:
'Xét bài toán gia công N chi tiết trên 3 máy theo thứ tự A,B,C với bảng thời gian
ai,bi,ci,i=1,2,..n thoả mãn:
max bi ≤ min ai hoặc max bi ≤ min ci'

Thuật toán:
Lịch gia công tối ưu trên 3 máy sẽ trùng với lịch gia công tối ưu trên 2 máy: máy thứ nhất
với thời gian ai + bi và máy thứ hai với thời gian bi + c i.

Ví dụ :

Bài toán: (Lập lịch gia công trên hai máy)


Một sản phẩm gồm N chi tiết, mỗi chi tiết phải gia công lần lượt trên hai máy A và
B (A trước, B sau). Thời gian thực hiện chi tiết i trên máy A là A i, trên máy B là Bi
(i=1,2,…,N).
Hãy xếp lịch hoàn thành sản phẩm với thời gian ít nhất. Hiện lịch và thời gian hoàn
thành.
Dữ liệu vào cho trên file GIACONG.INP gồm :
-Dòng đầu là số nguyên dương N
-n dòng sau, dòng i+1 là hai số Ai, Bi
Kết quả ghi ra file GIACONG.OUT gồm :
-Dòng đầu là thời gian ít nhất thực hiện N công việc
-Dòng thứ hai lần lượt ghi số hiệu của N công việc thực hiện theo lịch tối ưu

1
Ví dụ :
GIACONG.INP GIACONG.OUT
5 26
33 14 523
43
62
57
63

Áp dụng thuật toán Johnson


Hoặc có thể thực hiện cụ thể như sau:

Xây dựng dẫn dãy kết quả từ hai đầu dồn vào giữa

2. Thuật toán More


Bài toán:
'Có n ôtô đưa vào xưởng sửa chữa được đánh số thứ tự 1,2..,n. Ôtô phải sửa chữa trong
thời gian ti và thời điểm phải bàn giao là di. Mỗi thời điểm xưởng chỉ sửa chữa một cái,
xưởng sửa chữa không ngừng và thời điểm bắt đầu sửa chữa là 0. Hãy đưa ra một thứ tự
sữa chữa sao cho số lượng ôtô đúng hạn là lớn nhất.'

Sắp xếp theo thứ tự tăng dần của thời điểm bàn giao
Duyệt từ đầu cho đến khi gặp ôtô quá hạn đầu tiên (Giả sử là ôtô thứ k)
Tìm từ đầu cho đến ôtô thứ k, ôtô nào có ti lớn nhất (Giả sử đó là ôtô thứ m). Nếu ôtô này
đã được chuyển một lần rồi thì dừng chương trình, còn nếu không thì ta chuyển ôtô này
xuống cuối. Rồi trở lại bước 2.

3. Các phương pháp khác:


Thông thường thì các bài toán dạng này thường có rất nhiều cách giải. Nhưng thông dụng
nhất là thuật toán quy hoạch động và duyệt nhánh cận. Ngoài ra một số còn đưa về đồ thị.

1.Phương pháp sắp xếp Tô-pô


a.Thứ tự bộ phận :
Một thứ tự bộ phận giữa các phần tử của tập hợp S là một quan hệ giữa các phần tử
của S(kí hiệu quan hệ này là “<”) sao cho mọi phần tử phân biệt x,y,z của S đều thỏa mãn
3 tính chất sau:
+Tính bắc cầu: nếu x<y và y<z thì x<z
+Tính không đối xứng: nếu x<y thì không xảy ra y<x
+Tính không phản xạ: Không xảy ra x<x
Xét tập S có chứa quan hệ bộ phận “<”: Nếu coi mỗi phần tử của S là một đỉnh của
đồ thị, hai phần tử x,y mà x<y được nối bởi cung (x,y), thì đồ thị này không có chu trình
và không khuyên. Vì vậy có thể sắp tất cả các phần tử của tập hợp S theo một chiều từ

2
trái qua phải trên cùng một đường thẳng sao cho nếu x,y thì x ở bên trái y, nghĩa là bảo
đảm quan hệ thứ tự bộ phận trong thứ tự tuyến tính
Tập S có thể chứa nhiều tập con S0 với quan hệ thứ tự bộ phận trong nó. Phần tử
không thuộc bất kì tập con S 0 nào được gọi là các phần tử độc lập, trên đồ thị chúng là
các đỉnh cô lập (không có cung đi vào và cung đi ra khỏi nó). Một phần tử x thuộc tập S 0
nào đó thỏa mãn {x<y: } là đỉnh không có cung vào, nó ở bên trái nhất so với các
phần tử khác thuộc S0, ta gọi nó là phần tử có bậc vào bằng 0( sau đây gọi tắt là phần tử
bậc 0). Các phần tử độc lập cũng qui ước coi là các phần tử bậc 0.
b.Cách đặt thứ tự bộ phận vào thứ tự tuyến tính(sắp xếp tô-pô)
+Tìm một phần tử bậc 0 nạp vào stack
+ Thực hiện vòng lặp: trong khi stack chưa rỗng thì :
-Lấy một phần tử I ở đỉnh stack, đánh dấu đã xét I, xác nhận mảng một chiều T có
thêm phần tử mới là i
-Xóa các cung đi ra từ i
-Nạp phần tử bậc 0 mới vào stack
+Nếu số lượng phần tử trong mảng T bằng N thì dãy T[1], T[2],…, T[N] là một
cách sắp N phần tử đã cho theo thứ tự tuyến tính
Ví dụ :
Bài tập 1: Cho N công việc, mỗi công việc i phải làm trước một số công việc nào
đó trong N công việc này. Hãy xếp lịch thực hiện đủ N công việc
Dữ liệu vào cho trong file XEPLICH.INP gồm :
-Dòng đầu là số nguyên dương N. Các đòng sau thể hiện quan hệ thứ tự bộ phận :
đầu dòng là số I, các số tiếp theo là ji1, ji2,…, jis .
Kết quả ghi ra file XEPLICH.OUT một dòng N số hiệu các công việc được lần
lượt thực hiện
Ví dụ:
XEPLICH.INP XEPLICH.OUT
10 1 2 7 9 4 6 3 5 8 10
123
2 4 10
35
468
58
63
795
9 4 10

4.Phương pháp duyệt có đặt cận: Trong phương pháp này nếu đặt cận hợp lí với
thời gian cho phép thì lời giải thường đạt kết quả tương đối tối ưu. Vài lưu ý khi áp dụng
-Thường sắp tăng hoặc giảm bộ dữ liệu theo một khóa giá trị nào đó trước khi duyệt
-Tìm cận là điều kiện cận để khi duyệt tránh đi vào các nhánh không dẫn đến đích.
Cận càng chặt chẽ càng nhanh chóng tới kết quả, nhưng cần phân tích kĩ để tránh trường
hợp bị mất nghiệm do đặt cận chặt chẽ quá mức hợp lí
3
Bài tập : Cho N công việc, với mỗi công việc cho biết tiền công thu được khi thực
hiện công việc nay, thời gian để hoàn thành, thời điểm cuối phải kết thúc. Hãy xếp lịch
thực hiện sao cho thu được nhiều tiền công nhất
Dữ liệu vào cho trong file MAXTIEN.INP gồm :
-Dòng đầu là số nguyên dương N
-N dòng sau, dòng i=1 ghi 3 số tg,tdkt,gt tương ứng là thời gian cần thiết để hoàn
thành, thời điểm bắt buộc phải xong, giá trị tiền công của công việc i
Kết quả ghi ra file MAXTIEN.OUT gồm :
-Dòng đầu tiên là tổng giá trị tiền công.
-Các dòng tiếp theo mối dòng ghi 4 số : I,T 1, T2, gt tương ứng là số hiệu, thời điểm
bắt đầu, thời điểm kết thúc, giá trị công việc được chọn.
Ví dụ :
MAXTIEN.INP MAXTIEN.OUT
10 329
1 4 89 5 0 1 25
5 5 86 1 1 2 89
4 11 83 3 2 6 83
5 7 84 6 6 9 61
1 2 25 10 9 14 71
3 11 61
6 11 33
4 7 28
3 10 1
5 14 71

Hướng dẫn :
-Sắp xếp tăng bộ dữ liệu theo khóa là thời điểm cuối cùng phải kết thúc công việc
-Đặt cận : Tổng tiền k công việc+giá trị tối đa công việc còn lại > tổng tiền của
phướng án tốt nhất đã có.
Chú ý rằng khi thử chọn công việc k thì có thể dẫn tới sự kiện hàng loạt công việc
khác bọ loại vì việc hoàn thành công việc k sẽ đẩy lùi thời điểm có thể bắt đầu thực hiện
các công việc này dẫn đến đẩy lùi thời điểm hoàn thành chúng và do đó có thể làm cho
một số công việc không xong trước thời hạn kết thúc đã qui định cho nó. Ngược lại nếu
không chọn công việc k nữa thì lại tạo điều kiện có thể thực hiện những công việc bị loại
do chọn k. Ngoài ra, một cận thứ hai là :
Thời điểm bắt đầu công việc k+thời gian làm công việc k ≤ Thời điểm kết thúc công
việc k
Ví dụ:
Bài xếp vali:
Cho một va li có thể chứa W đơn vị trọng lượng. Có N đồ vật (số lượng mỗi đồ vật
không hạn chế), đồ vật có trọng lượng A[i] và có giá trị C[i]. Hỏi nên chọn mỗi loại đồ
vật bao nhiêu xếp vào va li để tổng giá trị của va li là lớn nhất?

4
Dữ liệu vào cho trong file VALI.INP gồm:
-Dòng 1 chứa hai số N và W
-N dòng tiếp theo : dòng i+1 ghi hai số : A[i], C[i] (i=1,2,…,N), hai số cách nhau
ít nhất một dấu cách
Kết quả ghi ra file văn bản VALI.OUT theo qui cách sau :
-Dòng thứ nhất là tổng giá trị lớn nhất của va li
-Các dòng tiếp theo mỗi dòng ghi hai số: số i (số hiệu vật được chọn) và số x (số
lượng chọn vật i)
Ví dụ :
VALI.INP VALI.OUT
4 100 110
50 50 21
19 20 31
80 90
21 25

5. Phương pháp qui hoạch động:


Bài cho thuê máy :
Tại thời điểm 0, ông chủ cho thuê máy tính nhận được đơn đặt hàng thuê sử dụng
máy của N khách hàng. Các khách hàng được đánh số từ 1 đến N, khách hàng i cần sử
dụng máy từ thới điểm d i đến thời điểm ci ( di và ci là các số nguyên và 0< d i < ci ≤
1000000000) và trả tiền sử dụng máy là pi (pi là số nguyên, 0<pi≤10000000). Hãy xác
định xem ông chủ cần nhận phục vụ những khách hàng nào sao cho khoảng thời gian sử
dụng máy tính của hai khách hàng được nhận phục vụ bất kì không giao nhau và tổng
tiền thu được từ phục vụ lf lớn nhất.
Dữ liệu vào cho trong file RENTING.INP gồm :
-Dòng đầu ghi số N ( 0<N≤1000)
-Dòng thứ I trong N dòng tiếp theo ghi 3 số d i, ci,pi cách nhau bởi dấu cách, i=1,2,
…,N
Kết quả ghi ra file RENTING.OUT gồm :
-Dòng đầu tiên ghi hai số nguyên dương theo thứ tự là số lượng khách hàng nhận
được phục vụ và tổng số tiền thu được
-Dòng tiếp theo ghi chỉ số của khách hàng được phục vụ
Ví dụ :
RENTING.INP RENTING.OUT RENTING.INP RENTING.OUT
3 2 180 4 2 1100
150 500 150 23 400 821 800 24
1 200 100 200 513 500
400 800 80 100 325 200
600 900 600

5
II. Bài tập
Bài 1: Lập lịch ưu tiên đúng hạn
Đề bài:
Có n công việc đánh số từ 1 đến n và một máy để thực hiện chúng. Biết:
- p1 là thời gian cần thiết để hoàn thành công việc j.
- di là thời hạn hoàn thành công việc i.
Mỗi công việc cần được thực hiện liên tục từ lúc bắt đầu cho tới khi kết thúc, không cho
phép ngắt quãng. Khoảng thời gian thực hiện hai công việc bất kỳ chỉ được có nhiều nhất
1 điểm chung. Giả sử C1 là thời điểm hoàn thành trễ hạn, còn nếu Ci < di thì ta nói công
việc i được hoàn thành đúng hạn.

Yêu cầu: Tìm trình tự thực hiện các công việc sao cho số công việc được hoàn thành
đúng hạn là lớn nhất.

Dữ liệu: Vào từ file văn bản LICHDH.INP:


- Dòng đầu tiên chứa số nguyên dương n (0 < n < 100)
- Dòng thứ 2 chứa n số nguyên dương p1, p2, …pn.
- Dòng thứ 3 chứa n số nguyên dương d1, d2, …dn.

Kết quả: Ghi ra file văn bản LICHDH.OUT.


- Dòng đầu tiên ghi số lượng công việc được hoàn thành đúng hạn theo trình tự thu được.
- Dòng tiếp theo ghi trình tự thực hiện các công việc đã cho.

Ví dụ :

LICHDH.INP LICHDH.OUT
5 4
4 1 2 3 1 23451
5 6 6 7 8

Hướng Dẫn:
Sắp Xếp theo thứ tự tăng dần của D[i]
Chúng ta xét như sau:
Đầu tiên cho:
time:=0;
+ Lấy thực hiện các việc theo trật tự tăng dần. Nhưng đến công việc nào mà Thời gian
thực hiện nó sẽ vượt qua giới hạn D[i] của nó thì:
Tìm các công việc đã được xếp trước nó, công việc nào được thay thế bởi công việc này
nếu thười gian thực hiện xong nó là nhỏ nhất.

6
Bài lập lịch có thưởng phạt :
Có N công việc được đánh số từ 1 đến N cần được bố trí thực hiện trên một máy.
Biết
-PI là thời gian cần thiết làm công việc i
-di là thời điểm cuối cùng phải hoàn thành công việc i
-hi là hệ số thương phạt của công việc i
Mỗi công việc cần được thực hiện liên tục từ lúc bắt đầu tới khi kết thúc, không cho
phép ngắt quãng. Thời gian chuyển từ công việc này sang công việc khác là không đáng
kể. Giả sử ti là thời điểm hoàn thành công việc I, khi đó giá trị thưởng phạt của công việc
I là hix(di-ti). Biết thời điểm có thể thực hiện các công việc là 0, hãy tìm trình tự thực hiện
N công việc sao cho tổng giá trị thưởng phạt của các công việc là lớn nhất.
Dữ liệu vào cho trong file THUONGPHAT.INP có cấu trúc như sau :
-Dòng đầu ghi số nguyên dương N(N<2001)
-Dòng thứ hai ghi N số nguyên dương p1,p2,…,pN
-Dòng thứ 3 ghi N số nguyên dương d1,d2,…,dN
-Dòng thứ 4 ghi N số nguyên dương h1,h2,…,hN
Kết quả ghi ra file THUONGPHAT.OUT có cấu trúc như sau :
-Dòng đầu ghi tổng giá trị thưởng phạt tìm được
-Dòng thứ hai ghi N số (hoán vị của N số nguyên dương đầu tiên) là trình tự thực
hiện N công việc
Ví dụ :
THUONGPHAT.I THUONGPHAT.OU
NP T
5 6
2 2 3 4 3 25314
3 2 10 11 9
1 2 2 1 3

THUONGPHAT.I THUONGPHAT.OU
NP T
4 -17
1234 2134
3213
1212

7
Bài sửa đường- Đề thi HSGQG Bảng A- năm 2000-2001
Hệ thống giao thông trong một thành phố bao gồm N nút giao thông và M đoạn
thường phố hai chiều, mỗi đoạn nối hai nút giao thông. Các nút giao thông được đánh số
1 đến N và các đoạn đường phố được đánh số từ 1 đến M. Giữa hai nút giao thông có
không quá một đoạn đườngn nối chúng. Hệ thống giao thông bảo đảm sự đi lại giữa hai
nút giao thông bất kì. Ban quản lí hệ thống giao thông được giao nhiệm vụ thực hiện dự
án nâng cấp tất cả các đoạn đường phố. Mọi sự đi lại theo đoạn đường phố sẽ bị cấm
trong suốt thời gian thời gian thực hiện thi công nâng cấp nó. Thời gian cần thiết để
hoàn thành một ngày Ban quản lí có thể tổ chức thực hiện việc thi công nâng cấp không
quá k đoạn đường phố. Để đảm bảo sự đi lại giữa hai nút giao thông bất kì trong suốt
thời gian thực hiện dự án, Ban quản lí cần tìm lịch thi công các đoạn đường một cách
hợp lí.
Yêu cầu : Tìm lịch thi công nâng cấp tất cả các đoạn đường phố đảm bảo sự đi lại
giữa hai nút giao thông bất kì trong suốt quá trình thực hiện dự án, đồng thời sao cho dự
án được hoàn thành sau ít ngày nhất.
Dữ liệu vào cho trong file SUADUONG.INP gồm :
-Dòng đầu chứa 3 số nguyên dương N, M, K (2≤N≤500, 1≤M≤20000, 1<K≤N)
-Dòng thứ I trong số M dòng tiếp theo chứa cặp số hiệu của hai nút giao thông
tương ứng là hai đầu mút của đoạn đường thứ i . Các số trên cùng một dòng được ghi
cách nhau ít nhất một dấu cách
Kết quả ghi ra file SUADUONG.OUT gồm :
-Dòng đầu tiên ghi số P là số ngày cần thực hiện theo lịch thi công tìm được (qui
ước ghi P=-1 nếu không tìm được lịch thỏa mãn yêu cầu đặt ra)
-Nếu tìm được lịch thì dòng thứ i trong M dòng tiếp theo ghi chỉ số của ngày thực
hiện thi công nâng cấp đoạn đường thứ i. Các ngày trong lịch thực hiện dự án được
đánh số từ 1 đến P theo đúng trình tự thời gian
Ví dụ :
SUADUONG.INP SUADUONG.OUT
5 19 5 2
12 1
23 1
34 1
45 1
51 1
13 2
24 2
35 2
41 2
52 2

You might also like