Okul zaman çizelgesi oluşturmak için algoritma


96

Bir okul çizelgesi oluşturmanın algoritması için bilinen çözümler olup olmadığını merak ediyordum. Temel olarak, belirli sınıf-konu-öğretmen ilişkileri için "saat dağılımını" (hem öğretmenlerde hem de sınıf durumunda) optimize etmekle ilgilidir. Girişte birbiriyle ilişkilendirilmiş sınıflar, ders konuları ve öğretmenlerimiz olduğunu ve bu zaman çizelgesinin sabah 8 ile akşam 4 arasına sığması gerektiğini varsayabiliriz.

Sanırım bunun için muhtemelen kesin bir algoritma yok, ama belki birileri bunu geliştirmek için iyi bir yaklaşım veya ipuçları biliyor.


2
Tüm cevaplar için teşekkürler. Görünüşe göre algoritma daha fazla araştırma gerektiriyor. Yüksek lisans tezi veya küçük ticari uygulama için iyi bir konu olarak değerlendiririm. Eğer bir tane
yazarsam,

10
StackOverflow'dan Ian Ringrose'un başka bir soruya söylediği gibi, "programlama yazılımında hala olması gereken birçok PHD var."
Reed Debaets

Yanıtlar:


89

Bu problem NP-Complete !
Özetle, kabul edilebilir çözümlerin listesini bulmak için tüm olası kombinasyonları araştırmak gerekir. Sorunun çeşitli okullarda ortaya çıktığı koşullardaki farklılıklar nedeniyle (örneğin: Sınıflarla ilgili kısıtlamalar var mı? Bazı sınıflar bazen alt gruplara mı bölünüyor ?, Bu haftalık bir program mı? vb.) tüm çizelgeleme problemlerine karşılık gelen iyi bilinen bir problem sınıfı yoktur. Belki de Sırt Çantası problemi , bu problemlerle genel olarak birçok benzerliğe sahiptir.

Bunun hem zor bir sorun hem de insanların sürekli bir çözüm aradıkları bir sorun olduğuna dair bir onay, bu (uzun ) yazılım planlama araçlarının (çoğunlukla ticari) listesini kontrol etmektir

En büyük kaynağı tipik olarak fakülte üyesinin arzuları olan çok sayıda değişken nedeniyle; -) ..., tüm olası kombinasyonları sıralamayı düşünmek genellikle pratik değildir . Bunun yerine, problem / çözüm alanlarının bir alt kümesini ziyaret eden bir yaklaşım seçmemiz gerekir.
- Başka bir cevapta belirtilen Genetik Algoritmalar (veya IMHO gibi görünüyor ) bu tür yarı yönlendirmeli aramayı gerçekleştirmek için iyi donanımlıdır (Sorun, gelecek nesil için tutulacak adaylar için iyi bir değerlendirme işlevi bulmaktır)
- Grafik Yeniden yazma yaklaşımları, bu tür kombinasyonel optimizasyon problemlerinde de kullanılır.

Bir otomatik zamanlama üreteci programının belirli uygulamalarına odaklanmak yerine , sorunun tanımı düzeyinde uygulanabilecek birkaç strateji önermek istiyorum .
Genel mantık, gerçek dünya çizelgeleme problemlerinin çoğunda bazı tavizlerin gerekli olacağı, ifade edilen ve ima edilen tüm kısıtlamaların değil, tam olarak karşılanacağıdır. Bu nedenle kendimize şu şekilde yardımcı oluyoruz:

  • Bilinen tüm kısıtlamaları tanımlama ve sıralama
  • Problem alanını manuel olarak azaltmak, bir dizi ek kısıtlama sağlamak.
    Bu mantığa aykırı görünebilir, ancak örneğin tüm kısıtlamaları tam olarak karşılayacak bir şekilde başlangıçta, kısmen doldurulmuş bir program (örneğin, zaman aralıklarının yaklaşık% 30'u) sağlayarak ve bu kısmi programı değişmez olarak kabul ederek, aday çözümler üretmek için gereken zaman / alan.
    Ek kısıtlamaların yardımcı olmasının bir başka yolu, örneğin haftanın bazı günlerinde bazı konuların öğretilmesini engelleyen bir kısıtlama "yapay olarak" eklemek (eğer bu haftalık bir programsa ...); bu tür kısıtlamalar, tipik olarak önemli sayıda iyi adayı dışarıda bırakmadan problem / çözüm alanlarının azaltılmasına neden olur.
  • Problemin bazı kısıtlamalarının hızlı bir şekilde hesaplanabilmesini sağlamak. Bu genellikle sorunu temsil etmek için kullanılan veri modeli seçimiyle ilişkilendirilir; buradaki fikir, bazı seçenekleri hızlı bir şekilde seçebilmektir (veya azaltabilmektir).
  • Sorunun yeniden tanımlanması ve bazı kısıtlamaların birkaç kez kırılmasına izin verilmesi (tipik olarak grafiğin son düğümlerine doğru). Buradaki fikir , programdaki son birkaç yuvayı doldurmak için bazı kısıtlamaları kaldırmak veya otomatik program oluşturucu programının tüm programı tamamlamaktan çekinmesini sağlamak, bunun yerine bize bir düzine kadar makul bir liste sunmaktır. adaylar. Bir insan, belirtildiği gibi, muhtemelen otomatikleştirilmiş mantıkla tipik olarak paylaşılmayan bilgileri kullanarak bulmacayı tamamlamak için genellikle daha iyi bir konumdadır (örn. "ileri matematik ve fizik" sınıfı için; veya "Bay Jones gereksinimlerinden birini kırmak, Bayan Smith'ten birinden daha iyidir ... ;-))

Bu cevabı prova okurken, kesin bir cevap vermenin oldukça utangaç olduğunu anlıyorum, ama hiçbiri pratik önerilerle dolu. Umarım bu yardım, sonuçta "zor bir sorun" olan şeydir.


1
Harika, doğru ve ayrıntılı cevap, ipuçları için teşekkürler ve NP-Tamlık hakkında bahsetti (benim de tahminimdi).
cand

3
Bu sorunun NP-bütünlüğünü açıklayan herhangi bir alıntı var mı?
Don

50

Bu bir karmaşa. kraliyet karmaşası. Cevaplara eklemek için, zaten çok tamamlanmış, aile deneyimime dikkat çekmek istiyorum. Annem bir öğretmendi ve bu sürece dahil oluyordu.

Bunu yapacak bir bilgisayara sahip olmanın, sadece kendi başına kodlamanın zor olmadığı, aynı zamanda, önceden pişirilmiş bir bilgisayar programına belirtilmesi zor olan koşullar olduğu için de zor olduğu ortaya çıktı. Örnekler:

  • bir öğretmen hem okulunuzda hem de başka bir enstitüde ders verir. Açıktır ki, dersi orada 10.30'da bitirirse, 10.30'da işyerinizde başlayamaz çünkü enstitüler arasında gidip gelmek için biraz zamana ihtiyacı var.
  • iki öğretmen evlidir. Genel olarak, aynı sınıfta iki evli öğretmenin olmaması iyi bir uygulama olarak kabul edilir. Bu iki öğretmenin bu nedenle iki farklı sınıfı olması gerekir
  • iki öğretmen evli ve çocukları aynı okula gidiyor. Yine, iki öğretmenin çocuklarının bulunduğu belirli sınıfta ders vermesini engellemelisiniz.
  • okulun ayrı tesisleri vardır, örneğin bir gün sınıf bir enstitüde ve başka bir gün ders başka bir günde.
  • okulun ortak laboratuarları vardır, ancak bu laboratuarlar yalnızca hafta içi belirli günlerde mevcuttur (örneğin, ek personelin gerekli olduğu güvenlik nedeniyle).
  • bazı öğretmenlerin boş gün için tercihleri ​​vardır: bazıları Pazartesi, bazıları Cuma, bazıları Çarşamba günü tercih eder. Bazıları sabah erken gelmeyi, bazıları daha geç gelmeyi tercih ediyor.
  • İlk saatte tarih dersi, ardından üç saat matematik, sonra başka bir tarih dersi aldığınız durumlar olmamalıdır. Ne öğrenciler ne de öğretmen için mantıklı değil.
  • argümanları eşit olarak yaymalısınız. Haftanın ilk günlerinin sadece matematik, ardından haftanın geri kalanının sadece edebiyat olması mantıklı değil.
  • Bazı öğretmenlere değerlendirme testleri yapmaları için arka arkaya iki saat vermelisiniz.

Gördüğünüz gibi, sorun NP tam değil, NP delilik.

Yani yaptıkları şey, küçük plastik ekleri olan büyük bir masaya sahip olmaları ve tatmin edici bir sonuç elde edilene kadar ekleri hareket ettirmeleridir. Asla sıfırdan başlamazlar: normalde bir önceki yılın takviminden başlarlar ve ayarlamalar yaparlar.


12
"NP-deli" - harika bir isim;) Bunun gerçekten karmaşık bir problem olduğuna katılıyorum, bu problemin "gerçek dünya" tedavisi üzerine yorumlarınız için teşekkürler. Babam ve kız arkadaşım da öğretmenler ve okulların çoğunda plastik ilaveli tablolar olduğunu biliyorum - bu beni bu problem için olası algoritma düşünmeye götürüyor - çünkü eğer bir adam çözebilirse, belki yazmak mümkün olur bir algoritma olarak indirdi.
cand

10
yazmak istediğiniz şey uzman bir sistemdir: bir dizi sezgisel kuraldan oluşan bir sistem. Uzman sistemler bir yana, bu, genetik algoritmaların en iyi bahisler arasında olduğu bir alandır. Zorluk sadece sorunun çözümünde değil. Zorluk aynı zamanda sorunu ve kısıtlamalarını belirtmekte de yatmaktadır.
Stefano Borini

1
Haklısınız, sorun, muhtemelen "kabul edilebilir" çözüm derecelendirmesiyle, yerine getirilmesi gereken karmaşık koşullar ve kısıtlamalar sağlamayı gerektirir. Genetik algoritmalara katılıyorum, bu probleme çok iyi uymalılar, ayrıca basit bir dizi koşulla geliştirmeye başlamanın ve onlar için doğru cevap elde edildikçe onu geliştirmenin daha iyi olacağını düşünüyorum.
cand

1
Ayrıca bu kısıtlamaları ve hedefleri doğrudan MAXSAT'a çevirebilirsiniz. MAXSAT algoritmaları genellikle genetik algoritmalardan daha güvenilirdir, ancak matematik derslerinin haftaya yayılması gerektiği gibi hedefler nedeniyle madde patlaması yaşayabilirsiniz.
Jules

27

Uluslararası çizelgeleme Yarışması 2007 bir ders planlaması parça ve sınav zamanlama parçayı vardı. Bu yarışmaya birçok araştırmacı katıldı. Pek çok buluşsal yöntem ve meta-sezgisel yöntem denendi, ancak sonunda yerel arama meta-sezgileri (Tabu Arama ve Simüle Tavlama gibi) diğer algoritmaları (genetik algoritmalar gibi) açıkça geride bıraktı.

Bazı finalistlerin kullandığı 2 açık kaynak çerçevesine bir göz atın:


17

Yarım dönem ödevlerimden biri, genetik algoritma okul tablosu oluşturma idi.

Tüm masa tek bir "organizma" dır. Genel genetik algoritmalar yaklaşımında bazı değişiklikler ve uyarılar vardı:

  • "Yasadışı masalar" için kurallar yapıldı: aynı sınıfta iki sınıf, bir öğretmen aynı anda iki gruba ders veriyor vs. Bu mutasyonlar hemen ölümcül kabul edildi ve "merhum" yerine yeni bir "organizma" filizlendi. İlki, yasal (anlamsızsa) bir tane elde etmek için bir dizi rastgele denemeyle oluşturuldu. Ölümcül mutasyon, yinelemedeki mutasyonların sayısına dahil edilmedi.

  • "Değişim" mutasyonları, "Değiştir" mutasyonlarından çok daha yaygındı. Değişiklikler genin yalnızca mantıklı olan kısımları arasındaydı - bir öğretmeni sınıfla değiştirmek yok.

  • Öğretmenin çalışma saatlerini ve sınıf yükünü sürekli tutmak için aynı gruba aynı sınıfın sırayla atanması için belirli 2 saati bir araya toplamak için küçük ikramiyeler verildi. Belirli bir konu için doğru sınıflar vermek, ders saatlerini bağlar içinde tutmak (sabah veya öğleden sonra) vb. İçin orta düzeyde ikramiye verildi. Büyük ikramiyeler, verilen konuya doğru sayıda atama, öğretmen için iş yükü vb.

  • Öğretmenler "o zaman çalışmak istiyorum", "tamam o zaman çalışmak", "o zaman çalışmayı sevmiyor", "o zaman çalışamaz" iş yükü çizelgelerini uygun ağırlıklarla oluşturabilirler. Gece saatlerinin çok istenmeyen olması dışında 24 saatin tamamı yasal çalışma saatleriydi.

  • Ağırlık fonksiyonu ... oh evet. Ağırlık işlevi, seçilen özelliklere ve özelliklere atanan ağırlıkların devasa, canavarca bir ürünüydü (çarpımda olduğu gibi). Son derece dikti, bir özellik onu bir büyüklük sırasına göre kolayca değiştirebilirdi - ve bir organizmada yüzlerce veya binlerce özellik vardı. Bu, ağırlıklar olarak kesinlikle BÜYÜK sayılarla sonuçlandı ve doğrudan bir sonuç olarak, hesaplamaları gerçekleştirmek için bir bignum kitaplığı (gmp) kullanılması gerekti. 10 grup, 10 öğretmen ve 10 sınıftan oluşan küçük bir örnek olay için, ilk set 10 ^ -200something notuyla başladı ve 10 ^ + 300something ile bitti. Daha düz olduğu zaman tamamen verimsizdi. Ayrıca, değerler daha büyük "okullar" ile çok daha geniş bir mesafeye ulaştı.

  • Hesaplama zamanı bilge, uzun bir süre boyunca küçük bir popülasyon (100) ile daha az nesiller boyunca büyük bir popülasyon (10k +) arasında çok az fark vardı. Aynı zamanda yapılan hesaplama aynı kalitede üretildi.

  • Hesaplamanın (bazı 1GHz CPU'larda) 10 ^ + 300 civarında stabilize olması 1 saat kadar sürer ve söz konusu 10x10x10 test durumu için oldukça güzel görünen programlar oluşturur.

  • Sorun, hesaplamayı çalıştıran bilgisayarlar arasında en iyi örnekleri paylaşacak bir ağ oluşturma olanağı sağlayarak kolayca paralelleştirilebilir.

Ortaya çıkan program, dışarıda hiçbir zaman gün ışığını görmedi ve bana dönem için iyi bir not aldı. Biraz umut vaat ediyordu, ancak herhangi bir GUI eklemek ve onu genel halk için kullanılabilir hale getirmek için hiçbir zaman yeterli motivasyona sahip olmadım.


5
Öyleyse açın ve reklamını yapın ve içine biraz akademisyen katmaya çalışın? Daha sonraki projeler için tekrar kullanılsın mı? Teknik olarak, tek başına 300 personel için böyle bir program, optimum programları oluşturmak için okullar için para değerinde olacaktır ve optimum programları genetik olarak hesaplamak için birkaç gün harcamayı umursamazlar. Toplu işlemeyi düşünün. Merhaba donanım ve yazılım sözleşmeleri;)
jcolebrand

1
Harika geliyor! 0..1 aralığındaki kayan değerlerle ağırlık fonksiyonunun yapılıp yapılamayacağını merak ediyorum.
Craig McQueen

1
@Craig: Rastgele mutasyonlar, üreme / seçilimin dengeleyebileceğinden daha fazla olumsuz değişikliklere katkıda bulunduğundan, zaman içinde durgunlaşan ve hatta dejenere olan popülasyonu düz bir şekilde ortaya çıkarır. Yalnızca son derece dik kalite işlevi istikrarlı bir büyüme sağlayabilir. Elbette işlev normalleştirilebilirdi, ancak yine de "çentik daha iyi" bir genin hayatta kalmak için daha yüksek bir şansa sahip olması gerekiyordu.
SF.

9

Bu sorun göründüğünden daha zor.

Diğerlerinin de ima ettiği gibi, bu NP-tam bir problem, ama bunun ne anlama geldiğini analiz edelim.

Temel olarak, tüm olası kombinasyonlara bakmanız gerektiği anlamına gelir.

Ama "bak" sana ne yapman gerektiğini pek söylemez.

Olası tüm kombinasyonları oluşturmak kolaydır. Çok büyük miktarda veri üretebilir, ancak sorunun bu kısmının kavramlarını anlamakta çok fazla sorun yaşamazsınız.

İkinci sorun, belirli bir olası kombinasyonun iyi mi kötü mü yoksa önceki "iyi" çözümden daha mı iyi olduğuna karar vermektir.

Bunun için "olası bir çözüm mü" değil daha fazlasına ihtiyacınız var.

Örneğin, aynı öğretmen haftada 5 gün X hafta boyunca mı çalışıyor? Bu çalışan bir çözüm olsa bile, her öğretmenin her birinin bir hafta yapması için iki kişi arasında geçiş yapmaktan daha iyi bir çözüm olmayabilir. Oh, bunu düşünmedin mi? Unutmayın, bu uğraştığınız kişilerdir, sadece bir kaynak tahsisi sorunu değil.

Bir öğretmen 16 hafta boyunca tam zamanlı çalışabilse bile, bu öğretmenler arasında geçiş yapmaya çalıştığınız bir çözüme kıyasla optimal olmayan bir çözüm olabilir ve bu tür bir dengelemenin yazılıma yerleştirilmesi çok zordur.

Özetlemek gerekirse, bu soruna iyi bir çözüm üretmek birçok insan için çok değerli olacaktır. Bu nedenle, yıkılması ve çözülmesi kolay bir problem değildir. % 100 olmayan bazı hedefleri belirlemeye ve bunlara "yeterince iyi" demeye hazır olun.


1
Başlangıçta tüm kısıtlamaları bilmenin oldukça zor olduğunu, konuyla ilgili deneyim ve araştırma gerektirdiğini iddia ediyorum. Problemi iki ayrı parçaya ayırıp aynı anda geliştirmeyi tercih ederim. Birincisi, genel algoritma yapısı - "sonraki zaman çizelgesi oluşturma" yı nasıl doldurması gerektiğini söyleyecek, çok fazla "konu mantığı" (muhtemelen genetik algoritma) olmadan, mekanizmanın taslağı yerine. İkincisi, zaman çizelgesinin "doğruluğunu" kontrol eden bir dizi kısıtlamaya sahip bir kural sağlayıcı olacaktır - ilk başta basit ve daha sonra geliştirilebilir.
cand

8

FET'te uygulanan ders çizelgeleme algoritmam (Ücretsiz Zaman Çizelgeleme Yazılımı, http://lalescu.ro/liviu/fet/ , başarılı bir uygulama):

Algoritma sezgiseldir. Ben buna "özyinelemeli takas" adını verdim.

Girdi: bir dizi faaliyet A_1 ... A_n ve kısıtlamalar.

Çıktı: TA_1 ... TA_n zaman aralığı (her aktivitenin zaman aralığı. Basitlik açısından odalar burada hariç tutulmuştur). Algoritma, kısıtlamalara uyarak her etkinliği bir zaman dilimine koymalıdır. Her TA_i, 0 (T_1) ile max_time_slots-1 (T_m) arasındadır.

Kısıtlamalar:

C1) Temel: eşzamanlı olamayacak etkinlik çiftlerinin listesi (örneğin, aynı öğretmene veya aynı öğrencilere sahip oldukları için A_1 ve A_2);

C2) Pek çok başka kısıtlama (basit olması için burada hariç tutulmuştur).

Zaman çizelgeleme algoritması ("özyinelemeli değiştirme" adını verdiğim):

  1. Önce en zor olan faaliyetleri sıralayın. Kritik bir adım değil, ancak algoritmayı 10 kat veya daha fazla hızlandırır.
  2. Her etkinliği (A_i), her seferinde bir tane olmak üzere yukarıdaki sırayı izleyerek izin verilen bir zaman dilimine yerleştirmeye çalışın. Bu aktivitenin kısıtlamalara göre yerleştirilebileceği A_i için uygun bir slot (T_j) arayın. Daha fazla yuva varsa, rastgele birini seçin. Hiçbiri yoksa, yinelemeli takas yapın:

    a . Her T_j zaman dilimi için, A_i'yi T_j'ye koyarsanız ne olacağını düşünün. Bu hareketle aynı fikirde olmayan diğer etkinliklerin bir listesi olacaktır (örneğin, A_k etkinliği T_j ile aynı yuvadadır ve A_i ile aynı öğretmene veya aynı öğrencilere sahiptir). Her T_j zaman dilimi için çakışan etkinliklerin bir listesini tutun.

    b . En düşük sayıda çakışan aktiviteye sahip bir alan (T_j) seçin. Bu yuvadaki etkinlik listesinin 3 etkinlik içerdiğini varsayalım: A_p, A_q, A_r.

    c . A_i'yi T_j'ye yerleştirin ve A_p, A_q, A_r'yi ayrılmamış yapın.

    d . A_i'nin başladığı yere A_p, A_q, A_r'yi yinelemeli olarak yerleştirmeye çalışın (özyineleme düzeyi çok büyük değilse, örneğin 14 ve adım 2'den bu yana sayılan özyinelemeli çağrıların toplam sayısı) çok büyük değilse, örneğin 2 * n), 2. adımdaki gibi).

    e . A_p, A_q, A_r başarıyla yerleştirilirse, başarıyla geri dönün, aksi takdirde diğer zaman aralıklarını deneyin (adım 2 b'ye gidin) ve bir sonraki en iyi zaman aralığını seçin).

    f . Zaman aralıklarının tümü (veya makul sayıda) başarısızlıkla denendiyse, başarılı olmadan geri dönün.

    g . 0 seviyesindeysek ve A_i'yi yerleştirmede başarılı olamadıysak, onu 2 b) ve 2 c) adımlarındaki gibi, ancak özyineleme olmadan yerleştirin. Şimdi yapmamız gereken 3 - 1 = 2 etkinlik daha var. 2. adıma gidin) (burada döngüyü önlemek için bazı yöntemler kullanılmaktadır).


1
FET benim için çok faydalı oldu. @Liviu Lalescu teşekkürler!
Noel Llevares

6

GÜNCELLEME: yorumlardan ... sezgisellere de sahip olmalıdır!

Prolog ile giderdim ... sonra çözümünüzü daha güzel bir forma dönüştürmek için Ruby veya Perl veya başka bir şey kullanırdım.

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].

Ben (hala) bu soruna benzer bir şey yapma sürecindeyim ama az önce bahsettiğim yolu kullanıyorum. Prolog (işlevsel bir dil olarak) NP-Hard problemlerini çözmeyi gerçekten kolaylaştırır.


1
Prolog kesinlikle gerekli sorunları ifade etmek için harika bir dildir, ancak sizin de belirttiğiniz gibi: Sorun NP-Zor değilse bile NP-tamdır. Bu, Prolog'un pratik bir uygulama için yeterince hızlı olmayabileceği anlamına gelir.
Poindexter

3
NP ile bir ilgisi varsa ve biz yaklaşımla tatmin
olmazsak

1
O halde amaç, etkili buluşsal yöntemler uygulamaktır ... örneğin basit bir 9 görev zamanlama algoritmasının tamamlanması 3.078 saniye sürer, ancak en küçük bir Windows buluşsal yöntemle uygulanan aynı problem yalnızca: 0.123 saniye
Reed Debaets

2
HAHA, prolog (tek başına) BUNU ASLA ÇÖZMEZ. Büyük harfler için özür dilerim ama 10 ya da 15 yıl önce aynı fikirdeydim ve tamamen başarısız oldum. Yavaş olduğundan değil, hayır. Basit bir gerçek dünya vakasını çözemez;)!
Karussell




3

Tam olarak bunu yapan, yaygın olarak kullanılan bir planlama motoru üzerinde çalışıyorum. Evet, NP-Complete; en iyi yaklaşımlar, en uygun çözüme yaklaşmaya çalışır. Ve elbette, hangisinin "en iyi" çözüm olduğunu söylemenin birçok farklı yolu var - örneğin öğretmenlerinizin programlarından memnun olması mı yoksa öğrencilerin tüm sınıflarına girmesi mi daha önemli?

Erken çözmeniz gereken en önemli soru, bu sistemi planlamanın bir yolunu diğerinden daha iyi yapan şey nedir ? Yani, Bayan Jones'un 8 yaşında Matematik öğrettiği ve Bay Smith'in 9 yaşında Matematik öğrettiği bir programım varsa, bu her ikisinin de 10 yaşında Matematik öğrettiği bir programdan daha mı iyi yoksa daha mı kötü? Bayan Jones'un 8'de ve Bay Jones'un 2'de ders vermesinden daha mı iyi yoksa kötü mü? Neden?

Burada vereceğim temel tavsiye, sorunu olabildiğince çok bölmek - belki derse göre, belki öğretmenden öğretmene, belki oda oda - ve önce alt problemi çözmeye çalışmaktır. Orada, aralarından seçim yapabileceğiniz birden fazla çözüm bulmalısınız ve en uygun olanı seçmeniz gerekir. Daha sonra, "önceki" alt problemlerin, potansiyel çözümlerini puanlarken sonraki alt problemlerin ihtiyaçlarını hesaba katması için çalışın. Ardından, "geçerli çözüm yok" durumuna geldiğinizde, kendinizi köşeye çekilmiş durumlardan nasıl kurtaracağınız üzerinde çalışın (önceki alt problemlerde bu durumları tahmin edemeyeceğinizi varsayarak).

Yerel arama optimizasyonu geçişi, genellikle daha iyi sonuçlar için son yanıtı "cilalamak" için kullanılır.

Genelde okul planlamasında yüksek düzeyde kaynak kısıtlı sistemlerle uğraştığımızı unutmayın. Okullar, günün% 75'inde salonda oturan çok sayıda boş oda veya öğretmenle yılı geçirmiyor. Çözüm açısından zengin ortamlarda en iyi şekilde çalışan yaklaşımlar, okul planlamasında mutlaka uygulanabilir değildir.


2

Genel olarak, kısıt programlama, bu tür zamanlama problemine iyi bir yaklaşımdır. Hem yığın taşması içinde hem de Google'da "kısıt programlama" ve zamanlama veya "kısıtlamaya dayalı zamanlama" üzerine bir arama, bazı iyi referanslar oluşturacaktır. İmkansız değil - doğrusal veya tamsayı optimizasyonu gibi geleneksel optimizasyon yöntemlerini kullanırken düşünmek biraz zor. Çıktılardan biri - tüm gereksinimleri karşılayan bir program var mı? Bu, kendi başına açıkça yardımcı olur.

İyi şanslar !


2

Hem sınıf ders çizelgesi hem de sınav çizelgesi için ticari algoritmalar tasarladım. İlk olarak tamsayı programlamayı kullandım; ikincisi için, geliştirilmiş orijinal manuel sürece çok benzer şekilde, slot takasları seçerek objektif bir işlevi maksimize etmeye dayalı bir buluşsal yöntem. Bu tür çözümlerin kabul edilmesini sağlamanın ana unsurları, tüm gerçek dünya kısıtlamalarını temsil etme becerisidir; ve zaman çizelgecilerinin çözümü iyileştirmenin yollarını görememeleri. Sonuçta, algoritmik kısım, veritabanlarının hazırlanması, kullanıcı arayüzü, oda kullanımı, kullanıcı eğitimi gibi istatistikler hakkında raporlama yeteneği ile karşılaştırıldığında oldukça basit ve uygulaması kolaydı.


2

Bunu genetik algoritmalarla halledebilirsiniz, evet. Ama yapmamalısın :). Çok yavaş olabilir ve parametre ayarı çok zaman alıcı olabilir, vb.

Başarılı başka yaklaşımlar var. Tümü açık kaynaklı projelerde uygulanmıştır:

  • Kısıtlamaya dayalı yaklaşım
    • Uygulanacak UNITIME (gerçekten okullar için)
    • Ayrıca daha ileri gidebilir ve Tamsayı programlamayı kullanabilirsiniz. Ticari yazılımı (ILOG CPLEX) kullanarak Udine üniversitesinde ve ayrıca Bayreuth Üniversitesinde (oraya dahil oldum) başarıyla yapıldı
    • Heuristisc ile kural tabanlı yaklaşım - Bkz. Drools planlayıcı
  • Farklı buluşsal yöntemler - FET ve benimki

Bir ders çizelgeleme yazılımı listesi için buraya bakın


0

Bence genetik algoritma kullanmalısınız çünkü:

  • En çok büyük sorun durumları için uygundur.
  • Yanlış yanıtın fiyatına göre azaltılmış zaman karmaşıklığı sağlar (Nihai en iyi değil)
  • Karşılanmayanlar için fitness cezalarını ayarlayarak kısıtlamaları ve tercihleri ​​kolayca belirleyebilirsiniz.
  • Programın yürütülmesi için zaman sınırı belirleyebilirsiniz.
  • Çözümün kalitesi, programı çözmek için ne kadar zaman harcamak istediğinize bağlıdır.

    Genetik Algoritmalar Tanımı

    Genetik Algoritmalar Eğitimi

    GA ile sınıf planlama projesi

Ayrıca şuna bir göz atın: benzer bir soru ve başka bir soru


0

Kimsenin bu koda katılacağını bilmiyorum ama bu kodu kendi algoritmamın yardımıyla geliştirdim ve benim için Ruby'de çalışıyor umarım aşağıdaki kodda periodflag, dayflag kodunda onu arayanlara yardımcı olur. subjectflag ve teacherflag, karşılık gelen id ve Boolean olan bayrak değerine sahip karmadır. Herhangi bir sorun bana ulaşın ....... (-_-)

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
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.