Takvim / Planlama algoritması


24

Bir sorunla karşı karşıyayım, nasıl yaklaşacağımdan emin değilim. Her biri belirli iş kısıtlamaları olan (bazıları kişisel, bazıları ortak) çalışanlar için bir takvim oluşturmalıyım.

Ne ile çalışıyorum:

  • Doktorum var
  • Her doktor haftada 5 gün çalışmak zorundadır.
  • Her doktorun haftada 1 gece çalışması gerekir.
  • Her doktor diğer doktorlara kıyasla eşit miktarda gece çalışmak zorundadır (veya mümkün olduğunca yakın)
  • Her doktor, diğer doktorlara kıyasla eşit miktarda perşembe gecesi ve pazar gecesi çalışmalıdır (veya mümkün olduğunca yakın)
  • Bazı doktorlar belirli günlerde / gecelerde çalışamaz (kullanıcı tarafından girilir)
  • Bazı doktorlar belirli günler / geceler çalışmak ister (kullanıcı tarafından girilir)
  • Bazı doktorlar belirli günler / geceler çalışmak istemez (kullanıcı tarafından girilir)

Söz konusu kullanıcı, takvimle ilgilenen kişidir, otomatik olarak tüm kısıtlamalara uyan bir takvim oluşturacak bir çözüm oluşturmaya çalışıyorum. Çözüm, sadece her doktor için "doktor ekle" ve "kısıtlamalar ekle", sonra "takvim oluştur" düğmesi olan büyük bir ayar girişidir. Bu kullanıcı için gerçekten basit.

Benim sorunum :

Asıl planlamayı nasıl yapacağımdan emin değilim, Sinir Ağları, Genetik Algoritmalar ve benzerleri hakkında okudum ve hepsi de doğru bir çözüm gibi gözüküyor ama aslında tam olarak değil.

GA'lara baktığımda, belirli bir popülasyonla (benim sorunum) bir çözüm bulmaya çalışıyorlar, ancak başlangıç ​​popülasyonu zaten daha sonra optimize edilecek olan belirli kısıtlamalara uymak zorunda. Bu durumda, başlangıç ​​popülasyonum zaten bir çözümdür. "Optimize edilmiş" olmasına ihtiyacım yok. Tek bir kişinin arka arkaya 3 pazartesi gecesi çalışması, doğru olması ve başkalarının aynı miktarda çalışması, diğerlerinin de bir noktada 3 pazartesi gecesi çalışacağı anlamına gelmesi önemli değil. Bu benim sorunumun zaten bir GA'nın başlangıç ​​noktasıyla çözüldüğü için GA'ların benim için çok "gelişmiş" olduğunu düşündürüyor.

Fakat yine de, GA’lar gerçekten bunun için yaratılmış gibi gözüküyor, bu yüzden doğru bir şekilde anlamıyor olabilir miyim?

Her neyse, hiç GA kullanmadım (ya da sinir ağları ya da benzeri şeyler) kullanmadığımdan, bunun gibi bir öğrenme eğrisine girmeden önce doğru yaklaşıma gittiğimden emin olmak isterim.

Benim sorum :

Benimki gibi bir sorun için iyi bir yaklaşım / algoritma / teknik nedir sizce? Gaz? Nöral ağlar? Tamamen farklı bir şey var mı?

Tüm kulaklarım ve gerekirse daha fazla ayrıntıya açığım ama sanırım kendimi açıkça anladım :)


22
Muhtemelen hemşire arama problemi ile ilgili literatüre bakmaya değer en.wikipedia.org/wiki/Nurse_scheduling_problem
Renaud M.

Böyle uygun bir terim! Hehe, bağlantın için teşekkürler;)
Gil Sand

8
Bu alanda uzman değilim, ancak aradığınız şey, geliştirme konusunda biraz zaman kazanmanızı sağlayacak bir yaklaşımsa, sorunu Karışık Tamsayılı Programlama Sorunu ( en.wikipedia) olarak modellemeye çalışmak faydalı olabilir . org / wiki / Linear_programming # Integer_unknowns ) ve daha sonra bunu bir MIP çözücüsüne veya bir kısıtlama programlama problemi olarak girin ve ardından bunu OR-tools ( developers.google.com/optimization ) gibi bir CP çözücüsüne girin . Bu şekilde yapmanız gereken tek şey sorununuzu ifade etmektir.
Renaud M.

3
Lineer Programlamanın optimum çözümüelde etmesi garantilidir!
recursion.ninja

2
@RenaudM. Çok az sayıda profesyonel programcının bu şaşırtıcı derecede yararlı matematik alanını anlaması utanç vericidir. Ne zaman biri AI alanın dışına benzetilmiş tavlama veya genetik algoritmalar önerdiğinde, bağırsak cevabım şöyle: Muhtemelen daha iyi bir Doğrusal Program optimizasyonu olarak modellenebilir
recursion.ninja

Yanıtlar:


14

Genetik Algoritmalar ve Yapay Sinir Ağları burada uygun değildir. Bir soruna yeterince iyi, yaklaşık bir çözüm bulmak için meta-sezgiseldirler. Özellikle, her ikisi de aday çözümleri derecelendirmek için bir maliyet işlevi bulmanızı gerektirir. Böyle bir maliyet işlevine sahip olduğunuzda, bu maliyet için en iyi duruma getirilmiş bir algoritma kullanarak manuel olarak daha kolay olabilir.

Bu önemli bir düşüncedir: iki program göz önüne alındığında, A programının veya B programının “daha ​​iyi” olup olmadığına karar vermenin bir yoluna ihtiyacımız var. Çeşitli kriterler listelediniz, ancak nasıl ilişki kurdukları belli değil. Bir kriterin yerine getirilmemesi tüm çözümü başarısız mıdır? Yoksa bir kısıtlamanın kısmen başarısız olması onu diğerlerinden daha kötü bir çözüm mü yapıyor?

En temel düzeyde, haftayı sadece belirli zaman aralıklarında bölümlere ayırabilir ve tüm slot-doktor kombinasyonlarını kaba kuvvet uygulayabilirsiniz. Bununla birlikte, bu arama alanını daha yönetilebilir bir boyuta indirmek için zorlu kısıtlamaları kullanabilirsiniz. Çalışma zamanı ve gece vardiyası üzerindeki kısıtlamalar, böyle bir arama alanı sınırlaması için uygun görünmektedir. Daha sonra yüzlerce aday çözümle geride kalacaksınız.

En iyi aday çözümü seçmek için onları sıralamanız gerekir. Bir yumuşak kısıtlama diğer tüm yumuşak kısıtlamalardan açık bir önceliğe sahipse, örneğin bir doktor belirli bir vardiya çalışamıyorsa, bu vardiyada çalışmak istemeyen bir doktordan daha fazla önem verilen bu durum oldukça kolaydır. Ancak bu kurallara sizin için karar veremiyorum - bu bir yönetimsel karardır. İki yumuşak kısıtlamanın açık bir önceliği yoksa, bu daha zordur, bu durumda iki kısıtlamanın tek bir metrikteki önemini birleştiren bir tür maliyet işlevi bulmanız gerekecektir.


Muhtemelen öncelikli kriterlere göre boş bir zaman çizelgesini dolduran açgözlü bir algoritma kurdum. Bu en uygun çözüm olmayabilir, ancak “optimal” in gerçekte ne anlama geldiği hakkında felsefe yapmaktan çok daha kolay.

İlk adım olarak, hafta sonları gece vardiyalarını doldurabilir ve en çok hafta sonu gece vardiyası yapmayan doktorları seçmeye çalışarak, "Orada çalışamam" kullanıcı isteklerini de hesaba katabilirsiniz. . Bu isteklerin haftada bir ve sürekli olmadığını varsayarsak, bu haftaya kadar haftada bir hafta çalışamayan bir doktorun gelecek hafta toplanacağı anlamına geliyor.

Diğer geceler için benzer bir prosedür kullanılabilir: Kullanıcı isteklerine saygı duymaya çalıştıktan sonra, uzun süredir gece vardiyası yapmayan doktorları doldurursunuz. Prosedür, üçüncü zaman dilimi için de benzer şekilde tekrarlanır, gün değişir. İki kullanıcı isteğinin uzlaştırılamaması durumunda, bir kullanıcının isteğinin ne sıklıkta verildiğini izleyebilir ve ardından doktora daha az verilen dileklerle öncelik verebilirsiniz.

Ne yazık ki, bu sistemi kullanmanın birkaç yolunu görebiliyorum: örneğin bir hafta sonu gece vardiyasında bir doktor işe alınacak ancak “orada çalışamaz” isteğinde bulunacaksa, seçimleri bir hafta ertelenecek - hafta sonu gecesi sıklığı meslektaşlarının pahasına değişir. Geri çevrilen isteklerin sayısına bakan bir dilekçe çözüm prosedürü uygulanırsa, bir kullanıcı, istediği bir talebi artırmak için birkaç imkansız talepte bulunabilir. Bununla birlikte, iyi niyetle (ve doktorların birbirleri arasında geçiş yapma esnekliği) varsayarak, böyle bir algoritma yeterince iyi bir çözümle sonuçlanmalıdır.


Cevabınız için teşekkürler, meslektaşımla biraz daha fazla kazacağım :) Size daha fazla bilgi vermek için: evet, çözümlerin / kriterlerin çoğunu sıralayabiliriz ve bazılarının diğerlerinden öncelikli olup olmadığına karar verebiliriz. Ayrıca, şimdi gerçekten iyi niyetle çalışıyorlar ve iyi çalışıyor. Onlar el ile Dong ve çok fazla "gün çalışamıyorum" kullanmayın. Bu işi nasıl elde ettikleri çok hoş, çünkü gerçekten elle yapıyorlar . Dolayısıyla, “uygulanabilir” bir çözüm zaten dünya için onlara anlam ifade edecek ve onlara ne zaman çalışabileceklerine dair beyin fırtınası zamanı kazandıracak
Gil Sand

5
@ Programları oluşturan insanlar zaten muhtemelen gayri resmi bir algoritma kullanıyorlar. Sadece onlarla konuşup karar süreçlerini anlamaya çalışıp ardından resmileştirip uygulayabilirsiniz. Bu bir sinir ağı kurmaktan ve eğitmekten çok daha kolay olurdu.
amon

Bu bizim ilk adımımız: p önceden ayarlanmış onlarla bir toplantımız var! Yardımlarınız için teşekkürler :)
Gil Sand

3
Bu kullanım için, Genetik Algoritmalar, Uluslararası Hemşire Kadrosu Yarışmalarının araştırma yarışmalarında kanıtlandığı gibi, Tabu Arama ve Simüle Edilmiş Tavlamadan sürekli olarak daha düşüktür. (Tabii ki, onlar hala açgözlü bir algo daha iyidir.)
Geoffrey De Smet

12

Simüle edilmiş tavlama kullanabilirsiniz .

İlk işime başlamadan önce böyle bir şey yaptım - bkz. Https://vimeo.com/20610875 (2: 50'de başlayan demo, algoritma 6: 15'ten itibaren açıklandı).

Simüle tavlama genetik algoritma türüdür, ve belki de teoride uygun değildi (@amon içinde tutar olarak onun cevabını ), ancak pratikte çok iyi çalıştı ve sizinkiyle aynı kullanım durumunda ilgiliydi.

Kaynak kodu kullanılabilir (C #), ancak çalışır durumdayken, korkarım korkunç, birkaç yıl önce geri döndü ve bir otodidakt olmak, bakım konusunda bir şey bilmiyordum. Yine de çok güzel sonuçlar verdi.

Nasıl olsa kısaca nasıl çalışır:

  • Bir başlangıç ​​noktası olarak 1 olası (çok iyi olmayabilir, ancak fiziksel olarak mümkün olabilir) zaman çizelgesi oluşturun. Genetik algoritma bu noktada gerekli değildir - bulabildiğiniz ilk çözüme ulaşmak için sadece güç verebilirsiniz. Geri izlemeyi kullandım . Hesap karmaşıklığı, her gün için rotayı ayrı ayrı çözerek çözülebilir. Hiç bir çözüm yoksa (olabileceği gibi), bu noktada onu tespit edersiniz.

  • Bir çözüm havuzu hazırlayın - bir başlangıç ​​için bu giriş seviyesi çözümün 100 kopyasını alın.

  • Her çözümü rastgele değiştirin: doktorların birbirleri arasında vardiya değiştirmelerini, vardiyalarından rastgele bir doktora geçmelerini ve rastgele uygun bir kişi koymalarını vb.

  • Her bir çözümü ne kadar iyi olduğunu belirleyen bir fitness fonksiyonu ile değerlendirin . Bir adam diğerinden daha fazla gece çalışıyor? Ceza puanlarını çıkarın. Birisi Pazartesi yapmak istedi ama yapmıyorlar mı? Tekrar penaltı puanlarını çıkarın.

  • 20 tane en iyi çözümü alın ve her birini 5 kez kopyalayın, kalan 80'lerin üzerine yazarak bir sonraki nesle aktarın. En güçlü olanın hayatta kalması.

  • Durulayın ve tekrarlayın.

Rakamlar açıkça rasgele, senaryonuz için en uygun ayarları bulmak için parametrelerle uğraşmanız gerekebilir.

Bir çözeltiyi mutasyona gelince, benzetilmiş tavlama sıcaklık adı verilen bir şey ortaya koymaktadır. Temel olarak, başlangıçta, çözümlerinizi oldukça zor mutasyona sokmanız gerektiği (örneğin, her seferinde 10 değiştirme vardiyası yapma girişiminde bulunmalısınız) ve sonraki yinelemelerde yavaş yavaş daha az agresif hale geldiğiniz anlamına gelir, bu nedenle daha ince ayarlamalar yaparlar. Sadece 2 nesil için tweaks denedi).


4
Üniversite takviminde OptaPlanner'ı (nee Drools Planner) Simüle Tavlama ile kullandım. Modelleri ilan edin - bir vardiyada bir zaman ve bir doktor var. Uygunluk fonksiyonu için bildirim kuralları yazınız - zor kısıtlamalar (bir doktor üst üste binen vardiyaları alamaz) ve cezalar (Ann Pazartesi günleri nefret eder). Beyannameyi yaz (mesele bu!) Vardiya değiş tokuşları. OptaPlanner başlangıç ​​durumunu rasgele (olanaksız olabilir) oluşturacak, uygunluk fonksiyonunu kurallardan hesaplayacak ve takas işlemlerini optimizasyon algoritmasına göre çalıştıracaktır. Tavlama programı gibi parametreleri seçebilir ve ayarlayabilirsiniz.
Jesvin Jose

6

Genetik Algoritmalar burada geçerlidir. Lisans programım sırasında meslektaşlarımdan biri de sizin probleminize benzer bir makale yazdı.

Sen-ebilmek bulmak iş dükkanı zamanlama ve ayrıca açık dükkan zamanlama veya akış mağaza zamanlama ilginç başlangıç ​​noktaları olabilir

Genetik bir algoritma kullanmak için mükemmel bir çözüme ihtiyaç duymazsınız, N rastgele adayla başlayabilir ve her birine bir uygunluk işlevi uygulayabilirsiniz , örneğin:

  • En meşgul doktor ve daha az meşgul çalışan arasında belirlenen gece farkı, maliyet fonksiyonunda bir cezadır.
  • Bir doktor haftada 5 günden fazla veya haftada 1 gece çalıştığında, ceza uygulanır
  • Her bir kısıtlamanız, vb.

X adayını bulmak , X'i en iyi olanı seçer , kısıtlamaları daha az uygulayanlar olacaktır. Onlarla çalışmak, birkaç nesiller arasında çaprazlamak ve mutasyon yapmak, iyi bir çözümle sonuçlanabilir.

Bunların hepsini konuştuktan sonra, geçiş yaparken daha kolay performans gösteren daha iyi performans gösteren bir Simüle Edilmiş Tavlama geliştirebileceğimi mutasyona dayanan bir Genetik Algoritma kullandım. Genetik algoritma için maliyet / uygunluk ve mutasyon fonksiyonu, muhtemelen Benzetilmiş Tavlamada kullanılana çok benzer olacaktır. Oradan başlardım @Konrad Morawski'nin cevabına bakın

Google arama Job Shop ve GA için iyi sonuçlar buluyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.