Lịch / Thuật toán lập kế hoạch


24

Tôi đang đối mặt với một vấn đề Tôi không biết làm thế nào để tiếp cận. Tôi phải tạo lịch cho nhân viên, mỗi người trong số họ có những hạn chế công việc cụ thể (một số cá nhân, một số phổ biến)

Những gì tôi đang làm việc với:

  • Tôi có bác sĩ
  • Mỗi bác sĩ phải làm việc 5 ngày / tuần.
  • Mỗi bác sĩ phải làm việc 1 đêm / tuần
  • Mỗi bác sĩ phải làm việc với số lượng đêm bằng nhau so với các bác sĩ khác (hoặc càng gần càng tốt)
  • Mỗi bác sĩ phải làm việc với số lượng đêm thứ năm và đêm chủ nhật tương đương với các bác sĩ khác (hoặc càng gần càng tốt)
  • Một số bác sĩ không thể làm việc một số ngày / đêm nhất định (đầu vào của người dùng)
  • Một số bác sĩ muốn làm việc một số ngày / đêm nhất định (đầu vào của người dùng)
  • Một số bác sĩ muốn không làm việc một số ngày / đêm nhất định (đầu vào của người dùng)

Người dùng trong câu hỏi là người giao dịch với lịch, tôi đang cố gắng xây dựng một giải pháp sẽ tự động tạo ra một lịch tuân theo tất cả các ràng buộc. Giải pháp chỉ là một cài đặt lớn nhập "thêm bác sĩ" và "thêm ràng buộc" cho mỗi bác sĩ, sau đó nhấn nút "tạo lịch". Nó thực sự cơ bản cho người dùng.

Vấn đề của tôi :

Tôi không chắc chắn làm thế nào để tạo kế hoạch thực tế, tôi đã đọc về Mạng thần kinh, Thuật toán di truyền, v.v. và tất cả chúng có vẻ là một giải pháp phù hợp nhưng thực sự không phải vậy.

Khi tôi nhìn vào GA, họ được tạo ra để tìm giải pháp với một dân số nhất định (vấn đề của tôi), nhưng dân số bắt đầu phải tuân theo tập các ràng buộc nhất định, sau đó sẽ được tối ưu hóa. Trong trường hợp đó, dân số bắt đầu của tôi đã là giải pháp. Tôi không cần nó để được "tối ưu hóa". Không có vấn đề gì khi một người làm việc 3 đêm thứ hai liên tiếp, miễn là nó thực sự chính xác và những người khác làm việc như nhau, điều đó có nghĩa là những người khác cũng sẽ làm việc 3 đêm vào một lúc nào đó và không sao cả. Điều này khiến tôi nghĩ rằng GA quá "tiên tiến" đối với tôi, vì vấn đề của tôi đã được giải quyết với điểm khởi đầu của GA.

Nhưng một lần nữa, GA thực sự trông giống như chúng được tạo ra cho điều này, vì vậy tôi có thể không hiểu chính xác?

Dù sao, vì tôi chưa bao giờ sử dụng GA (hoặc mạng thần kinh, hoặc bất cứ thứ gì tương tự), tôi muốn chắc chắn rằng tôi sẽ tìm cách tiếp cận chính xác trước khi tham gia vào một đường cong học tập như thế.

Câu hỏi của tôi :

Bạn nghĩ gì về một cách tiếp cận / thuật toán / kỹ thuật tốt cho một vấn đề như của tôi? Khí ga? Mạng lưới thần kinh? Một cái gì đó khác hoàn toàn?

Tôi là tất cả các tai và mở để biết thêm chi tiết nếu cần thiết, nhưng tôi nghĩ rằng tôi đã làm cho mình khá rõ ràng :)


22
Có lẽ đáng để xem xét tài liệu xung quanh vấn đề sắp xếp y tá en.wikipedia.org/wiki/Nurse_scheduling_probols
Renaud M.

Thật là một thuật ngữ thuận tiện! Hehe, cảm ơn vì liên kết của bạn;)
Gil Sand

8
Tôi không phải là một chuyên gia trong lĩnh vực này, tuy nhiên nếu những gì bạn đang tìm kiếm là một cách tiếp cận sẽ giúp bạn tiết kiệm thời gian cho sự phát triển, thì có lẽ nên thử mô hình hóa vấn đề như một vấn đề lập trình số nguyên hỗn hợp ( en.wikipedia. org / wiki / linear_programming # Integer_unknowns ) và sau đó nhập nó vào bộ giải MIP, hoặc như một vấn đề lập trình ràng buộc và sau đó nhập nó vào bộ giải CP, chẳng hạn như OR-tools ( developers.google.com/optimization ). Bằng cách này, tất cả những gì bạn phải làm là thể hiện vấn đề của bạn.
Renaud M.

3
Lập trình tuyến tính được đảm bảo để rút ragiải pháp tối ưu !
đệ quy.ninja

2
@RenaudM. Thật xấu hổ khi có rất ít lập trình viên chuyên nghiệp hiểu được lĩnh vực toán học hữu ích tuyệt vời này. Bất cứ khi nào ai đó đề xuất mô phỏng thuật toán ủ hoặc di truyền bên ngoài lĩnh vực AI, phản ứng ruột của tôi là: Có thể được mô hình hóa tốt hơn dưới dạng tối ưu hóa Chương trình tuyến tính
recursion.ninja

Câu trả lời:


14

Thuật toán di truyền và mạng lưới thần kinh không phù hợp ở đây. Chúng là siêu giải pháp cho việc tìm kiếm một giải pháp gần đúng, đủ tốt cho một vấn đề. Đáng chú ý, cả hai đều yêu cầu bạn tìm một hàm chi phí để đánh giá các giải pháp ứng viên. Khi bạn có hàm chi phí như vậy, có thể dễ dàng hơn để đưa ra một thuật toán tối ưu hóa chi phí này theo cách thủ công.

Đây là một suy nghĩ quan trọng: đưa ra hai lịch trình, chúng ta cần một cách để quyết định xem lịch trình A hay lịch trình B là tốt hơn. Bạn đã liệt kê các tiêu chí khác nhau, nhưng không rõ chúng liên quan như thế nào. Không hoàn thành một tiêu chí sẽ thất bại toàn bộ giải pháp? Hay một phần thất bại một ràng buộc chỉ làm cho nó một giải pháp tồi tệ hơn những người khác?

Ở cấp độ cơ bản nhất, bạn chỉ có thể phân vùng tuần thành các khe thời gian riêng biệt và bắt buộc tất cả các kết hợp bác sĩ khe cắm. Tuy nhiên, bạn có thể sử dụng các ràng buộc không thành công để giảm không gian tìm kiếm này xuống kích thước dễ quản lý hơn. Các hạn chế về thời gian làm việc và ca đêm dường như phù hợp với giới hạn không gian tìm kiếm như vậy. Sau đó, bạn còn lại với hàng trăm giải pháp ứng cử viên.

Để chọn giải pháp ứng viên tốt nhất, bạn sẽ cần xếp hạng chúng. Điều này khá dễ dàng nếu một ràng buộc mềm có quyền ưu tiên rõ ràng hơn tất cả các ràng buộc mềm khác, ví dụ: nếu bác sĩ không thể làm việc theo ca nhất định, điều đó được coi trọng hơn so với bác sĩ không muốn làm việc theo ca đó. Nhưng tôi không thể quyết định những quy tắc này cho bạn - đó là một quyết định quản lý. Sẽ khó khăn hơn nếu hai ràng buộc mềm không có quyền ưu tiên rõ ràng, trong trường hợp đó bạn sẽ phải đưa ra một loại hàm chi phí nào đó thống nhất tầm quan trọng của hai ràng buộc trong một số liệu.


Tôi có thể sẽ xây dựng một thuật toán tham lam điền vào bảng thời gian trống theo một số tiêu chí ưu tiên. Đây có thể không phải là giải pháp tối ưu nhất, nhưng nó dễ hơn nhiều so với việc triết lý về ý nghĩa thực sự của tối ưu.

Bước đầu tiên, bạn có thể điền vào ca đêm vào cuối tuần và cố gắng chọn những bác sĩ đã không làm ca đêm cuối tuần trong thời gian dài nhất, cũng có tính đến điều mà tôi không thể làm việc ở đó. . Giả sử rằng những điều ước này là mỗi tuần và không liên tục, điều này có nghĩa là một bác sĩ không thể làm việc vào các đêm cuối tuần trong một tuần sẽ được chọn vào tuần tới.

Một quy trình tương tự có thể được sử dụng cho các đêm khác: sau khi cố gắng tôn trọng mong muốn của người dùng, bạn điền vào bác sĩ theo những người đã không làm ca đêm trong thời gian dài nhất. Thủ tục lặp lại tương tự cho loại khe thời gian thứ ba, ngày thay đổi. Nếu hai mong muốn của người dùng không thể được điều hòa, bạn có thể theo dõi tần suất người dùng muốn được cấp, và sau đó ưu tiên bác sĩ với ít mong muốn được cấp hơn.

Thật không may, tôi có thể thấy một vài cách để chơi hệ thống này: ví dụ: nếu một bác sĩ sẽ được chọn làm việc vào ca đêm cuối tuần nhưng lại đưa vào một tác phẩm không thể làm việc ở đó, yêu cầu của họ sẽ bị trì hoãn trong một tuần tần suất của ca đêm cuối tuần với chi phí của các đồng nghiệp của họ. Nếu một quy trình giải quyết mong muốn được triển khai để xem xét số lượng yêu cầu bị từ chối, người dùng có thể đưa vào một vài yêu cầu không thể để tăng một yêu cầu mà họ muốn thực hiện. Tuy nhiên, giả sử đức tin tốt (và sự linh hoạt để các bác sĩ trao đổi sự thay đổi lẫn nhau), một thuật toán như vậy sẽ dẫn đến một giải pháp đủ tốt.


Cảm ơn câu trả lời của bạn, tôi sẽ đào sâu thêm một chút về vấn đề đó với đồng nghiệp của tôi :) Để cung cấp cho bạn thêm thông tin: có, chúng tôi có thể xếp hạng hầu hết các giải pháp / tiêu chí và chúng tôi có thể quyết định xem một số có ưu tiên hơn các giải pháp khác không. Ngoài ra, họ thực sự đang làm việc với đức tin tốt và nó hoạt động tốt. Họ đồng gửi nó bằng tay và không sử dụng "tôi không thể làm việc ngày" quá nhiều. Thật tuyệt khi họ làm việc này ngay bây giờ vì họ thực sự làm nó bằng tay . Vì vậy, một giải pháp "khả thi" sẽ có nghĩa là thế giới đối với họ và tiết kiệm cho họ rất nhiều thời gian động não của những người có thể làm việc khi
Gil Sand

5
@ Làm cho những người hiện đang tạo lịch trình có thể đã sử dụng thuật toán không chính thức. Bạn chỉ có thể nói chuyện với họ và cố gắng hiểu quá trình quyết định của họ, sau đó chính thức hóa và thực hiện điều đó. Điều này sẽ dễ dàng hơn nhiều so với việc thiết lập và đào tạo một mạng lưới thần kinh.
amon

Đó là bước đầu tiên của chúng tôi: p chúng tôi đã có một cuộc họp với họ đã được thiết lập! Cảm ơn tất cả sự giúp đỡ của bạn :)
Gil Sand

3
Đối với trường hợp sử dụng này, Thuật toán di truyền luôn thua kém Tabu Search và mô phỏng luyện kim, như đã được chứng minh bởi các cuộc thi nghiên cứu Cuộc thi đấu tranh y tá quốc tế. (Nhưng tất nhiên, họ vẫn tốt hơn chỉ là một kẻ tham lam.)
Geoffrey De Smet

12

Bạn có thể sử dụng mô phỏng ủ .

Tôi đã làm một cái gì đó như thế trước khi tôi tìm được công việc đầu tiên của mình - xem https://vimeo.com/20610875 (bản demo bắt đầu lúc 2:50, thuật toán giải thích từ 6:15).

Mô phỏng ủ là một loại thuật toán di truyền và có thể nó không phù hợp về mặt lý thuyết (vì @amon duy trì trong câu trả lời của ông ), nhưng nó hoạt động rất tốt trong thực tế và nó cũng giống như trường hợp sử dụng của bạn.

Mã nguồn có sẵn (C #), nhưng trong khi nó hoạt động, thật kinh khủng, tôi sợ, nó đã trở lại một vài năm và là tự động hóa, tôi không biết gì về khả năng bảo trì. Nó mang lại kết quả rất tốt mặc dù.

Làm thế nào nó hoạt động một cách ngắn gọn:

  • Tạo 1 khả năng (có thể không tốt lắm, nhưng có thể về mặt vật lý) là thời điểm bắt đầu. Thuật toán di truyền không cần thiết ở thời điểm này - bạn chỉ có thể tìm hiểu giải pháp đầu tiên mà bạn có thể tìm thấy. Tôi đã sử dụng quay lui . Độ phức tạp tính toán có thể được khắc phục bằng cách giải quyết rota cho mỗi ngày một cách riêng biệt. Nếu không có giải pháp nào cả (tùy từng trường hợp), đó là lúc bạn phát hiện ra nó.

  • Tạo một nhóm giải pháp - giả sử, 100 bản sao của giải pháp cấp nhập cảnh này để bắt đầu.

  • Đột biến mọi giải pháp một cách ngẫu nhiên: yêu cầu các bác sĩ trao đổi ca giữa mỗi người, đưa bác sĩ ngẫu nhiên ra khỏi ca của họ và đưa một người có sẵn ngẫu nhiên vào đó, v.v.

  • Đánh giá từng giải pháp với chức năng tập thể dục xác định mức độ tốt của nó. Một anh chàng làm việc nhiều đêm hơn một người khác? Trừ điểm phạt. Ai đó muốn làm thứ hai nhưng họ không làm? Trừ điểm phạt một lần nữa.

  • Hãy nói - 20 giải pháp tốt nhất và sao chép mỗi trong số chúng 5 lần, ghi đè 80 còn lại với chúng, từ đó mang chúng đến thế hệ tiếp theo. Sống sót của kẻ mạnh nhất.

  • Rửa sạch và lặp lại.

Các con số rõ ràng là tùy ý, bạn có thể cần phải sử dụng các tham số để tìm ra các cài đặt tối ưu cho kịch bản của mình.

Đối với việc thay đổi một giải pháp, ủ mô phỏng giới thiệu một thứ gọi là nhiệt độ. Về cơ bản, điều đó có nghĩa là ngay từ đầu, bạn nên thay đổi các giải pháp của mình khá khó khăn (giả sử, luôn thực hiện 10 lần thay đổi ca trong một lần) và dần dần bớt tích cực hơn với các lần lặp tiếp theo, để chúng trở nên tinh chỉnh hơn (nói, xuống chỉ 2 lần thử chỉnh sửa mỗi thế hệ).


4
Tôi đã sử dụng OptaPlanner (nee Drools Planner) với Mô phỏng luyện kim cho thời khóa biểu đại học. Khai báo các mô hình - Shift có thời gian và Bác sĩ. Viết quy tắc khai báo cho chức năng tập thể dục - các ràng buộc cứng (Bác sĩ không thể thực hiện các ca làm việc chồng chéo) và hình phạt (Ann ghét thứ Hai). Viết khai báo (đó là điểm!) Hoán đổi ca. OptaPlanner sẽ tạo trạng thái bắt đầu một cách ngẫu nhiên (có thể không khả thi), tính toán chức năng tập thể dục từ các quy tắc và thậm chí vận hành các giao dịch hoán đổi theo thuật toán tối ưu hóa. Bạn có thể chọn và điều chỉnh các tham số như lịch trình ủ.
Jesvin Jose

6

Thuật toán di truyền học được áp dụng ở đây. Trong chương trình đại học của tôi, một trong những đồng nghiệp của tôi đã viết một bài báo cho vấn đề rất giống của bạn.

Bạn có thể tìm kiếm Lập lịch cửa hàng công việcLập lịch mở cửa hàng hoặc Lập kế hoạch cửa hàng có thể là điểm khởi đầu thú vị

Để sử dụng thuật toán di truyền, bạn không cần một giải pháp hoàn hảo, bạn có thể bắt đầu với N ứng cử viên ngẫu nhiên và áp dụng chức năng tập thể dục cho từng người trong số họ, ví dụ:

  • Sự khác biệt của các đêm được chỉ định giữa bác sĩ bận rộn nhất và công việc ít bận rộn hơn là hình phạt trong hàm chi phí
  • Mỗi lần bác sĩ làm việc hơn 5 ngày mỗi tuần hoặc 1 đêm mỗi tuần, bạn sẽ áp dụng hình phạt
  • Mỗi ràng buộc của bạn, v.v ...

Tạo N ứng cử viên bạn sẽ chọn X tốt nhất trong số họ , họ sẽ là những người gây ra các ràng buộc ít hơn. Làm việc với họ, vượt quabiến đổi qua nhiều thế hệ người ta có thể kết thúc với một giải pháp tốt.

Nói về tất cả những điều đó, mỗi lần tôi sử dụng Thuật toán di truyền dựa nhiều vào đột biến, tôi có thể phát triển Mô phỏng mô phỏng sẽ hoạt động tốt hơn nhiều, với cách thực hiện dễ dàng hơn. Chi phí / thể lực và chức năng đột biến cho thuật toán di truyền có thể sẽ rất giống với chức năng được sử dụng trong Mô phỏng luyện kim. Tôi sẽ bắt đầu từ đó, nhìn vào câu trả lời của @Konrad Morawski

Tìm kiếm Google tìm thấy kết quả tốt cho Cửa hàng việc làm và GA

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.