Phân công nhiệm vụ coi thi

Trạng thái
Không mở trả lời sau này.

huutinh85

Yêu THVBA nhất
Hiện nay việc bôc thăm thủ công cán bộ coi thi tại các kì thi mất nhiều thời gian( vì bốc ngẫu nhiên nên có thể bị trùng- không thỏa mãn yêu cầu) . Vì vậy em mạo muội đưa vấn đề này lên đây mong các bác cao nhân có giải pháp nào tối ưu..
1- thường thì một hội đồng thi huy động 3 đơn vị tham gia
2- Yêu cầu khi bốc thăm đảm bảo:
a- 1 giám thị không canh lại phòng đã canh trước đó
b- 2 giám thị cùng 1 đơn vị không canh cùng nhau 1 phòng ( việc làm giám thị 1 hay 2 thì thường luân phiên đổi nhau, vd: môn 1 làm GT1; môn 2 làm GT2, môn 3 quay lại làm GT1..)
c- thường các hội đồng cố định bộ phận Giám thị hành lang (GTHL) ( chỉ thay đổi phòng giám sát. vd Môn 1 giám sát từ P1 đến P3, Môn 2 : P4-6....) và GT văn phòng ( GTVP thường không bốc thăm,cố định)
Việc phân công chỉ được tiến hành trước khi thi môn đó 30 phút và công khai, không được phân công trước.
vì vậy em nghĩ sau khi phân công môn gác môn thứ 1 thì lưu lại, khi phân công môn tiếp theo thì phải tự động kiểm tra dữ liệu của môn trước, nếu không trùng theo yêu cầu thì mới chấp nhận phương án và lưu lại.
Bác nào có cách tối ưu nhất không ạ? em có làm file dữ liệu phía dưới
- sao em không add đươc file đính kèm vậy hả các bác?
tuhocvba.net update:
Link file data:
 

tuhocvba

Administrator
Thành viên BQT
Chúng ta có ba bài toán. Giải quyết từng bài toán một.
Trước tiên, nếu bạn gặp khó khăn trong vấn đề gửi file, bạn có thể nén lại và gửi vào gmail cho chúng mình nhé.
Đầu tiên bài toán 1: Phân chia giám thị coi thi các phòng.
Bạn cần đăng nhập để thấy hình ảnh

Bài toán 2: Giám thị hành lang (sẽ bàn sau)
Bài toán 3: Giám thị văn phòng (sẽ bàn sau)
 

Euler

Administrator
Thành viên BQT
vậy là em up file lên mediafileroifcopy link sang đây phải không ad
cảm ơn ad
Chúng mình nhận được file rồi nhé. Có lẽ sẽ mất thêm vài bài viết nữa để trao đổi với bạn nhằm làm rõ vấn đề. Khi làm rõ vấn đề rồi thì code nhanh thôi.
Cho mình hỏi:
1. Tại một thời điểm chỉ có một môn thi thôi đúng không?
2. Output có yêu cầu hình thức trông như thế nào không, hay bạn cho chúng mình thiết kế và đề xuất cho bạn sau.
Khi sắp xếp giám thị, sẽ phải xếp hết số phòng thi, mình hiểu như vậy đúng không?
Hiện tại yêu cầu là cứ 2 giám thị coi 1 phòng thi. Giả thiết số phòng thi là 18. Nhưng chỉ có 20 giám thị. Thực tế có trường hợp như vậy hay không? Hay bạn muốn code cũng xử lý cả những trường hợp ngoại lệ như thế này (ra thông báo lỗi).
 

huutinh85

Yêu THVBA nhất
Chúng mình nhận được file rồi nhé. Có lẽ sẽ mất thêm vài bài viết nữa để trao đổi với bạn nhằm làm rõ vấn đề. Khi làm rõ vấn đề rồi thì code nhanh thôi.
Cho mình hỏi:
1. Tại một thời điểm chỉ có một môn thi thôi đúng không?
2. Output có yêu cầu hình thức trông như thế nào không, hay bạn cho chúng mình thiết kế và đề xuất cho bạn sau.
Khi sắp xếp giám thị, sẽ phải xếp hết số phòng thi, mình hiểu như vậy đúng không?
Hiện tại yêu cầu là cứ 2 giám thị coi 1 phòng thi. Giả thiết số phòng thi là 18. Nhưng chỉ có 20 giám thị. Thực tế có trường hợp như vậy hay không? Hay bạn muốn code cũng xử lý cả những trường hợp ngoại lệ như thế này (ra thông báo lỗi).
dạ cảm ơn các bác đã quan tâm chủ đề này. Em nghĩ đây là chủ đề mà có lẽ ai từng làm thư kí hội đồng đều gặp phải. Nên em sẽ cố gắng mô tả lại thật chi tiết để tiện lợi cho các bác xây dựng giải pháp giúp em:
1- bắt buộc 2 gt/p; nhưng để đề phòng có gt bị sự cố trong làm việc nên sl GT có thể > 2 lần số phòng, sau phân công ngẫu nhiên số gt dư sẽ dự bị
2- STT của mỗi gt cố định và khác nhau nên có thể dùng làm mã số gt ( nên việc 2 gt trùng tên không ảnh hưởng gì )
3- yêu cầu phân công:
a- mỗi gt chỉ gác 1lần/1phòng ( kể cả làm gt1 hay gt2 - không trùng phòng; 1 giám thi có thể làm gt 1 ở môn 1, môn 2 làm gt 2... nhưng tránh trường hợp chỉ làm 1 nhiệm vụ mất công bằng giữa các giám thị)
c - 2 gt chỉ được gác cùng nhau 1 lần ( không trùng cặp )
b- 2 gt cùng 1 đơn vị không gác chung 1 phòng ( không trùng đơn vị)
d- GT gác thi tách biệt với gthl, gtvp nên phân công mỗi bộ phận khác nhau, không liên quan tới nhau
4- quá trình tiến hành và hình thức tiến hành
a- các môn thi diễn ra không đồng thời, hết môn 1 đến môn 2 , môn 3...( nên STT môn thi có thể xem là mã môn thi )
b- Việc phân công diễn ra: em VD: sáng nay thi môn 1, thì chon " pc môn 1" CODE CHẠY khi có phương án thoả mãn thì sẽ xuất hiện cảnh báo " thoả mãn " và nhấn " lưu pc " sẽ xuất dữ liệu pc thành sheet " pc - 1"( các gt dự bị - không được pc môn 1 nhưng có thể được phân công ở môn tiếp theo được tô màu vàng , mỗi môn sẽ có gt dự bị ngẫu nhiên không cố định); chiều nay thi môn 2, chọn " PC MON 2" thì sẽ đối chiếu với dữ liệu PC-1 để đảm bảo yêu cầu. Khi không có phương án thoả mãn thì sẽ xuất hiện cảnh báo " không thoả mãn do trùng .... " và yêu cầu " pc lai " nhưng không được thay đổi dữ liệu của PC MÔN TRƯỚC ( hoặc chạy đến khi nào tìm ra phương án thoả mãn thì cho lưu thành "pc-2". các buổi thi còn lại làm tương tự khi đến môn 3 thì lại đối chiếu với môn 1 và môn 2... VÌ LÍ DO BẢO MẬT , CÔNG BẰNG NÊN KHÔNG THỂ PHÂN CÔNG TRƯỚC 1 LÚC TẤT CẢ CÁC MÔN THI.
Trên đây em chỉ demo 1 hội đồng thi có 3 đơn vị tham gia, có 18 phòng thi, 9 môn thi, 39 giám thị gác thi, thưc tế số lượng này thay đổi ở từng hội đồng khác nhau. Vì vậy nếu các bác xây dựng có thể tuỳ biến được các thông số này thì tốt quá. Trong thực tế làm việc mỗi lần thi thư kí hội đồng bốc thăm ngẫu nhiên thì Môn 1 êm xuôi, không trùng. Từ Môn 2 trở đi có thể có trùng , mất nhiều thời gian để bốc thăm lại. Nên em mạo muội đưa lên diễn đàn nhờ các bác giúp đỡ. Có thể phần miêu tả chi tiết của em hơi quá đáng nhưng đây là việc mà năm nào thi cử các thư kí hội đồng cũng phải làm và ở tất cả các hội đồng thi. Ai đã từng làm thư ki hội đồng thì cũng vất vả với công tác này. Trên đây là “ ngu kiến “ của em, nếu các bác có giải pháp nào khác miến là đáp ứng được 3 yêu cầu ( không trùng phòng, không trùng đơn vị, không trùng cặp) thì mong các bác góp ý , chia sẻ.!.Cảm ơn các bác!. Em xin up lại file em có điều chỉnh.
 
Sửa lần cuối:

tuhocvba

Administrator
Thành viên BQT
Cảm ơn bạn. Đề bài đã rất rõ ràng rồi. Tuy nhiên cho phép mình hỏi thêm một câu có được không ạ?

-Giả thiết giám thị A coi thi môn 1 ở P1. Coi thi môn 2 ở P2. Vậy ở môn thi thứ 3, có thể xếp giám thị A này coi ở P1 hay nhất định phải rời sang phòng khác?

Ngoài ra, nếu có chú ý gì đặc biệt, bạn có thể dùng màu tô chữ. Chú ý tránh dùng màu đỏ.

Không có gì to tát nhưng nếu có thể, bạn chỉ nên viết hoa các chữ cái đầu dòng hoặc một vài từ bạn cho là quan trọng hơn, mọi người sẽ cảm thấy hơi mỏi mắt nếu đọc một hàng dài các ký tự viết hoa.
 

huutinh85

Yêu THVBA nhất
Cảm ơn bạn. Đề bài đã rất rõ ràng rồi. Tuy nhiên cho phép mình hỏi thêm một câu có được không ạ?

-Giả thiết giám thị A coi thi môn 1 ở P1. Coi thi môn 2 ở P2. Vậy ở môn thi thứ 3, có thể xếp giám thị A này coi ở P1 hay nhất định phải rời sang phòng khác?

Ngoài ra, nếu có chú ý gì đặc biệt, bạn có thể dùng màu tô chữ. Chú ý tránh dùng màu đỏ.

Không có gì to tát nhưng nếu có thể, bạn chỉ nên viết hoa các chữ cái đầu dòng hoặc một vài từ bạn cho là quan trọng hơn, mọi người sẽ cảm thấy hơi mỏi mắt nếu đọc một hàng dài các ký tự viết hoa.
cảm ơn bác nhiều e sẽ rút kinh nghiệm. Khi giám thị A đã gác ở P1-M1, P2-M2, thì các môn còn lại phải rời các phòng này bác ạ. mỗi giám thị chỉ gác ở 1 phòng 1 lần duy nhất trong suốt đợt thi. Vì vậy nên khi PC ở môn mới là phải đối chiếu dữ liệu với môn cũ đã gác đó bác.
 

huutinh85

Yêu THVBA nhất
em có suy nghĩ là có thể thiết lập 3 biến:
1- Mã giám thi ( MsGT)
3- Mã phòng thi ( MsPT)
4- Mã môn thi (MsM)
Vậy bài toán có thể quy về tìm giải pháp thiết lập được cặp ( MsGT-MsPT-MsM) trong đó có : MsGT-MsGT ( trùng cặp ); MsGT-MsPT ( trùng phòng) ; MsGT-MsGT ( trùng đơn vị ) không xuất hiện quá 1 lần
em suy nghĩ theo hướng đó không biết có đúng không các bác!
 

Euler

Administrator
Thành viên BQT
Bài toán số 1, yêu cầu bạn nêu là rõ ràng rồi. Cảm ơn bạn.
Một vài suy nghĩ nháp của mình, cuối tuần có thời gian, mình sẽ bắt tay vào code cho bạn.
Số lượng người trong một phòng thi là: 2
Số lượng phòng thi là p
→Số lượng người dùng cho một môn thi: 2*p

Vậy tổng số người có trong danh sách mà nhỏ hơn 2*p thì chương rình báo lỗi.

Số môn thi là m
Mỗi môn thi, một giám thị coi ở một phòng khác với các lần trước. Số môn thi m > tổng số người thì chương trình báo lỗi.
Việc sắp xếp dữ liệu như nào, sẽ quyết định chương trình được code dễ dàng hay không, hiện tại mình chưa xem được file của bạn mới post lên, tối về mình sẽ xem, tạm thời thì mình lý giải yêu cầu của bạn và nháp, đây chưa phải là ý tưởng sắp xếp dữ liệu cuối cùng để code.
Bạn cần đăng nhập để thấy đính kèm

Bạn cần đăng nhập để thấy đính kèm
 

vbano1

SMod
Thành viên BQT
1. Đề bài này cần làm rõ hơn về số lượng người mà mỗi đơn vị cung cấp cho hội đồng.
Giả định: THPT A đóng góp 14 người. THPT B đóng góp 2 người. THPT C đóng góp 2 người. Hội đồng thi có 8 phòng thi.
Như vậy sẽ không đảm bảo được 2 người cùng coi thi ở khác đơn vị (THPT).
Không biết thực tế, qui định này như thế nào.
Tuy nhiên yêu cầu cần phải có:
Giả sử có d đơn vị (trường hợp bạn đưa ra d = 3). Số phòng thi là p.
Như vậy tổng số người của d-1 đơn vị bất kỳ phải >=p.
Trong trường hợp của bạn: Có 3 đơn vị và 18 phòng thi, thì tức là 2 đơn vị bất kỳ có tổng số người >=18.
Thật vậy: Giả sử như THPT B, THPT C có tổng số người nhỏ hơn 18. Vậy thì sẽ tồn tại một phòng thi có hai người THPT A coi thi.
2. Thuật toán tôi đưa ra dựa vào cách nghĩ từ đây:
Tôi giả thiết rằng bạn đảm bảo được các yếu tố sau để bài toán thực thi được:
Tổng số người >= 2p trong đó p là số phòng thi. Trường hợp có 18 phòng thi thì số người phải tối thiểu 36 người.
Tổng số người của d-1 đơn vị bất kỳ luôn >= p. Trường hợp của bạn, 2 đơn vị bất kỳ có tổng số người >=18. Hãy cho mình biết thực tế như nào nhé.
Tôi đề xuất chương trình lập tức báo lỗi khi phát hiện ra điều này để khỏi phải xếp nhóm cho mất thời gian.
Cách nghĩ:
Thứ nhất, tôi đồng ý với bạn về việc đặt mã cho Giáo viên, cho phòng thi.
Thứ hai, việc xét tránh trùng là đương nhiên. Tuy nhiên nếu dùng hàm ngẫu nhiên bên trong vòng lặp Do Loop, có khả năng dẫn tới treo máy tính. Cũng như bạn đã tính đến trường hợp chạy ngẫu nhiên dẫn tới không thỏa mãn.
Tôi muốn: Giảm thiểu số lần chạy ngẫu nhiên. Tốc độ chương trình nhanh. Và đưa ra được đáp án thỏa mãn.


Đầu tiên tôi nghĩ như sau:
Bạn cần đăng nhập để thấy đính kèm

Từ thành viên đầu tiên, ở đây là GV1, tôi cho chạy theo đường chéo cho tới khi nào hết số phòng (=18). Như vậy tôi điền xong chức danh GT1.
Chạy xong lượt 1, tôi chạy tiếp lượt 2 để điền chức danh GT2. Như vậy đảm bảo không có giáo viên nào cùng trường mà xếp cùng phòng.

Trong trường hợp môn thi thứ 2 trở đi, tôi thực hiện bước nhảy +1 với chức danh GT1, và +2 với chức danh GT2.
Ví dụ GV1, ở môn thi 1 coi P1, nhưng ở môn 2 thì coi P2. Thực hiện bước nhảy phòng là +1
Tương tự: GV19 coi thi P1, nhưng ở môn 2, thì coi P3. Thực hiện bước nhảy phòng là + 2.
Tất nhiên, theo yêu cầu chức danh không lặp lại, tôi chỉ việc đảo trạng thái chức danh.
Bạn cần đăng nhập để thấy đính kèm

Bây giờ vấn đề đặt ra là, tính ngẫu nhiên không còn nữa. Như thế thì cũng chẳng cần lên danh sách làm gì. Người ta sẽ đoán được là họ sẽ coi thi tiếp ở phòng nào.

Do đó, tôi đặt yêu cầu đối với GV1 phải luôn luôn sử dụng hàm ngẫu nhiên cho anh ta. Tức là GV1 không thể đoán được anh ta ở phòng nào.
Ví dụ ở môn thi lần thứ 3 nhiều người đoán anh ta coi ở P3. Tôi cho thực hiện ngẫu nhiên đặt phòng cho anh ta.
Anh ta rơi vào phòng 8. (Tất nhiên có kiểm tra trước đó anh ta đã coi ở phòng nào, để hủy những phòng này ra khỏi danh sách ngẫu nhiên).
Bạn cần đăng nhập để thấy đính kèm

Theo qui tắc đường chéo, ta lập danh sách:
Bạn cần đăng nhập để thấy đính kèm

Như vậy bạn thấy rằng, chúng ta chỉ cần vị trí của GV1. Còn các giáo viên phía sau sẽ luân chuyển theo anh ta theo qui tắc đường chéo như trên.
Tóm lại, nếu có thể, bạn hãy cung cấp thêm dữ kiện: Qui định về việc đóng góp người của các đơn vị là như thế nào? Mỗi đơn vị cung cấp tối thiểu bao nhiêu người, tối đa bao nhiêu người?
Nói là tổng số giám thị nhiều hơn 2p để dự trù ốm đau, bị kỷ luật. Nhưng cụ thể là 2.5p hay là bao nhiêu?
 

giaiphapvba

Administrator
Thành viên BQT
Hướng đi theo đường chéo như trên, đúng là cách nghĩ sáng sủa, dễ hiểu, dễ làm.
Đặt tình huống, khi số phòng ít đi.
Bạn cần đăng nhập để thấy hình ảnh

Như vậy những người cùng đơn vị sẽ va vào nhau ở một số phòng thi. Vì vậy cần lấy ra số người vừa đủ.
Lý tưởng nhất là mỗi đơn vị cung cấp số người là 2p/d. Trong trường hợp p =8, d = 3 thì mỗi đơn vị cung cấp số người là 16/3, tức là khoảng 6 người.
Bạn cần đăng nhập để thấy hình ảnh

Như vậy không còn tình trạng va vào nhau nữa.
Tất nhiên, điều kiện tổng quát vẫn là số người của (d-1) đơn vị bất kỳ luôn >=p và tổng số người của d đơn vị luôn >=2p.
Chương trình có thể nhặt ra số người theo logic:
Nhặt từ đơn vị ít người cho tới khi đủ 2p/3. Nếu không đủ thì dừng.
Nhặt tiếp từ đơn vị kế theo cho tới khi tổng số người đã nhặt ra đủ 4p/3. Nếu không đủ thì dừng.
Nhặt tiếp ở đơn vị nhiều người nhất. Cho tới khi tổng số người đã nhặt ra đủ 2p thì dừng.
Rồi theo thuật toán trên là sắp xếp đạt yêu cầu đặt ra.
Tuy nhiên, về logic số môn học, cần tính toán lại. Nếu thực tế, số phòng thi vượt quá xa số môn học, thì không bàn, đây là điều kiện lý tưởng.
Nhưng ở trường hợp ví dụ ở trên, chúng ta có 8 phòng thi, nhưng có tới 9 môn thi. Tức là một người nào đó phải được loại ra, cho người mới vào thay thế. Vì nếu không, họ coi đủ 8 phòng thi ở 8 môn, tới môn thứ 9, nếu họ vẫn còn ở đó, thì có nghĩa là vi phạm: Một người chỉ coi ở một phòng thi một lần.
Tổng quát, chúng ta cần tìm hiểu logic về mối quan hệ liên quan tới số môn học. Đối với các vùng sâu vùng xa, số học sinh ít, cũng có nghĩa là số phòng thi ít, tuy nhiên số môn thi thì gần như không đổi là 9 môn.
Tuy nhiên nếu tác giả topic này khẳng định các địa điểm thi luôn có số phòng thi nhiều hơn số môn thi, thì điều kiện một người coi một phòng thi và không quay lại phòng thi đó nữa, sẽ là điều không cần phải lo lắng. Chưa đi hết các phòng thì đã hết số môn thi rồi.
Ngoài ra, cần làm rõ điều kiện thực tế, có qui định nào yêu cầu các đơn vị phải cung cấp tối thiểu và tối đa bao nhiêu người không?
 

tuhocvba

Administrator
Thành viên BQT
1. Hai giám thị đến từ cùng một trường không được coi thi cùng phòng.
2. Một giám thị không coi lại phòng thi mà mình đã từng coi.
3. Chức danh giám thị có Giám Thị 1 (GT1) và Giám Thị 2 (GT2). Mong muốn nếu lần trước làm GT1 thì lần sau đổi chức danh GT2. Trong phòng thi chỉ có hai giám thị, GT1 và GT2.
4. Một hội đồng thi có 3 trường tới tham gia coi thi.
5. Số môn thi là 9 môn.
Tổng quát: số phòng thi là p.
Số môn thi là m.
Số đơn vị (trường tham gia coi thi): d
Tổng số giám thị tới từ các đơn vị: n
Để đảm bảo luôn có 2 giám thị trong một phòng thi thì n>=2p.
Để đảm bảo luôn có hai giám thị tới từ các đơn vị khác nhau coi thi một phòng thi: Tổng số người của (d-1) đơn vị bất kỳ luôn >=p.
Để đảm bảo một người chỉ coi thi một phòng thi và không quay lại phòng ấy nữa thì :
Số phòng thi >= số môn thi. (p >=m)
Hoặc:
Trường hợp p<m thì phải có người thay thế cho những người đã coi đủ p môn thi ở p phòng thi. Như vậy ta còn m-p môn thi. Tức là những người chưa coi thi lần nào sau khi p môn thi đã diễn ra cần đảm bảo là: >= (m-p)*2
Tức là n >= 2m. (Trường hợp p<m).
 

huutinh85

Yêu THVBA nhất
1. Đề bài này cần làm rõ hơn về số lượng người mà mỗi đơn vị cung cấp cho hội đồng.
Giả định: THPT A đóng góp 14 người. THPT B đóng góp 2 người. THPT C đóng góp 2 người. Hội đồng thi có 8 phòng thi.
Như vậy sẽ không đảm bảo được 2 người cùng coi thi ở khác đơn vị (THPT).
Không biết thực tế, qui định này như thế nào.
Tuy nhiên yêu cầu cần phải có:
Giả sử có d đơn vị (trường hợp bạn đưa ra d = 3). Số phòng thi là p.
Như vậy tổng số người của d-1 đơn vị bất kỳ phải >=p.
Trong trường hợp của bạn: Có 3 đơn vị và 18 phòng thi, thì tức là 2 đơn vị bất kỳ có tổng số người >=18.
Thật vậy: Giả sử như THPT B, THPT C có tổng số người nhỏ hơn 18. Vậy thì sẽ tồn tại một phòng thi có hai người THPT A coi thi.
2. Thuật toán tôi đưa ra dựa vào cách nghĩ từ đây:
Tôi giả thiết rằng bạn đảm bảo được các yếu tố sau để bài toán thực thi được:
Tổng số người >= 2p trong đó p là số phòng thi. Trường hợp có 18 phòng thi thì số người phải tối thiểu 36 người.
Tổng số người của d-1 đơn vị bất kỳ luôn >= p. Trường hợp của bạn, 2 đơn vị bất kỳ có tổng số người >=18. Hãy cho mình biết thực tế như nào nhé.
Tôi đề xuất chương trình lập tức báo lỗi khi phát hiện ra điều này để khỏi phải xếp nhóm cho mất thời gian.
Cách nghĩ:
Thứ nhất, tôi đồng ý với bạn về việc đặt mã cho Giáo viên, cho phòng thi.
Thứ hai, việc xét tránh trùng là đương nhiên. Tuy nhiên nếu dùng hàm ngẫu nhiên bên trong vòng lặp Do Loop, có khả năng dẫn tới treo máy tính. Cũng như bạn đã tính đến trường hợp chạy ngẫu nhiên dẫn tới không thỏa mãn.
Tôi muốn: Giảm thiểu số lần chạy ngẫu nhiên. Tốc độ chương trình nhanh. Và đưa ra được đáp án thỏa mãn.


Đầu tiên tôi nghĩ như sau:
Bạn cần đăng nhập để thấy đính kèm

Từ thành viên đầu tiên, ở đây là GV1, tôi cho chạy theo đường chéo cho tới khi nào hết số phòng (=18). Như vậy tôi điền xong chức danh GT1.
Chạy xong lượt 1, tôi chạy tiếp lượt 2 để điền chức danh GT2. Như vậy đảm bảo không có giáo viên nào cùng trường mà xếp cùng phòng.

Trong trường hợp môn thi thứ 2 trở đi, tôi thực hiện bước nhảy +1 với chức danh GT1, và +2 với chức danh GT2.
Ví dụ GV1, ở môn thi 1 coi P1, nhưng ở môn 2 thì coi P2. Thực hiện bước nhảy phòng là +1
Tương tự: GV19 coi thi P1, nhưng ở môn 2, thì coi P3. Thực hiện bước nhảy phòng là + 2.
Tất nhiên, theo yêu cầu chức danh không lặp lại, tôi chỉ việc đảo trạng thái chức danh.
Bạn cần đăng nhập để thấy đính kèm

Bây giờ vấn đề đặt ra là, tính ngẫu nhiên không còn nữa. Như thế thì cũng chẳng cần lên danh sách làm gì. Người ta sẽ đoán được là họ sẽ coi thi tiếp ở phòng nào.

Do đó, tôi đặt yêu cầu đối với GV1 phải luôn luôn sử dụng hàm ngẫu nhiên cho anh ta. Tức là GV1 không thể đoán được anh ta ở phòng nào.
Ví dụ ở môn thi lần thứ 3 nhiều người đoán anh ta coi ở P3. Tôi cho thực hiện ngẫu nhiên đặt phòng cho anh ta.
Anh ta rơi vào phòng 8. (Tất nhiên có kiểm tra trước đó anh ta đã coi ở phòng nào, để hủy những phòng này ra khỏi danh sách ngẫu nhiên).
Bạn cần đăng nhập để thấy đính kèm

Theo qui tắc đường chéo, ta lập danh sách:
Bạn cần đăng nhập để thấy đính kèm

Như vậy bạn thấy rằng, chúng ta chỉ cần vị trí của GV1. Còn các giáo viên phía sau sẽ luân chuyển theo anh ta theo qui tắc đường chéo như trên.
Tóm lại, nếu có thể, bạn hãy cung cấp thêm dữ kiện: Qui định về việc đóng góp người của các đơn vị là như thế nào? Mỗi đơn vị cung cấp tối thiểu bao nhiêu người, tối đa bao nhiêu người?
Nói là tổng số giám thị nhiều hơn 2p để dự trù ốm đau, bị kỷ luật. Nhưng cụ thể là 2.5p hay là bao nhiêu?
cảm ơn bạn nhiều nhé, lúc demo dữ liệu mình cũng sơ suất không đế ý điều này,thành thật xin lỗi các bạn. xin đính chính như sau ạ:
- số lượng người gác thi không có quy định cụ thể nhưng luôn đảm bảo = 2gt/phòng thi. ( thường các hội đồng luôn sắp xếp = 2gv/p không dư, nếu có xảy ra sự cố thì điều gtvp thế vào. còn mình demo file thì đưa gv thêm vào, nếu ai không phân công thì dưa vào vp )
- Tổng số người của mỗi đơn vị được phân công mặc dù không cố định là bao nhiêu, nhưng luôn đảm bảo nguyên tắc tổng số gt trong (d-1)>= p
cảm ơn các bác
 

huutinh85

Yêu THVBA nhất
@tuhocvba , @giaiphapvba dạ em hiểu ý các bác đề cập trường hợp là p<=m, trong thực tế thì em chưa gặp trường hợp nào như vậy. Bởi vì:
1- thường thì các trường học sĩ số 46hs/lớp khi chia phòng thi thì thường là 24h/p, số môn thi thường là 9 môn, nên chỉ cần có 5 lớp thì p >=m
2- trong thực tế ít đơn vị nào tiến hành thi 9 môn, cứ sau 1 môn đổi gt vì mỗi môn thi kéo dài 45p-60p, nếu đổi giám thị liên tục thì công tác chuẩn bị mất nhiều thời gian hơn là thời gian thực để thi. ( thường thì các đơn vị ghép 2môn/ ca - nên p <9, kể cả thi THPTQG hiện nay cũng ghép "ly+hoá+sinh" / ca," sử +địa+gdcd"/ca ). Nhưng để đảm bảo tính tổng quát cho vấn đề thì em nêu ra 9 môn thi. Vì vậy em nghĩ khi code thì có thể set trường hợp này. Cảm ơn các bác!.
 

Euler

Administrator
Thành viên BQT
@huutinh85 :Mình liên lạc thông báo để bạn biết rằng, topic này vẫn đang được hỗ trợ.
Hiện tại mình đang thiết kế lại sắp xếp dữ liệu cho macro. (đã xong)
Bạn cần đăng nhập để thấy hình ảnh


Bước tiếp theo là code phần phân bố ngẫu nhiên theo điều kiện logic đã thống nhất trong topic này (đang tiến hành):
1. Một phòng thi có hai giám thị với hai chức danh GT1 và GT2.
2. Hai người cùng đơn vị không cùng phòng thi.
3. Hai người đã từng coi thi cùng phòng thì không gặp lại.
4. Một giám thị không quay trở lại phòng thi nơi anh ta đã từng coi thi trước đây.

4 điều kiện này mình hiểu là điều kiện bắt buộc (MUST).
Và mong muốn (WANT): phân bố chức danh GT1, GT2 đồng đều nhất có thể, để đảm bảo công bằng giữa các giám thị.
Dự kiến code demo sẽ xong trong ngày hôm nay.
 

Euler

Administrator
Thành viên BQT
@huutinh85 : Tôi thông báo để bạn biết rằng Tool demo tôi đã làm xong.
Nó đáp ứng tất cả các yêu cầu (MUST) như đã thống nhất từ trước tới nay. Bạn có thể dùng vào công việc thực tế của bạn.
1. GV cùng trường tuyệt đối không coi thi cùng phòng.
2. GV đã từng coi thi cùng nhau, tuyệt đối không gặp nhau ở lần coi thi tiếp theo.
3. GV đã từng coi thi phòng P1, tuyệt đối không quay lại P1 để coi thi ở môn khác.
Bạn có thể download ở đây:
Vì không có nhiều thời gian (tôi chỉ có 6h để làm tool này cho bạn), tôi giả thiết rằng việc bạn đưa data vào là lý tưởng:
1. Tên danh sách các giáo viên xếp theo trường, liên tiếp nhau, giống như bạn gửi cho chúng tôi.
Sẽ không có chuyện dòng 10 là giáo viên THPT A, dòng 11 là THPT B, sang dòng 12 lại là THPT A. Hoặc là dòng 11 là dòng trống, dòng 12 lại có dữ liệu.
Do đó tôi không sắp xếp lại data và tiến hành xây dựng hàm kiểm tra nữa (khá mất thời gian).
Bạn cần đăng nhập để thấy hình ảnh

2. Số phòng thi bạn có thể thay đổi tùy ý.
3. Dữ liệu danh sách giáo viên thêm vào tùy ý, nhưng hãy đảm bảo danh sách các trường xếp liên tiếp nhau. Không có dòng trống ở giữa.
4. Chức danh GT1, GT2 để mặc định là 2 chức danh. Code hiện tại đang theo hướng có thể thay đổi tùy ý. Tuy nhiên, trường hợp nhiều hơn 2, cần xem xét lại thuật toán. Chú ý: Điều kiện GVX vừa làm GT2 thì ở môn thi sau vẫn có khả năng là GT2, do chương trình xếp ngẫu nhiên. Nếu làm chặt điều kiện hơn, e rằng cần xem xét lại thuật toán để đảm bảo chắc chắn tồn tại một cách sắp xếp.
5. Chương trình không kiểm tra lại phòng đã đủ 2 giám thị hay chưa. Bạn hãy nhìn vào dòng số 5. Nếu tất cả đều là dãy số 2 (trong phòng đã đủ 2 giám thị), có nghĩa kết quả đó là OK rồi. (Cái này do không có thời gian code, không liên quan tới khó hay dễ).
Bạn cần đăng nhập để thấy hình ảnh

6. File tôi để lại các ghi chú, để cho bạn dễ hiểu code, cũng như dễ dàng bảo trì sửa chữa nâng cấp code.

Chương trình vẫn có chỗ để cải thiện:
1. Tự động sắp xếp lại danh sách các trường, không cần người dùng can thiệp.
2. Làm chặt hơn logic (đã là GT2 thì lần sau làm GT1). (Cần tính toán lại thuật toán-khó).
3. Kiểm tra lại input: Số người của d-1 đơn vị > p, tổng số người > 2p... Hiện tại tôi mặc định data của bạn đảm bảo điều này. (vấn đề thời gian, không liên quan khó dễ)
4. Kiểm tra lại output. (vấn đề thời gian, không liên quan khó dễ)
5. Cải thiện giao diện cho đẹp. (vấn đề thời gian, không liên quan khó dễ)
6. Cải thiện nút Clear. Hiện tại clear là clear all. Tức là reset sạch sẽ. Tuy nhiên tôi nghĩ rằng, giả sử ở môn thi thứ 8, người dùng muốn clear kết quả lần 8 thôi, thì hiện tại chưa làm. (vấn đề thời gian, không liên quan khó dễ)
Tuy nhiên như đã nói, đây chỉ là demo. Với yêu cầu bạn đặt ra, tôi nghĩ đã đủ cho bạn dùng rồi. Tôi thử cho chạy 9 môn thi bằng cách ấn nút RUN 9 lần, thì kết quả đều ổn.
Bạn cần đăng nhập để thấy hình ảnh


Thảo luận về code: Tôi không đi theo hướng thuật toán tối ưu, đơn thuần cho kiểm tra các điều kiện bắt buộc MUST mà bạn đã nêu, rồi cho vào danh sách lấy ngẫu nhiên.
1. Về kiểm tra tính tồn tại: Tôi không dùng Dictionary. Vì phải kiểm tra nhiều. Những gì cần kiểm tra, tôi cho vào string.
Điều này cũng gây chút phiền toái. Ví dụ GV có mã 1, với giáo viên có mã 11 thì khi kiểm tra 1 có tồn tại không sẽ bị sai. Do đó trong code tôi để là :1:;:11:;:22:; Tức là trong code, sau khi lấy mã giáo viên thì nó tự thêm đằng trước và đằng sau dấu :
Tương tự mã phòng thi cũng vậy. Do đó, tôi không mong muốn bạn đặt mã phòng hay mã giáo viên có sử dụng dấu : và ;
Hiện tại data demo bạn ghi số thì bạn cứ để nguyên là số, còn phòng thì khỏi cần ghi gì, chương trình tự ghi.
2. Về Phòng: Tôi coi Phòng là đối tượng (object, trong VBA thì là class).
Gồm các thuộc tính: Name (tên phòng), GT1 là dòng chứa thông tin giám thị 1, GT2 là dòng chứa thông tin giám thị 2, HIS là lịch sử những giáo viên nào đã từng coi ở phòng này.

Admin Euler.
 

tuhocvba

Administrator
Thành viên BQT
Cảm ơn @huutinh85 đã tạo ra một topic thật sôi động.
Kết quả như này là OK rồi. Mình vừa kiểm tra xong.
Có thể nâng cấp thành nhiều đơn vị. Còn về chức danh phải xem xét. Nhưng mấy chục năm, quy chế thi theo đó thì trong phòng thi cũng chỉ có chức danh GT1 và GT2, cho nên hiện tại code như này là dùng được.
Bạn cần đăng nhập để thấy hình ảnh


Dùng Excel để sắp xếp giám thị trông thi không phải là vấn đề mới mẻ, tuy nhiên đây là lần đầu tiên tôi thấy một topic chất lượng và đưa ra được kết quả. Mặc dù code vẫn có thể cải thiện hơn nữa, nhưng thời gian ngắn mà ra được output như vậy, thảo luận cho nhiều ý kiến như vậy, thì đó là điều mà tôi cảm thấy rất vui.
Nếu không có vấn đề gì nữa, tiếp theo sang bài toán 2. Mời bạn @huutinh85 trình bày lại:
Danh sách hành lang như thế nào?
Danh sách giám thị coi hành lang như thế nào?
Điều kiện ra sao? Đã coi hành lang 1 thì không quay lại đó coi thi nữa? Một hành lang thì có mấy giám thị coi thi?
Hai hành lang liên tiếp thì không sử dụng hai giáo viên cùng trường coi?
Mong bạn cụ thể các điều kiện và trình bày để bất cứ ai cũng hiểu được.
 

vbano1

SMod
Thành viên BQT
, tôi nhận thức là đã giải quyết xong, do không có phản hồi nào.
Vậy cho phép tôi làm bài toán số 2. Mong rằng tôi không làm rối loạn topic này.
@huutinh85 : Bài toán 2, theo tài liệu của bạn chia sẻ, tôi thấy rằng đây chỉ là bài toán sắp xếp ngẫu nhiên mà không có điều kiện nào khác.
Có 9 cán bộ thì cho cả 9 cán bộ đi coi thi. (Mặc định mỗi cán bộ coi 2 phòng: Theo tôi hiểu cái này cũng không cần quan tâm. Miễn sao sắp xếp ngẫu nhiên cho hết số cán bộ có trong danh sách là được).
Vậy bài toán này cũng giống như bài toán sắp xếp chỗ ngồi cho học sinh, trong lớp học có 40 học sinh, sắp xếp ngẫu nhiên làm sao cho đủ hết các học sinh này vào các chỗ ngồi.

Trên sheet DATA: bạn nhâp thông tin cán bộ vào đó. Chú ý chương trình không lấy dòng đầu tiên, vì coi đó là dòng tiêu đề.
Và chú ý, chương trình sẽ nháp trên cột J của sheet DATA.
Bạn cần đăng nhập để thấy hình ảnh


Trên sheet tuhocvba.net, tôi ấn nút Sapxep.
Chương trình sẽ xóa toàn bộ thông tin có trên sheet này, trong phạm vi từ cột A tới cột G. Xin lưu ý.
Bạn cần đăng nhập để thấy hình ảnh

Đồng thời nó sẽ tiến hành sắp xếp ngẫu nhiên.
Bạn cần đăng nhập để thấy hình ảnh


Logo tuhocvba.net hiện trên cùng, chỉ là cho đẹp, bạn đừng bận tâm.

Và tất nhiên ở các môn thi tiếp theo, bạn chỉ cần ấn vào nút Hoandoivitri.
Bạn cần đăng nhập để thấy hình ảnh

chú ý, thời gian cho hoán đổi vị trí thiết định là 10s.
File bạn download ở đây (update link lần 1-lý do: fix code)
Ngoài ra về bài toán số 3, giám thị văn phòng, tôi nghĩ bản chất của nó cũng y như giám thị hành lang. Vì bạn không nói rõ, nên tôi đã hiểu như vậy. Nếu có ý kiến nào khác, xin hãy phản hồi lại.
Nguồn tham khảo:
 
Sửa lần cuối:

huutinh85

Yêu THVBA nhất
Trước hết em xin chân thành cảm ơn các bác trên diễn đàn đã tham gia thảo luận, đưa phương án, code rất nhiệt tình về chủ đề của em. Em cũng xin lỗi các bác và bác @vbano1 chưa kịp thời phản hồi lại cho các bác trên diễn đàn.
Về tool của bác @Euler em có thử chạy qua và tuỳ biến một số nội dung thì em có một số vấn đề xảy ra như sau ạ:
1- Khi em thay đổi số phòng lên 20 ( n<2p) không đảm bảo sl 2gt/p nhưng code vẫn chạy và xuất ra bảng phân công từ p1 đến p19 còn p20 hiển thị GT2. Nên em nghĩ ở đây nên có thông báo vì" số lượng giám thị không đảm bảo 2gt/p" exit code.
2- Về số lượng đơn vị thì cũng như bác @tuhocvba đã test khi thay đổi tăng hoặc giảm số giám thị, số đơn vị nhưng vẫn đảm bảo tổng số gt của (d-1 )>=p nhưng code không chạy báo lỗi.
3 -Việc kiểm tra làm GT1 hay GT2 chỉ cần mang tính tương đối thôi ạ, tránh trường họp 1 người luôn làm gt1, 1 người luôn làm gt 2 sẽ xảy ra phân bì ưu tiên người này người kia.
4- Về nút " clear " vẫn là clear all, nên em giải quyết bằng cách chọn vùng bảng phân công muốn xoá và delete đi
5- Em hiểu tool của bác là demo đã đáp ứng được nhu cầu của em rồi ạ, tuy nhiên để có thể triệt để và có giao diện thân thiện hơn thì e cũng xin các bác có thể cải thiện một số vấn đề:
- Có thể cho chữ GT1 màu đỏ và GT2 màu xanh khác nhau để dễ nhìn được không ạ.
- Khi "Run" code nếu không thoả mãn các vấn đề về dữ liệu, ràng buộc điều kiện thì có thể xuất hiện thông báo để người dùng biết mình sai sót gì( vd như không đủ 2gt/p....). Khi đủ điều kiện code chạy ra phương án thì có thông báo " phân công hoàn thành hãy lưu phân công". Khi đó nhấn "Lưu "thì sẽ lưu vào vùng phân công của môn tiếp theo và đồng thời lấy dữ liệu này qua sheet "BANGPHANCONG"
- Em nhìn vào bảng phân công thì nó tách biệt với cột ds tên gt nên nó hơi khó theo dõi ( em hiểu là khi sắp xếp như vậy thì việc tìm so sánh các điều kiện trùng lặp khoa học hơn khi code). Vì vậy cũng như em thấy nếu có thể cái thiện theo hướng như sau: phần bảng phân công, lịch sử gác của phòng, chức ghép cặp .. các bác cho ẩn hết ( phủ màu xám) chỉ để lại phần tuỳ biến cột STT, HỌ TÊN GT, ĐƠN VỊ, SL PHÒNG để người dùng tuỳ biến.
- Bảng phân công chi tiết nếu có thể được thì các bác tách riêng thành sheet " BANGPHANCONG", Tại sheet này lấy dữ liệu của bảng pc theo môn của sheet"tuhocvba" lấy qua khi bấm nút "lưu" sau khi " run" Khi delete dữ liệu pc của môc nào thì bên " BANGPHANCONG" sẽ mất đi pc môn tương ứng. Giám thị nào ở 1 môn không được phân công thì môn đó sẽ sẽ đánh dấu bằng màu vàng chẳng hạn.
Em có gửi lại file có 2 giao diện ở sheet "BANGPHANCONG" các bác xem giùm ạ. Cảm ơn các bác!
 

tuhocvba

Administrator
Thành viên BQT
Tôi rất lấy làm tiếc vì sự hỗ trợ chưa được đầy đủ khiến bạn chưa hài lòng @huutinh85 . Vậy bạn có thể cho mọi người thêm thời gian được không ạ?
Cụ thể bạn mong muốn là khi nào sẽ xong các vấn đề mà bạn mong muốn code thực thi kiểm tra giúp bạn?
Bạn cần đăng nhập để thấy hình ảnh

Việc bạn yêu cầu không khó, nhưng nó cần thời gian để làm công việc tỉ mỉ. Không có cam kết nào ràng buộc giữa thành viên tham gia diễn đàn với diễn đàn, rằng họ phải đóng góp bao nhiêu thời gian cho diễn đàn, hoặc phải hỗ trợ thành viên cho toàn bộ chương trình. Thông thường mọi người đưa ra ý kiến, hoặc đoạn chương trình chính, việc còn lại thành viên sẽ tự hoàn thiện.
Trong một vài trường hợp, việc đọc code của người khác là khó, cho nên mong muốn người đưa ra ý tưởng chính sẽ hoàn thiện luôn, là điều có thể hiểu được. Tuy nhiên việc này sẽ làm mất thời gian của họ, trong khả năng bạn đã cố hết sức rồi mà vẫn không thể tự hoàn thành được, thì sự giúp đỡ là cần thiết.
Vậy vấn đề khó khăn của bạn hiện nay là gì ạ? Đoạn code nào bạn không hiểu, chúng mình sẽ giải đáp. Bằng cách đó, tôi nghĩ, bạn cũng có thể học hỏi được nhiều điều hơn so với việc người khác code, và bạn chỉ sử dụng.
 

huutinh85

Yêu THVBA nhất
Thứ nhất : Em chân thành Cảm ơn bác @tuhocvba@vbano1 , @Snow24 @Euler @giaiphapvba ....nhiều ạ. Vấn đề của em được các bạn quan tâm đó là sự giúp đỡ rất lớn đối với em rồi. Em cam ơn các bác còn không hết chứ đâu giám yêu cầu gì nhiều. E vẫn hiểu khi đưa vấn đề lên để mình học tập thêm chứ không phải quăng vấn đề rồi chờ các anh chị trả lời. Thấy các bác có hứng thú với bài toán này và mất nhiều thời gian cho vấn đề nay em cũng rất ái ngại. Tuy khả năng của em rất còn hạn chế nên muốn thông qua tư duy lập trình của các bác để học hỏi thêm. Vì vậy bác @tuhocvba đừng nói tiếc vì chưa hỗ trợ được làm em áy náy lắm.
Thứ hai: EM cũng không phải đến mức cần kíp đến mà phải đặt ra thời gian cho các bác, vì em cũng không có quyền làm như vậy, mà em chỉ muốn đưa ra vấn đề, trong quá trình làm việc và dần cải tiến để ngày càng hoàn thiện hơn. Và bác nào đóng gớp được phần nào thì em quý phần đó.
Thứ ba; em biết khi các bác code vấn đề này mất rất nhiều thời gian, thậm chí có bác ngồi nhiều giờ vì 1 vấn đề. Em không lập trình nhiều chuyên như các bác nhưng trong công việc của em về xếp thời khoá biểu giảng dạy cho gv có đợt em đóng của phòng ngồi lì hàng giờ để tinh chỉnh. Nên em hiểu và thông cảm với các bác.
Thứ tư: code của các bác đã chia sẻ là đạt các yêu cầu của em rồi, nhưng vấn đề này có lẽ không chỉ riêng em nên em muốn nó hoàn thiện thêm về giao diện,và cái này các bác có cải tiến được thì em cảm ơn nhiều ạ.
Thứ năm: em cũng sẽ cố gắng để có thể vọc thêm , học hỏi thêm nhiều hơn nữa.
Thứ sáu: về vấn đề tạo ra nút lưu em đang có suy nghĩ sau khi chạy code như các bác thì sẽ căn cứ vào dữ liệu bảng phân công dùng vloopkup tìm ra mã gt tương ứng với môn thi tương ứng để add vào bảng ở sheet "BANGPHANCONG"
Cảm ơn các bác trên diễn đàn rất nhiều!
 
Trạng thái
Không mở trả lời sau này.
Top