Thuật toán tạo thời khóa biểu cho trường học


95

Tôi đã tự hỏi liệu có giải pháp nào cho thuật toán tạo thời khóa biểu ở trường hay không. Về cơ bản, đó là về việc tối ưu hóa "phân tán giờ" (cả trong trường hợp giáo viên và lớp học) cho các liên kết lớp học-chủ thể-giáo viên nhất định. Chúng ta có thể giả định rằng chúng ta có các nhóm lớp học, chủ đề bài học và giáo viên liên kết với nhau ở đầu vào và thời khóa biểu đó phải phù hợp trong khoảng từ 8 giờ sáng đến 4 giờ chiều.

Tôi đoán rằng có lẽ không có thuật toán chính xác cho điều đó, nhưng có thể ai đó biết một phép gần đúng tốt hoặc gợi ý để phát triển nó.


2
Cảm ơn tất cả các câu trả lời. Có vẻ như thuật toán yêu cầu điều tra nhiều hơn. Tôi sẽ coi nó như một chủ đề tốt cho luận văn thạc sĩ hoặc ứng dụng thương mại nhỏ. Nếu tôi viết một cái, tôi sẽ cho bạn biết ở đây;)
cand

10
Như Ian Ringrose của StackOverflow đã nói với một câu hỏi khác, "vẫn còn nhiều PHD cần có trong phần mềm lập lịch."
Reed Debaets

Câu trả lời:


87

Vấn đề này là NP-Hoàn thành !
Tóm lại, người ta cần khám phá tất cả các kết hợp có thể có để tìm ra danh sách các giải pháp có thể chấp nhận được. Do có sự khác nhau trong hoàn cảnh mà vấn đề xuất hiện ở các trường khác nhau (ví dụ: Có những ràng buộc nào liên quan đến lớp học không ?, Một số lớp có được chia thành các nhóm phụ đôi khi không ?, Đây có phải là lịch trình hàng tuần không? v.v.) không có một lớp vấn đề nổi tiếng nào tương ứng với tất cả các vấn đề về lập lịch. Có thể là vấn đề Knapsack có nhiều yếu tố tương đồng với những vấn đề này nói chung.

Một xác nhận rằng đây vừa là một vấn đề khó khăn, vừa là một vấn đề mà mọi người lâu năm tìm kiếm giải pháp, là hãy kiểm tra điều này (dài) danh sách các công cụ lập lịch phần mềm (chủ yếu là thương mại) này

Bởi vì số lượng lớn các biến liên quan, nguồn gốc lớn nhất, điển hình là mong muốn của giảng viên; -) ..., thường là không thực tế khi xem xét việc liệt kê tất cả các kết hợp có thể có . Thay vào đó, chúng ta cần chọn một cách tiếp cận để truy cập vào một tập hợp con của không gian vấn đề / giải pháp.
- Các thuật toán di truyền , được trích dẫn trong một câu trả lời khác là (hoặc, IMHO, có vẻ như ) được trang bị tốt để thực hiện loại tìm kiếm bán hướng dẫn này (Vấn đề là tìm ra một hàm đánh giá tốt để các ứng viên được lưu giữ cho thế hệ sau)
- Đồ thị Các phương pháp viết lại cũng được sử dụng với loại bài toán tối ưu hóa tổ hợp này.

Thay vì tập trung vào các triển khai cụ thể của chương trình tạo lịch biểu tự động, tôi muốn đề xuất một vài chiến lược có thể được áp dụng, ở cấp độ định nghĩa của vấn đề .
Cơ sở lý luận chung là trong hầu hết các bài toán lập kế hoạch trong thế giới thực, một số thỏa hiệp sẽ được yêu cầu, không phải tất cả các ràng buộc, được thể hiện và ngụ ý: sẽ được đáp ứng đầy đủ. Do đó, chúng tôi tự giúp mình bằng cách:

  • Xác định và xếp hạng tất cả các ràng buộc đã biết
  • Giảm không gian vấn đề, bằng cách thủ công, cung cấp một tập hợp các ràng buộc bổ sung .
    Điều này có vẻ phản trực quan nhưng ví dụ: bằng cách cung cấp lịch trình ban đầu, được lấp đầy một phần (giả sử khoảng 30% khoảng thời gian), theo cách đáp ứng đầy đủ tất cả các ràng buộc và bằng cách xem xét lịch trình từng phần này là bất biến, chúng tôi giảm đáng kể thời gian / không gian cần thiết để đưa ra các giải pháp ứng viên.
    Một cách khác có thể giúp ích cho các ràng buộc bổ sung là ví dụ "giả tạo" thêm một ràng buộc ngăn cản việc giảng dạy một số môn học vào một số ngày trong tuần (nếu đây là lịch trình hàng tuần ...); loại ràng buộc này dẫn đến việc giảm không gian vấn đề / giải pháp, thông thường, không loại trừ một số lượng đáng kể các ứng cử viên giỏi.
  • Đảm bảo rằng một số ràng buộc của bài toán có thể được tính toán nhanh chóng. Điều này thường gắn liền với việc lựa chọn mô hình dữ liệu được sử dụng để biểu diễn vấn đề; ý tưởng là có thể nhanh chóng chọn (hoặc lược bỏ) một số tùy chọn.
  • Xác định lại vấn đề và cho phép một số ràng buộc bị phá vỡ, một vài lần, (thường về phía các nút cuối của biểu đồ). Ý tưởng ở đây là loại bỏ một số ràng buộc đối với việc điền vào một vài vị trí cuối cùng trong lịch trình hoặc để chương trình tạo lịch biểu tự động dừng việc hoàn thành toàn bộ lịch trình, thay vào đó cung cấp cho chúng tôi danh sách hàng tá hoặc rất hợp lý các ứng cử viên. Một người thường ở vị trí tốt hơn để hoàn thành câu đố, như đã chỉ ra, có thể phá vỡ một số điều trái ngược, sử dụng thông tin thường không được chia sẻ với logic tự động (ví dụ: đôi khi quy tắc "Không có toán học vào buổi chiều" có thể bị phá vỡ cho lớp "toán và vật lý nâng cao"; hoặc "Tốt hơn là bạn nên phá vỡ một trong các yêu cầu của Mr Jones hơn là một của Ms Smith ... ;-))

Khi đọc lại câu trả lời này, tôi nhận ra khá ngại ngùng khi đưa ra một câu trả lời rõ ràng, nhưng nó không kém phần gợi ý thực tế. Tôi hy vọng sự giúp đỡ này, với những gì, sau cùng, một "vấn đề khó khăn".


1
Câu trả lời tuyệt vời, chính xác và công phu, cảm ơn vì những gợi ý và đề cập về NP-Completeness (tôi cũng đoán được).
cand

3
Bạn có bất kỳ trích dẫn nào giải thích sự hoàn chỉnh NP của vấn đề này không?
Don

49

Đó là một mớ hỗn độn. một mớ hỗn độn hoàng gia. Để thêm vào câu trả lời, đã rất đầy đủ, tôi muốn chỉ ra kinh nghiệm của gia đình tôi. Mẹ tôi là một giáo viên và đã từng tham gia vào quá trình này.

Hóa ra là có một máy tính để làm như vậy không chỉ khó viết mã mà còn khó khăn vì có những điều kiện rất khó để chỉ định cho một chương trình máy tính được tạo sẵn. Ví dụ:

  • một giáo viên dạy cả ở trường của bạn và ở viện khác. Rõ ràng, nếu anh ta kết thúc bài học ở đó lúc 10h30, anh ta không thể bắt đầu tại cơ sở của bạn lúc 10h30, vì anh ta cần một thời gian để đi lại giữa các viện.
  • hai cô giáo đã kết hôn. Nói chung, việc không có hai giáo viên đã kết hôn trong cùng một lớp học được coi là thông lệ tốt. Hai giáo viên này do đó phải có hai lớp khác nhau
  • hai giáo viên đã kết hôn và con của họ học cùng trường. Một lần nữa, bạn phải ngăn cản hai giáo viên dạy trong lớp cụ thể nơi con họ đang học.
  • trường học có các cơ sở vật chất riêng biệt, như một ngày lớp học ở viện này, ngày khác lớp học ở viện khác.
  • trường có các phòng thí nghiệm dùng chung, nhưng các phòng thí nghiệm này chỉ hoạt động vào một số ngày trong tuần (ví dụ: vì lý do an ninh, khi cần thêm nhân sự).
  • một số giáo viên có sở thích cho ngày rảnh rỗi: một số thích vào thứ Hai, một số vào thứ Sáu, một số vào thứ Tư. Một số thích đến sớm vào sáng sớm, một số thích đến muộn hơn.
  • bạn không nên có những tình huống mà bạn có một bài học nói, lịch sử vào một giờ đầu tiên, sau đó ba giờ toán, sau đó một giờ lịch sử khác. Nó không có ý nghĩa đối với học sinh, cũng như đối với giáo viên.
  • bạn nên trải đều các đối số. Không có ý nghĩa gì nếu những ngày đầu tiên trong tuần chỉ học toán, và sau đó những ngày còn lại trong tuần chỉ có văn học.
  • bạn nên cho một số giáo viên hai giờ liên tục để làm các bài kiểm tra đánh giá.

Như bạn có thể thấy, vấn đề không phải là NP-hoàn chỉnh, mà là NP-mất trí.

Vì vậy, những gì họ làm là họ có một cái bàn lớn với các miếng nhựa nhỏ, và họ di chuyển các miếng lót xung quanh cho đến khi thu được kết quả thỏa mãn. Họ không bao giờ bắt đầu lại từ đầu: họ thường bắt đầu từ thời gian biểu của năm trước và thực hiện các điều chỉnh.


12
"NP-insane" - cái tên tuyệt vời;) Tôi đồng ý rằng nó thực sự là một vấn đề phức tạp, cảm ơn những bình luận về cách xử lý "thế giới thực" của vấn đề này. Bố tôi và bạn gái tôi cũng là giáo viên và tôi biết rằng hầu hết các trường học đều có bảng với miếng lót bằng nhựa - điều đó khiến tôi nghĩ đến thuật toán khả thi cho vấn đề này - bởi vì, nếu một người đàn ông có thể giải được nó, có thể sẽ viết được. nó xuống như một thuật toán.
cand

10
những gì bạn muốn viết là một hệ thống chuyên gia: một hệ thống được tạo ra từ một loạt các quy tắc heuristic. Bỏ qua hệ thống chuyên gia, đây là một lĩnh vực mà thuật toán di truyền nằm trong số các loại cược tốt nhất. Khó khăn không nằm ở việc giải quyết vấn đề, không chỉ. Khó khăn còn nằm ở việc nêu vấn đề và những hạn chế của nó.
Stefano Borini

1
Bạn nói đúng, vấn đề yêu cầu cung cấp một tập hợp các điều kiện và ràng buộc phức tạp để đáp ứng, có thể với xếp hạng giải pháp "chấp nhận được". Tôi đồng ý về các thuật toán di truyền, chúng sẽ phù hợp với vấn đề này, tôi cũng nghĩ rằng sẽ tốt hơn nếu bắt đầu phát triển với một bộ điều kiện đơn giản và nâng cao nó khi có được câu trả lời chính xác cho chúng.
CAND

1
Bạn cũng có thể dịch trực tiếp những ràng buộc và mục tiêu này thành MAXSAT. Các thuật toán MAXSAT thường đáng tin cậy hơn các thuật toán di truyền, nhưng bạn có thể bị bùng nổ mệnh đề do các mục tiêu như các lớp toán sẽ được trải ra trong tuần.
Jules

26

Các cuộc thi Timetabling International 2007 đã có một ca khúc lịch học và thi lập kế hoạch theo dõi. Nhiều nhà nghiên cứu đã tham gia cuộc thi đó. Rất nhiều heuristics và metaheuristics đã được thử, nhưng cuối cùng thì metaheuristics tìm kiếm cục bộ (chẳng hạn như Tabu Search và Simulated Annealing) rõ ràng đã đánh bại các thuật toán khác (chẳng hạn như thuật toán di truyền).

Hãy xem 2 framework mã nguồn mở được một số ứng viên lọt vào vòng chung kết sử dụng:

  • JBoss OptaPlanner (Java, mã nguồn mở)
  • Unitime (Java, mã nguồn mở) - nhiều hơn nữa cho các trường đại học

17

Một trong những nhiệm vụ nửa kỳ của tôi là tạo bảng trường học thuật toán di truyền.

Toàn bộ bảng là một "sinh vật". Có một số thay đổi và lưu ý đối với phương pháp tiếp cận thuật toán di truyền chung:

  • Các quy tắc được đưa ra cho "bảng bất hợp pháp": hai lớp học trong cùng một lớp học, một giáo viên dạy hai nhóm cùng một lúc, v.v. Những đột biến này được coi là gây chết người ngay lập tức và một "sinh vật" mới được mọc lên thay cho "sinh vật đã chết" ngay lập tức. Cái ban đầu được tạo ra bởi một loạt các lần thử ngẫu nhiên để có được một cái hợp pháp (nếu vô nghĩa). Đột biến gây chết người không được tính vào số lượng đột biến lặp lại.

  • Đột biến "trao đổi" phổ biến hơn nhiều so với đột biến "Sửa đổi". Những thay đổi chỉ là giữa các phần của gen có ý nghĩa - không thay thế giáo viên bằng lớp học.

  • Phần thưởng nhỏ được chỉ định cho việc gộp 2 giờ nhất định lại với nhau, để chỉ định cùng một lớp học chung theo trình tự cho cùng một nhóm, để giữ cho giờ làm việc của giáo viên và tải của lớp học liên tục. Phần thưởng vừa phải đã được chỉ định cho việc cung cấp các phòng học đúng cho chủ đề nhất định, giữ giờ học trong thời hạn (sáng hoặc chiều), v.v. Phần thưởng lớn dành cho việc giao đúng số môn học nhất định, khối lượng công việc cho một giáo viên, v.v.

  • Giáo viên có thể tạo lịch trình khối lượng công việc của họ như "muốn làm việc thì làm", "được thì làm", "không thích thì làm", "không làm được thì làm", với trọng số được chỉ định. Toàn bộ 24 giờ là giờ làm việc hợp pháp ngoại trừ thời gian ban đêm là rất không mong muốn.

  • Chức năng cân ... oh yeah. Hàm trọng lượng là sản phẩm khổng lồ, quái dị (như trong phép nhân) của các trọng lượng được gán cho các tính năng và thuộc tính đã chọn. Nó cực kỳ dốc, một đặc tính có thể dễ dàng thay đổi theo thứ tự độ lớn lên hoặc xuống - và có hàng trăm hoặc hàng nghìn đặc tính trong một sinh vật. Điều này dẫn đến các con số hoàn toàn LỚN như các trọng số và do kết quả trực tiếp, cần phải sử dụng thư viện bignum (gmp) để thực hiện các phép tính. Đối với một testcase nhỏ của khoảng 10 nhóm, 10 giáo viên và 10 lớp học, tập hợp ban đầu bắt đầu với ghi chú là 10 ^ -200 cái gì đó và kết thúc với 10 ^ + 300 cái gì đó. Nó hoàn toàn không hiệu quả khi nó bằng phẳng hơn. Ngoài ra, các giá trị đã tăng khoảng cách rất nhiều với các "trường học" lớn hơn.

  • Thời gian tính toán khôn ngoan, có rất ít sự khác biệt giữa dân số nhỏ (100) trong một thời gian dài và dân số lớn (10k +) qua các thế hệ ít hơn. Việc tính toán trong cùng một thời gian cho ra chất lượng như nhau.

  • Việc tính toán (trên một số CPU 1GHz) sẽ mất khoảng 1 giờ để ổn định gần 10 ^ + 300, tạo ra các lịch trình trông khá đẹp, đối với trường hợp thử nghiệm 10x10x10.

  • Vấn đề có thể dễ dàng phân tích bằng cách cung cấp cơ sở mạng có thể trao đổi các mẫu vật tốt nhất giữa các máy tính chạy tính toán.

Chương trình kết quả không bao giờ thấy ánh sáng ban ngày bên ngoài giúp tôi đạt điểm cao trong học kỳ. Nó cho thấy một số hứa hẹn nhưng tôi không bao giờ có đủ động lực để thêm bất kỳ GUI nào và làm cho nó có thể sử dụng được cho công chúng.


5
Vì vậy, mở nó ra và quảng cáo nó và thử và thu hút một số học giả vào nó? Sử dụng lại nó cho các dự án tiếp theo? Về mặt kỹ thuật, một chương trình như thế chỉ dành cho 300 nhân viên sẽ rất đáng để các trường học tạo ra lịch trình tối ưu, và họ không ngại dành vài ngày để tính toán về mặt di truyền lịch trình tối ưu. Suy nghĩ về xử lý hàng loạt. Xin chào các hợp đồng phần cứng và phần mềm;)
jcolebrand

1
Nghe thật tuyệt! Tôi tự hỏi liệu hàm trọng lượng có thể được thực hiện với các phao trong phạm vi 0..1 hay không.
Craig McQueen

1
@Craig: Cái gì đó bằng phẳng sẽ tạo ra quần thể bị trì trệ hoặc thậm chí suy giảm chất lượng theo thời gian, vì các đột biến ngẫu nhiên đóng góp nhiều thay đổi tiêu cực hơn so với việc lai tạo / chọn lọc có thể bù đắp. Chỉ có chức năng chất lượng cực kỳ dốc mới có thể tăng trưởng ổn định. Chắc chắn chức năng có thể được bình thường hóa, nhưng vẫn còn, gen "tốt hơn bậc" phải có cơ hội sống sót cao hơn.
SF.

9

Vấn đề này khó hơn tưởng tượng.

Như những người khác đã ám chỉ, đây là một bài toán NP-đầy đủ, nhưng hãy phân tích điều đó có nghĩa là gì.

Về cơ bản, nó có nghĩa là bạn phải xem xét tất cả các kết hợp có thể có.

Nhưng "nhìn vào" không cho bạn biết nhiều điều bạn cần làm.

Dễ dàng tạo ra tất cả các kết hợp có thể. Nó có thể tạo ra một lượng lớn dữ liệu, nhưng bạn sẽ không gặp nhiều khó khăn khi hiểu các khái niệm của phần này của vấn đề.

Vấn đề thứ hai là đánh giá xem một kết hợp có thể đưa ra là tốt, xấu, hay tốt hơn so với giải pháp "tốt" trước đó.

Đối với điều này, bạn không chỉ cần "nó là một giải pháp khả thi".

Ví dụ, cùng một giáo viên làm việc 5 ngày một tuần trong X tuần liên tục? Ngay cả khi đó là một giải pháp làm việc, nó có thể không phải là một giải pháp tốt hơn là luân phiên giữa hai người để mỗi giáo viên làm một tuần một lần. Ồ, bạn không nghĩ về điều đó? Hãy nhớ rằng, đây là những người bạn đang đối phó, không chỉ là vấn đề phân bổ nguồn lực.

Ngay cả khi một giáo viên có thể làm việc toàn thời gian trong 16 tuần liên tục, đó có thể là giải pháp dưới mức tối ưu so với giải pháp mà bạn cố gắng luân phiên giữa các giáo viên và loại cân bằng này rất khó để xây dựng thành phần mềm.

Tóm lại, việc đưa ra một giải pháp tốt cho vấn đề này sẽ có giá trị rất nhiều đối với nhiều người. Do đó, nó không phải là một vấn đề dễ dàng để chia nhỏ và giải quyết. Hãy chuẩn bị đưa ra một số mục tiêu không đạt 100% và gọi chúng là "đủ tốt".


1
Chà, tôi cho rằng thật khó để biết tất cả các ràng buộc ngay từ đầu, nó cần kinh nghiệm và điều tra vấn đề. Tôi thà chia vấn đề thành hai phần riêng biệt và phát triển chúng đồng thời. Đầu tiên sẽ là cấu trúc thuật toán chung - nói cách nó sẽ điền "thế hệ thời gian biểu tiếp theo", thay vì dự thảo cơ chế, mà không có quá nhiều "logic chủ đề" phía sau (có thể là thuật toán di truyền). Cái thứ hai sẽ là một nhà cung cấp quy tắc với tập hợp các ràng buộc để kiểm tra "tính đúng đắn" của thời gian biểu - ban đầu nó có thể đơn giản và nâng cao sau này.
CAND

8

Thuật toán sắp xếp thời gian của tôi, được triển khai trong FET (Phần mềm định thời gian miễn phí, http://lalescu.ro/liviu/fet/ , một ứng dụng thành công):

Thuật toán là heuristic. Tôi đặt tên nó là "hoán đổi đệ quy".

Đầu vào: một tập hợp các hoạt động A_1 ... A_n và các ràng buộc.

Đầu ra: tập hợp thời gian TA_1 ... TA_n (khoảng thời gian của mỗi hoạt động. Phòng được loại trừ ở đây, để đơn giản). Thuật toán phải đặt mỗi hoạt động vào một khoảng thời gian, tôn trọng các ràng buộc. Mỗi TA_i nằm trong khoảng từ 0 (T_1) đến max_time_slots-1 (T_m).

Ràng buộc:

C1) Cơ bản: danh sách các cặp hoạt động không thể đồng thời (ví dụ: A_1 và A_2, vì chúng có cùng một giáo viên hoặc cùng một học sinh);

C2) Rất nhiều ràng buộc khác (loại trừ ở đây, vì đơn giản).

Thuật toán định thời gian (mà tôi đặt tên là "hoán đổi đệ quy"):

  1. Sắp xếp các hoạt động, khó nhất trước tiên. Không phải là bước quan trọng, nhưng tăng tốc thuật toán có thể gấp 10 lần hoặc hơn.
  2. Cố gắng đặt từng hoạt động (A_i) vào một khoảng thời gian cho phép, theo thứ tự trên, từng hoạt động một. Tìm kiếm một vị trí khả dụng (T_j) cho A_i, trong đó hoạt động này có thể được đặt theo các ràng buộc. Nếu có nhiều vị trí hơn, hãy chọn một vị trí ngẫu nhiên. Nếu không có sẵn, hãy thực hiện hoán đổi đệ quy:

    a . Đối với mỗi khe thời gian T_j, hãy xem xét điều gì sẽ xảy ra nếu bạn đặt A_i vào T_j. Sẽ có một danh sách các hoạt động khác không đồng ý với động thái này (ví dụ: hoạt động A_k nằm trên cùng một vị trí T_j và có cùng giáo viên hoặc cùng học sinh với A_i). Giữ một danh sách các hoạt động xung đột cho mỗi khe thời gian T_j.

    b . Chọn một vị trí (T_j) có số lượng hoạt động xung đột thấp nhất. Giả sử danh sách các hoạt động trong vị trí này chứa 3 hoạt động: A_p, A_q, A_r.

    c . Đặt A_i tại T_j và làm cho A_p, A_q, A_r không được phân bổ.

    d . Đệ quy cố gắng đặt A_p, A_q, A_r (nếu mức đệ quy không quá lớn, giả sử là 14 và nếu tổng số lệnh gọi đệ quy được tính kể từ bước 2) trên A_i đã bắt đầu không quá lớn, giả sử 2 * n), như trong bước 2).

    e . Nếu đặt thành công A_p, A_q, A_r, hãy trả về thành công, nếu không hãy thử các khe thời gian khác (chuyển sang bước 2 b) và chọn khe thời gian tốt nhất tiếp theo).

    f . Nếu tất cả (hoặc một số lượng hợp lý) các khe thời gian đã được thử không thành công, hãy quay lại mà không thành công.

    g . Nếu chúng ta đang ở cấp 0 và chúng ta không thành công trong việc đặt A_i, hãy đặt nó giống như trong bước 2 b) và 2 c), nhưng không có đệ quy. Bây giờ chúng tôi có 3 - 1 = 2 hoạt động nữa để thực hiện. Chuyển sang bước 2) (một số phương pháp để tránh đạp xe được sử dụng ở đây).


1
FET đã rất hữu ích đối với tôi. Cảm ơn @Liviu Lalescu!
Noel Llevares

6

CẬP NHẬT: từ các bình luận ... cũng nên có kinh nghiệm!

Tôi muốn sử dụng Prolog ... sau đó sử dụng Ruby hoặc Perl hoặc thứ gì đó để dọn dẹp giải pháp của bạn thành một hình thức đẹp hơn.

teaches(Jill,math).
teaches(Joe,history).

involves(MA101,math).
involves(SS104,history).

myHeuristic(D,A,B) :- [test_case]->D='<';D='>'.
createSchedule :- findall(Class,involves(Class,Subject),Classes),
                  predsort(myHeuristic,Classes,ClassesNew),
                  createSchedule(ClassesNew,[]).
createSchedule(Classes,Scheduled) :- [the actual recursive algorithm].

Tôi (vẫn) đang trong quá trình thực hiện một điều gì đó tương tự như vấn đề này nhưng sử dụng cùng một con đường như tôi vừa đề cập. Prolog (như một ngôn ngữ chức năng) thực sự giúp giải quyết các vấn đề NP-Hard dễ dàng hơn.


1
Prolog chắc chắn là một ngôn ngữ tuyệt vời để diễn đạt các vấn đề được yêu cầu, tuy nhiên, như bạn đã chỉ ra: vấn đề LÀ hoàn chỉnh, nếu không phải là NP-Khó. Điều này có nghĩa là Prolog có thể không đủ nhanh để triển khai thực tế.
Poindexter

3
nếu nó có bất cứ điều gì để làm với NP và chúng tôi sẽ không được thỏa mãn bằng cách xấp xỉ, bất kỳ thuật toán xác định sẽ theo cấp số nhân hút :)
Gabriel Ščerbák

1
Mục tiêu sau đó là triển khai phương pháp phân tích hiệu quả ... chẳng hạn như một thuật toán lập lịch 9 nhiệm vụ đơn giản mất 3.078 giây để hoàn thành, nhưng với một heuristic nhỏ nhất củaWindowFirst thực hiện cùng một vấn đề chỉ mất: 0,123 giây
Reed Debaets

2
HAHA, phần mở đầu (một mình) sẽ KHÔNG BAO GIỜ GIẢI QUYẾT ĐIỀU NÀY. Xin lỗi vì những chữ cái viết hoa, nhưng tôi đã có cùng một ý tưởng cách đây 10 hoặc 15 năm và hoàn toàn thất bại. Không phải là nó chậm, không. Nó đơn giản không thể giải quyết bất kỳ trường hợp thế giới thực nào;)!
Karussell




3

Tôi làm việc trên một công cụ lập lịch được sử dụng rộng rãi thực hiện chính xác điều này. Vâng, nó là NP-Complete; các cách tiếp cận tốt nhất tìm cách ước tính một giải pháp tối ưu. Và, tất nhiên có rất nhiều cách khác nhau để nói rằng cách nào là giải pháp "tốt nhất" - điều quan trọng hơn là giáo viên của bạn hài lòng với lịch trình của họ, hay học sinh tham gia vào tất cả các lớp học của họ chẳng hạn?

Câu hỏi quan trọng nhất tuyệt đối mà bạn cần giải quyết sớm là điều gì làm cho một cách lập lịch hệ thống này tốt hơn một cách khác ? Tức là, nếu tôi có một lịch trình với cô Jones dạy Toán lúc 8 và ông Smith dạy Toán lúc 9, thì điều đó tốt hơn hay tệ hơn một lịch trình với cả hai người dạy Toán lúc 10? Nó tốt hơn hay tệ hơn một khi cô Jones dạy lúc 8 tuổi và thầy Jones dạy lúc 2 tuổi? Tại sao?

Lời khuyên chính mà tôi đưa ra ở đây là chia vấn đề ra càng nhiều càng tốt - có thể theo khóa học, có thể theo giáo viên, có thể từng phòng - và giải quyết vấn đề phụ trước. Ở đó, bạn sẽ có nhiều giải pháp để lựa chọn và cần chọn một giải pháp có khả năng tối ưu nhất. Sau đó, làm việc để làm cho các vấn đề phụ "sớm hơn" có tính đến nhu cầu của các vấn đề phụ sau này trong việc chấm điểm các giải pháp tiềm năng của chúng. Sau đó, có thể tìm cách thoát khỏi những tình huống khó xử (giả sử bạn không thể lường trước được những tình huống đó trong những vấn đề phụ trước đó) khi bạn rơi vào trạng thái "không có giải pháp hợp lệ".

Thẻ tối ưu hóa tìm kiếm cục bộ thường được sử dụng để "đánh bóng" câu trả lời cuối cùng để có kết quả tốt hơn.

Lưu ý rằng thông thường chúng tôi đang xử lý các hệ thống hạn chế tài nguyên cao trong việc sắp xếp lịch học. Các trường học không trải qua một năm với rất nhiều phòng trống hoặc giáo viên ngồi trong phòng chờ 75% thời gian trong ngày. Các phương pháp tiếp cận hoạt động tốt nhất trong môi trường giàu giải pháp không nhất thiết phải áp dụng trong việc lập lịch trình ở trường.


2

Tôi đã thiết kế các thuật toán thương mại cho cả thời gian biểu trong lớp và thời gian kiểm tra. Lần đầu tiên tôi sử dụng lập trình số nguyên; đối với thứ hai, phương pháp phỏng đoán dựa trên việc tối đa hóa một hàm mục tiêu bằng cách chọn hoán đổi vị trí, rất giống với quy trình thủ công ban đầu đã được phát triển. Điều chính của họ trong việc chấp nhận các giải pháp đó là khả năng đại diện cho tất cả các ràng buộc trong thế giới thực; và để những người lập thời gian biểu con người không thể nhìn thấy các cách cải thiện giải pháp. Cuối cùng, phần thuật toán khá đơn giản và dễ thực hiện so với việc chuẩn bị cơ sở dữ liệu, giao diện người dùng, khả năng báo cáo thống kê như sử dụng phòng, giáo dục người dùng, v.v.


1

Nói chung, lập trình ràng buộc là một cách tiếp cận tốt cho loại vấn đề lập lịch trình này. Tìm kiếm về "lập trình ràng buộc" và lập lịch hoặc "lập lịch dựa trên ràng buộc" cả trong phần tràn ngăn xếp và trên Google sẽ tạo ra một số tham chiếu tốt. Không phải là không thể - chỉ hơi khó nghĩ khi sử dụng các phương pháp tối ưu hóa truyền thống như tối ưu hóa tuyến tính hoặc số nguyên. Một đầu ra sẽ là - có tồn tại một lịch trình đáp ứng tất cả các yêu cầu không? Điều đó, tự nó, rõ ràng là hữu ích.

Chúc may mắn !


1

Bạn có thể xử lý nó bằng các thuật toán di truyền, vâng. Nhưng bạn không nên :). Nó có thể quá chậm và điều chỉnh tham số có thể quá tốn thời gian, v.v.

Có những cách tiếp cận thành công khác. Tất cả được thực hiện trong các dự án mã nguồn mở:

  • Phương pháp tiếp cận dựa trên ràng buộc
    • Được triển khai trong UniTime (không thực sự dành cho trường học)
    • Bạn cũng có thể đi xa hơn và sử dụng lập trình Số nguyên. Thực hiện thành công tại trường đại học Udine và cả trường đại học Bayreuth (tôi đã tham gia ở đó) bằng cách sử dụng phần mềm thương mại (ILOG CPLEX)
    • Phương pháp tiếp cận dựa trên quy tắc với heuristisc - Xem công cụ lập kế hoạch Drools
  • Các kinh nghiệm khác nhau - FETcủa riêng tôi

Xem tại đây để biết danh sách phần mềm định thời gian


0

Tôi nghĩ bạn nên sử dụng thuật toán di truyền vì:

  • Nó phù hợp nhất cho các trường hợp sự cố lớn.
  • Nó giúp giảm độ phức tạp về thời gian với giá của câu trả lời không chính xác (Không phải là tốt nhất cuối cùng)
  • Bạn có thể chỉ định các ràng buộc và sở thích một cách dễ dàng bằng cách điều chỉnh các hình phạt thể dục cho những điều không được đáp ứng.
  • Bạn có thể chỉ định giới hạn thời gian thực hiện chương trình.
  • Chất lượng của giải pháp phụ thuộc vào lượng thời gian bạn dự định dành để giải quyết chương trình ..

    Định nghĩa thuật toán di truyền

    Hướng dẫn giải thuật di truyền

    Dự án lên lịch lớp học với GA

Cũng hãy xem: một câu hỏi tương tựmột câu hỏi khác


0

Tôi không biết có ai sẽ đồng ý với mã này không nhưng tôi đã phát triển mã này với sự trợ giúp của thuật toán của riêng mình và đang làm việc cho tôi bằng ruby. Subjectflag và teacherflag là mã băm với id tương ứng và giá trị cờ là Boolean. Mọi vấn đề liên hệ với tôi ....... (-_-)

periodflag.each do | k2, v2 |

            if(TimetableDefinition.find(k2).period.to_i != 0)
                subjectflag.each do |k3,v3|
                    if (v3 == 0)
                        if(getflag_period(periodflag,k2))
                            @teachers=EmployeesSubject.where(subject_name: @subjects.find(k3).name, division_id: division.id).pluck(:employee_id)
                            @teacherlists=Employee.find(@teachers)
                            teacherflag=Hash[teacher_flag(@teacherlists,teacherflag,flag).to_a.shuffle] 
                            teacherflag.each do |k4,v4|
                                if(v4 == 0)
                                    if(getflag_subject(subjectflag,k3))
                                        subjectperiod=TimetableAssign.where("timetable_definition_id = ? AND subject_id = ?",k2,k3)
                                        if subjectperiod.blank?
                                            issubjectpresent=TimetableAssign.where("section_id = ? AND subject_id = ?",section.id,k3)
                                            if issubjectpresent.blank?
                                                isteacherpresent=TimetableAssign.where("section_id = ? AND employee_id = ?",section.id,k4)
                                                if isteacherpresent.blank?
                                                    @finaltt=TimetableAssign.new
                                                    @finaltt.timetable_struct_id=@timetable_struct.id
                                                    @finaltt.employee_id=k4
                                                    @finaltt.section_id=section.id
                                                    @finaltt.standard_id=standard.id
                                                    @finaltt.division_id=division.id
                                                    @finaltt.subject_id=k3
                                                    @finaltt.timetable_definition_id=k2
                                                    @finaltt.timetable_day_id=k1
                                                    set_school_id(@finaltt,current_user)
                                                    if(@finaltt.save)

                                                        setflag_sub(subjectflag,k3,1)
                                                        setflag_period(periodflag,k2,1)
                                                        setflag_teacher(teacherflag,k4,1)
                                                    end
                                                end
                                            else
                                                @subjectdetail=TimetableAssign.find_by_section_id_and_subject_id(@section.id,k3)
                                                @finaltt=TimetableAssign.new
                                                @finaltt.timetable_struct_id=@subjectdetail.timetable_struct_id
                                                @finaltt.employee_id=@subjectdetail.employee_id
                                                @finaltt.section_id=section.id
                                                @finaltt.standard_id=standard.id
                                                @finaltt.division_id=division.id
                                                @finaltt.subject_id=@subjectdetail.subject_id
                                                @finaltt.timetable_definition_id=k2
                                                @finaltt.timetable_day_id=k1
                                                set_school_id(@finaltt,current_user)
                                                if(@finaltt.save)

                                                    setflag_sub(subjectflag,k3,1)
                                                    setflag_period(periodflag,k2,1)
                                                    setflag_teacher(teacherflag,k4,1)
                                                end
                                            end
                                        end
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.