Algoritma untuk membuat jadwal sekolah

96

Saya bertanya-tanya apakah ada solusi yang dikenal untuk algoritma membuat jadwal sekolah. Pada dasarnya, ini tentang mengoptimalkan "dispersi jam" (baik dalam kasus guru dan kelas) untuk asosiasi kelas-mata pelajaran-guru tertentu. Kita dapat berasumsi bahwa kita memiliki sekumpulan kelas, mata pelajaran dan guru yang terkait satu sama lain pada saat input dan bahwa jadwal harus sesuai antara pukul 8 pagi dan 4 sore.

Saya rasa mungkin tidak ada algoritme yang akurat untuk itu, tetapi mungkin seseorang mengetahui perkiraan atau petunjuk yang baik untuk mengembangkannya.

cand
sumber
2
Terima kasih atas semua jawabannya. Sepertinya algoritme memerlukan penyelidikan lebih lanjut. Saya akan menganggapnya sebagai mata pelajaran yang baik untuk tesis master atau aplikasi komersial kecil. Jika saya menulis satu, saya akan memberi tahu Anda di sini;)
cand
10
Seperti yang dikatakan Ian Ringrose dari StackOverflow untuk pertanyaan lain, "masih banyak PHD yang bisa didapat dalam perangkat lunak penjadwalan."
Reed Debaets

Jawaban:

89

Masalah ini NP-Complete !
Singkatnya, orang perlu menjelajahi semua kemungkinan kombinasi untuk menemukan daftar solusi yang dapat diterima. Karena variasi dalam situasi di mana masalah muncul di berbagai sekolah (misalnya: Apakah ada kendala terkait ruang kelas ?, Apakah beberapa kelas kadang-kadang terbagi dalam subkelompok ?, Apakah ini jadwal mingguan? dll.) tidak ada kelas masalah yang dikenal yang sesuai dengan semua masalah penjadwalan. Mungkin, masalah Knapsack memiliki banyak elemen yang sama dengan masalah ini secara umum.

Konfirmasi bahwa ini adalah masalah yang sulit dan yang selalu dicari solusinya oleh orang-orang, adalah dengan memeriksa daftar (panjang) alat penjadwalan perangkat lunak (kebanyakan komersial) ini

Karena banyaknya variabel yang terlibat, sumber terbesarnya, biasanya, keinginan anggota fakultas; -) ..., biasanya tidak praktis untuk mempertimbangkan menghitung semua kemungkinan kombinasi . Sebaliknya, kita perlu memilih pendekatan yang mengunjungi bagian dari ruang masalah / solusi.
- Algoritma Genetika , dikutip dalam jawaban lain adalah (atau, IMHO, sepertinya ) dilengkapi dengan baik untuk melakukan pencarian semi-terpandu semacam ini (Masalahnya adalah menemukan fungsi evaluasi yang baik untuk kandidat yang akan disimpan untuk generasi berikutnya)
- Grafik Pendekatan penulisan ulang juga digunakan dengan jenis masalah optimasi kombinatorial ini.

Daripada berfokus pada implementasi tertentu dari program pembuat jadwal otomatis, saya ingin menyarankan beberapa strategi yang dapat diterapkan, pada tingkat definisi masalah .
Alasan umum adalah bahwa dalam sebagian besar masalah penjadwalan dunia nyata, beberapa kompromi akan diperlukan, tidak semua kendala, tersurat maupun tersirat: akan dipenuhi sepenuhnya. Oleh karena itu kami membantu diri kami sendiri dengan:

  • Mendefinisikan dan memberi peringkat semua kendala yang diketahui
  • Mengurangi ruang masalah, secara manual, menyediakan satu set kendala tambahan .
    Ini mungkin tampak kontra-intuitif tetapi misalnya dengan memberikan jadwal awal yang terisi sebagian (katakanlah kira-kira 30% dari slot waktu), dengan cara yang sepenuhnya memenuhi semua batasan, dan dengan mempertimbangkan jadwal parsial ini tidak dapat diubah, kami secara signifikan mengurangi waktu / ruang yang dibutuhkan untuk menghasilkan solusi kandidat.
    Cara lain bantuan kendala tambahan misalnya "secara artifisial" menambahkan kendala yang mencegah pengajaran beberapa mata pelajaran pada beberapa hari dalam seminggu (jika ini adalah jadwal mingguan ...); Jenis kendala ini menghasilkan pengurangan ruang masalah / solusi, tanpa, biasanya, mengecualikan sejumlah besar kandidat yang baik.
  • Memastikan bahwa beberapa kendala masalah dapat dihitung dengan cepat. Ini sering dikaitkan dengan pilihan model data yang digunakan untuk merepresentasikan masalah; Idenya adalah untuk dapat dengan cepat memilih (atau memangkas) beberapa opsi.
  • Mendefinisikan ulang masalah dan mengizinkan beberapa kendala untuk dipecahkan, beberapa kali, (biasanya menuju node akhir grafik). Idenya di sini adalah untuk menghilangkan beberapa kendala untuk mengisi beberapa slot terakhir dalam jadwal, atau membuat program generator jadwal otomatis berhenti malu untuk menyelesaikan seluruh jadwal, alih-alih memberi kami daftar selusin atau lebih yang masuk akal kandidat. Seorang manusia sering kali berada dalam posisi yang lebih baik untuk menyelesaikan teka-teki, seperti yang ditunjukkan, mungkin memecahkan beberapa kendala, menggunakan informasi yang biasanya tidak dibagikan dengan logika otomatis (misalnya, aturan "Tidak ada matematika di sore hari" kadang-kadang dapat dipatahkan untuk kelas "matematika dan fisika tingkat lanjut"; atau "Lebih baik melanggar salah satu persyaratan Tuan Jones daripada salah satu dari Ms Smith ... ;-))

Dalam pembacaan ulang jawaban ini, saya menyadari bahwa agak malu memberikan tanggapan yang pasti, tetapi tetap saja penuh dengan saran praktis. Saya berharap bantuan ini, dengan apa, bagaimanapun, adalah "masalah sulit".

mjv
sumber
1
Jawaban yang bagus, akurat dan terperinci, terima kasih atas petunjuknya dan sebutkan tentang Kelengkapan NP (itu juga tebakan saya).
cand
3
Apakah Anda memiliki kutipan yang menjelaskan kelengkapan NP dari masalah ini?
Don
50

Ini berantakan. kekacauan kerajaan. Untuk menambah jawaban, udah lengkap banget, saya mau tunjukkan pengalaman keluarga saya. Ibu saya adalah seorang guru dan dulu terlibat dalam proses tersebut.

Ternyata memiliki komputer untuk melakukannya tidak hanya sulit untuk dikodekan sendiri, tetapi juga sulit karena terdapat kondisi yang sulit untuk ditentukan ke program komputer yang sudah dipanggang. Contoh:

  • seorang guru mengajar di sekolah Anda dan di institut lain. Jelasnya, jika dia mengakhiri pelajaran di sana pada pukul 10.30, dia tidak dapat mulai di tempat Anda pada pukul 10.30, karena dia membutuhkan waktu untuk bolak-balik antar institut.
  • dua guru sudah menikah. Secara umum, dianggap praktik yang baik untuk tidak memiliki dua guru yang sudah menikah di kelas yang sama. Oleh karena itu, kedua guru ini harus memiliki dua kelas yang berbeda
  • dua guru sudah menikah, dan anak mereka bersekolah di sekolah yang sama. Sekali lagi, Anda harus mencegah kedua guru tersebut untuk mengajar di kelas tertentu di mana anak mereka berada.
  • sekolah memiliki fasilitas terpisah, seperti satu hari kelas berada di satu institut, dan hari lain kelas di hari lain.
  • sekolah telah berbagi laboratorium, tetapi laboratorium ini hanya tersedia pada hari kerja tertentu (untuk alasan keamanan, misalnya, di mana diperlukan personel tambahan).
  • beberapa guru memiliki preferensi untuk hari bebas: beberapa lebih suka pada hari Senin, beberapa pada hari Jumat, beberapa pada hari Rabu. Beberapa memilih untuk datang lebih awal di pagi hari, beberapa lebih memilih untuk datang nanti.
  • Anda seharusnya tidak memiliki situasi di mana Anda memiliki pelajaran, katakanlah, sejarah pada jam pertama, lalu tiga jam matematika, lalu satu jam lagi sejarah. Ini tidak masuk akal bagi para siswa, atau untuk guru.
  • Anda harus menyebarkan argumen secara merata. Tidak masuk akal untuk memiliki hari-hari pertama dalam satu minggu hanya matematika, dan kemudian sisa minggu ini hanya literatur.
  • Anda harus memberi beberapa guru dua jam berturut-turut untuk melakukan tes evaluasi.

Seperti yang Anda lihat, masalahnya bukan NP-complete, ini NP-insane.

Jadi yang mereka lakukan adalah mereka memiliki meja besar dengan sisipan plastik kecil, dan mereka memindahkan sisipan tersebut sampai diperoleh hasil yang memuaskan. Mereka tidak pernah memulai dari awal: mereka biasanya memulai dari jadwal tahun sebelumnya dan membuat penyesuaian.

Stefano Borini
sumber
12
"NP-insane" - nama yang bagus;) Saya setuju bahwa ini benar-benar masalah yang kompleks, terima kasih atas komentarnya tentang pengobatan "dunia nyata" untuk masalah ini. Ayah dan pacar saya adalah guru juga dan saya tahu bahwa sebagian besar sekolah memiliki meja dengan sisipan plastik - ini membuat saya memikirkan kemungkinan algoritme untuk masalah ini - karena, jika seorang pria dapat menyelesaikannya, mungkin akan memungkinkan untuk menulis itu sebagai algoritma.
cand
10
yang ingin Anda tulis adalah sistem pakar: sistem yang dibuat dari sekumpulan aturan heuristik. Selain sistem pakar, ini adalah bidang di mana algoritme genetika adalah salah satu taruhan terbaik. Kesulitan tidak terletak pada pemecahan masalah, bukan hanya. Kesulitan juga terletak pada pengungkapan masalah dan batasannya.
Stefano Borini
1
Anda benar, masalahnya memerlukan penyediaan kumpulan kondisi dan batasan yang kompleks untuk dipenuhi, mungkin dengan peringkat solusi yang "dapat diterima". Saya setuju tentang algoritma genetika, mereka harus cocok dengan masalah ini, juga saya pikir akan lebih baik untuk mulai mengembangkan dengan serangkaian kondisi sederhana, dan meningkatkannya saat jawaban yang benar untuk mereka diperoleh.
cand
1
Anda juga dapat secara langsung menerjemahkan batasan dan tujuan ini ke dalam MAXSAT. Algoritme MAXSAT umumnya lebih andal daripada algoritme genetika, tetapi Anda mungkin mengalami ledakan klausa karena tujuan seperti kelas matematika harus disebarkan selama seminggu.
Jules
27

Kompetisi Penentuan Waktu Internasional 2007 memiliki jalur penjadwalan pelajaran dan jalur penjadwalan ujian. Banyak peneliti yang berpartisipasi dalam kompetisi itu. Banyak heuristik dan metaheuristik yang dicoba, tetapi pada akhirnya metaheuristik pencarian lokal (seperti Tabu Search dan Simulated Annealing) dengan jelas mengalahkan algoritma lain (seperti algoritma genetika).

Lihat 2 kerangka kerja sumber terbuka yang digunakan oleh beberapa finalis:

Geoffrey De Smet
sumber
17

Salah satu tugas paruh waktu saya adalah membuat tabel sekolah dengan algoritme genetika.

Seluruh meja adalah satu "organisme". Ada beberapa perubahan dan peringatan pada pendekatan algoritma genetika generik:

  • Aturan dibuat untuk "tabel ilegal": dua kelas di kelas yang sama, satu guru mengajar dua kelompok pada waktu yang sama, dll. Mutasi ini langsung dianggap mematikan dan "organisme" baru tumbuh menggantikan "almarhum" dengan segera. Yang pertama dihasilkan oleh serangkaian percobaan acak untuk mendapatkan yang legal (jika tidak masuk akal). Mutasi yang mematikan tidak dihitung dalam hitungan mutasi dalam iterasi.

  • Mutasi "pertukaran" jauh lebih umum daripada mutasi "Modifikasi". Perubahan hanya terjadi antara bagian gen yang masuk akal - tidak ada yang menggantikan guru dengan ruang kelas.

  • Bonus kecil diberikan untuk menggabungkan 2 jam tertentu bersama, untuk menetapkan kelas umum yang sama secara berurutan untuk kelompok yang sama, untuk menjaga jam kerja guru dan beban kelas terus menerus. Bonus sedang diberikan untuk memberikan ruang kelas yang benar untuk mata pelajaran yang diberikan, menjaga jam kelas tetap dalam ikatan (pagi atau sore), dan semacamnya. Bonus besar adalah untuk menetapkan jumlah mata pelajaran yang diberikan dengan benar, beban kerja yang diberikan untuk seorang guru, dll.

  • Guru dapat membuat jadwal beban kerja mereka "ingin bekerja kemudian", "oke bekerja kemudian", "tidak suka bekerja lalu", "tidak bisa bekerja", dengan bobot yang ditetapkan. Seluruh jam 24 jam adalah jam kerja legal kecuali waktu malam sangat tidak diinginkan.

  • Fungsi bobot ... oh ya. Fungsi bobot sangat besar, produk mengerikan (seperti dalam perkalian) bobot yang ditetapkan ke fitur dan properti yang dipilih. Itu sangat curam, satu properti dengan mudah dapat mengubahnya dengan urutan besarnya ke atas atau ke bawah - dan ada ratusan atau ribuan properti dalam satu organisme. Ini menghasilkan angka yang sangat BESAR sebagai bobot, dan sebagai akibat langsung, perlu menggunakan perpustakaan bignum (gmp) untuk melakukan perhitungan. Untuk testcase kecil yang terdiri dari 10 kelompok, 10 guru dan 10 ruang kelas, set awal dimulai dengan catatan 10 ^ -200sesuatu dan diakhiri dengan 10 ^ + 300something. Itu sama sekali tidak efisien ketika lebih datar. Juga, nilai-nilai tumbuh jauh lebih jauh dengan "sekolah" yang lebih besar.

  • Dari segi waktu komputasi, ada sedikit perbedaan antara populasi kecil (100) dalam waktu lama dan populasi besar (10k +) selama beberapa generasi. Perhitungan pada waktu yang sama menghasilkan kualitas yang hampir sama.

  • Perhitungan (pada beberapa CPU 1GHz) akan membutuhkan waktu 1 jam untuk stabil di dekat 10 ^ + 300, menghasilkan jadwal yang terlihat cukup bagus, untuk kasus uji 10x10x10 tersebut.

  • Masalahnya mudah dilumpuhkan dengan menyediakan fasilitas jaringan yang akan bertukar spesimen terbaik antara komputer yang menjalankan komputasi.

Program yang dihasilkan tidak pernah melihat siang hari di luar memberi saya nilai bagus untuk semester itu. Ini menunjukkan beberapa janji tetapi saya tidak pernah mendapatkan motivasi yang cukup untuk menambahkan GUI dan membuatnya dapat digunakan untuk umum.

SF.
sumber
5
Jadi buka dan iklankan dan coba dan ajak beberapa akademisi ke dalamnya? Gunakan kembali untuk proyek selanjutnya? Secara teknis, program seperti itu untuk 300 staf saja akan bernilai uang bagi sekolah untuk menghasilkan jadwal yang optimal, dan mereka tidak keberatan menghabiskan beberapa hari untuk menghitung jadwal optimal secara genetik. Pikirkan pemrosesan batch. Halo kontrak perangkat keras dan perangkat lunak;)
jcolebrand
1
Kedengarannya bagus! Saya ingin tahu apakah fungsi bobot bisa dilakukan dengan float di kisaran 0..1.
Craig McQueen
1
@Craig: Sesuatu yang datar akan menghasilkan populasi yang stagnan atau bahkan menurun kualitasnya dari waktu ke waktu, karena mutasi acak berkontribusi lebih banyak perubahan negatif daripada yang dapat diimbangi oleh pemuliaan / seleksi. Hanya fungsi kualitas yang sangat curam yang akan memberikan pertumbuhan yang stabil. Tentu fungsinya bisa dinormalisasi, tapi tetap saja, gen "notch better" harus memiliki kesempatan lebih tinggi untuk bertahan hidup.
SF.
9

Masalah ini lebih sulit dari yang terlihat.

Seperti yang telah disinggung orang lain, ini adalah masalah NP-complete, tapi mari kita analisis apa artinya.

Pada dasarnya, ini berarti Anda harus melihat semua kemungkinan kombinasi.

Tetapi "melihat" tidak memberi tahu Anda banyak hal yang perlu Anda lakukan.

Menghasilkan semua kemungkinan kombinasi itu mudah. Ini mungkin menghasilkan sejumlah besar data, tetapi Anda seharusnya tidak memiliki banyak masalah dalam memahami konsep bagian masalah ini.

Masalah kedua adalah menilai apakah kombinasi yang mungkin diberikan baik, buruk, atau lebih baik daripada solusi "baik" sebelumnya.

Untuk ini, Anda memerlukan lebih dari sekadar "apakah ini solusi yang mungkin".

Misalnya, apakah guru yang sama bekerja 5 hari seminggu selama X minggu berturut-turut? Sekalipun itu adalah solusi yang berhasil, itu mungkin bukan solusi yang lebih baik daripada bergantian antara dua orang sehingga masing-masing guru melakukannya satu minggu. Oh, kamu tidak memikirkan itu? Ingat, ini adalah orang yang Anda hadapi, bukan hanya masalah alokasi sumber daya.

Bahkan jika seorang guru dapat bekerja penuh waktu selama 16 minggu berturut-turut, itu mungkin merupakan solusi yang kurang optimal dibandingkan dengan solusi di mana Anda mencoba untuk bergantian di antara guru, dan jenis penyeimbangan ini sangat sulit untuk dibangun ke dalam perangkat lunak.

Ringkasnya, menghasilkan solusi yang baik untuk masalah ini akan sangat bermanfaat bagi banyak orang. Oleh karena itu, bukanlah masalah yang mudah untuk dipecah dan dipecahkan. Bersiaplah untuk melihat beberapa tujuan yang tidak 100% dan menyebutnya "cukup baik".

Lasse V. Karlsen
sumber
1
Nah, saya berpendapat bahwa agak sulit untuk mengetahui semua kendala di awal, itu membutuhkan pengalaman dan penyelidikan masalah tersebut. Saya lebih suka membagi masalah menjadi dua bagian terpisah dan mengembangkannya secara bersamaan. Pertama adalah struktur algoritme umum - mengatakan bagaimana ia harus mengisi "generasi jadwal berikutnya", bukan konsep mekanisme, tanpa terlalu banyak "logika subjek" di belakangnya (mungkin algoritme genetika). Yang kedua adalah penyedia aturan dengan serangkaian batasan yang memeriksa "ketepatan" jadwal - ini bisa sederhana pada awalnya dan ditingkatkan nanti.
cand
8

Algoritme penjadwalan saya, diterapkan di FET (Perangkat Lunak Pengatur Waktu Gratis, http://lalescu.ro/liviu/fet/ , aplikasi yang berhasil):

Algoritmanya bersifat heuristik. Saya menamakannya "pertukaran rekursif".

Input: satu set aktivitas A_1 ... A_n dan batasannya.

Keluaran: sekumpulan waktu TA_1 ... TA_n (slot waktu setiap aktivitas. Ruangan dikecualikan di sini, untuk kesederhanaan). Algoritme harus menempatkan setiap aktivitas pada satu slot waktu, dengan memperhatikan batasan. Setiap TA_i adalah antara 0 (T_1) dan max_time_slots-1 (T_m).

Batasan:

C1) Dasar: daftar pasangan kegiatan yang tidak dapat dilakukan secara bersamaan (misalnya, A_1 dan A_2, karena memiliki guru yang sama atau siswa yang sama);

C2) Banyak kendala lain (dikecualikan di sini, untuk kesederhanaan).

Algoritme penjadwalan (yang saya beri nama "pertukaran rekursif"):

  1. Urutkan aktivitas, paling sulit dulu. Bukan langkah kritis, tetapi mempercepat algoritme mungkin 10 kali atau lebih.
  2. Cobalah untuk menempatkan setiap aktivitas (A_i) dalam slot waktu yang diizinkan, mengikuti urutan di atas, satu per satu. Cari slot yang tersedia (T_j) untuk A_i, di mana aktivitas ini dapat ditempatkan dengan memperhatikan batasan. Jika lebih banyak slot tersedia, pilih satu secara acak. Jika tidak ada yang tersedia, lakukan pertukaran rekursif:

    a . Untuk setiap slot waktu T_j, pertimbangkan apa yang terjadi jika Anda meletakkan A_i ke T_j. Akan ada daftar kegiatan lain yang tidak setuju dengan perpindahan ini (misalnya, kegiatan A_k ada di slot yang sama T_j dan memiliki guru atau siswa yang sama dengan A_i). Buat daftar aktivitas yang bertentangan untuk setiap slot waktu T_j.

    b . Pilih slot (T_j) dengan jumlah aktivitas bentrok terendah. Katakanlah daftar aktivitas di slot ini berisi 3 aktivitas: A_p, A_q, A_r.

    c . Tempatkan A_i di T_j dan buat A_p, A_q, A_r tidak terisi.

    d . Secara rekursif coba tempatkan A_p, A_q, A_r (jika level rekursi tidak terlalu besar, katakanlah 14, dan jika jumlah total panggilan rekursif dihitung sejak langkah 2) pada A_i mulai tidak terlalu besar, katakanlah 2 * n), seperti pada langkah 2).

    e . Jika berhasil menempatkan A_p, A_q, A_r, kembalikan dengan sukses, jika tidak coba slot waktu lain (lanjutkan ke langkah 2 b) dan pilih slot waktu terbaik berikutnya).

    f . Jika semua (atau sejumlah) slot waktu tidak berhasil dicoba, kembalikan tanpa hasil.

    g . Jika kita berada di level 0, dan tidak berhasil menempatkan A_i, letakkan seperti di langkah 2 b) dan 2 c), tetapi tanpa rekursi. Kami sekarang memiliki 3 - 1 = 2 aktivitas lagi untuk ditempatkan. Lanjutkan ke langkah 2) (beberapa metode untuk menghindari bersepeda digunakan di sini).

Liviu Lalescu
sumber
1
FET sangat berguna bagi saya. Terima kasih @Liviu Lalescu!
Noel Llevares
6

PEMBARUAN: dari komentar ... harus memiliki heuristik juga!

Saya akan menggunakan Prolog ... lalu menggunakan Ruby atau Perl atau sesuatu untuk membersihkan solusi Anda menjadi bentuk yang lebih cantik.

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

Saya (masih) dalam proses melakukan sesuatu yang mirip dengan masalah ini tetapi menggunakan jalur yang sama seperti yang baru saja saya sebutkan. Prolog (sebagai bahasa fungsional) sangat memudahkan pemecahan masalah NP-Hard.

Debet Buluh
sumber
1
Prolog tentu saja merupakan bahasa yang bagus untuk mengungkapkan masalah yang diperlukan, namun seperti yang Anda tunjukkan: masalah IS NP-complete, jika bukan NP-Hard. Ini berarti Prolog mungkin tidak cukup cepat untuk implementasi praktis.
Poindexter
3
jika ada hubungannya dengan NP dan kami tidak akan puas dengan perkiraan, algoritme deterministik apa pun akan menyedot secara eksponensial :)
Gabriel Ščerbák
1
Tujuannya kemudian, adalah untuk mengimplementasikan heuristik yang efektif ... misalnya algoritma penjadwalan tugas 9 sederhana membutuhkan 3.078 detik untuk diselesaikan, tetapi dengan heuristik WindowsFirst yang diimplementasikan, masalah yang sama hanya membutuhkan: 0,123
Reed Debaets
2
HAHA, prolog (sendiri) TIDAK AKAN PERNAH MEMECAHKAN INI. Maaf untuk huruf besar, tapi saya memiliki ide yang sama 10 atau 15 tahun yang lalu dan gagal total. Bukan karena lambat, tidak. Sederhana saja tidak bisa menyelesaikan kasus dunia nyata;)!
Karussell
3

Saya mengerjakan mesin penjadwalan yang banyak digunakan yang melakukan hal ini. Ya, ini NP-Complete; pendekatan terbaik berusaha mendekati solusi optimal. Dan, tentu saja ada banyak cara berbeda untuk mengatakan mana yang merupakan solusi "terbaik" - apakah lebih penting guru Anda senang dengan jadwal mereka, atau bahwa siswa masuk ke semua kelas, misalnya?

Pertanyaan paling penting mutlak yang perlu Anda selesaikan sejak awal adalah apa yang membuat salah satu cara penjadwalan sistem ini lebih baik daripada yang lain ? Artinya, jika saya memiliki jadwal dengan Nyonya Jones mengajar Matematika pada jam 8 dan Tuan Smith mengajar Matematika pada jam 9, apakah itu lebih baik atau lebih buruk daripada mereka berdua mengajar Matematika pada jam 10? Apakah lebih baik atau lebih buruk dibandingkan dengan Nyonya Jones mengajar pada 8 dan Tuan Jones mengajar pada 2? Mengapa?

Nasihat utama yang akan saya berikan di sini adalah membagi masalah sebanyak mungkin - mungkin kursus demi kursus, mungkin guru demi guru, mungkin kamar demi kamar - dan bekerja untuk memecahkan sub-masalah terlebih dahulu. Di sana Anda harus mendapatkan beberapa solusi untuk dipilih, dan harus memilih salah satu sebagai solusi yang paling mungkin optimal. Kemudian, bekerja untuk membuat sub-masalah "sebelumnya" memperhitungkan kebutuhan sub-masalah selanjutnya dalam menilai solusi potensial mereka. Kemudian, mungkin bekerja tentang cara mengeluarkan diri Anda dari situasi yang sulit dipahami (dengan asumsi Anda tidak dapat mengantisipasi situasi tersebut di sub-masalah sebelumnya) saat Anda mencapai keadaan "tidak ada solusi yang valid".

Kartu pengoptimalan penelusuran lokal sering kali digunakan untuk "menyempurnakan" jawaban akhir agar mendapatkan hasil yang lebih baik.

Perhatikan bahwa biasanya kita berurusan dengan sistem yang sangat terbatas sumber daya dalam penjadwalan sekolah. Sekolah tidak melewati tahun dengan banyak ruang kosong atau guru duduk di ruang tunggu 75% dari hari. Pendekatan yang bekerja paling baik di lingkungan kaya solusi tidak selalu berlaku dalam penjadwalan sekolah.

Tom Dibble
sumber
2

Secara umum, pemrograman kendala adalah pendekatan yang baik untuk jenis masalah penjadwalan ini. Pencarian di "pemrograman kendala" dan penjadwalan atau "penjadwalan berbasis kendala" baik dalam stack overflow dan di Google akan menghasilkan beberapa referensi yang baik. Bukan tidak mungkin - hanya sedikit sulit untuk dipikirkan saat menggunakan metode pengoptimalan tradisional seperti pengoptimalan linier atau integer. Salah satu keluarannya adalah - apakah ada jadwal yang memenuhi semua persyaratan? Itu sendiri jelas sangat membantu.

Semoga berhasil !

Grembo
sumber
2

Saya telah merancang algoritma komersial untuk penjadwalan kelas dan penjadwalan ujian. Untuk yang pertama saya menggunakan pemrograman integer; untuk yang kedua, heuristik berdasarkan pada memaksimalkan fungsi objektif dengan memilih slot swap, sangat mirip dengan proses manual asli yang telah dikembangkan. Hal utama agar solusi tersebut diterima adalah kemampuan untuk mewakili semua kendala dunia nyata; dan untuk penjadwal waktu manusia agar tidak dapat melihat cara untuk meningkatkan solusi. Pada akhirnya bagian algoritmik cukup sederhana dan mudah diimplementasikan dibandingkan dengan persiapan database, antarmuka pengguna, kemampuan untuk melaporkan statistik seperti pemanfaatan ruangan, pendidikan pengguna dan sebagainya.

Permaquid
sumber
2

Anda bisa mengambilnya dengan algoritma genetika, ya. Tapi sebaiknya jangan :). Ini bisa terlalu lambat dan penyetelan parameter bisa terlalu memakan waktu dll.

Ada pendekatan lain yang berhasil. Semua diimplementasikan dalam proyek open source:

  • Pendekatan berbasis kendala
    • Diterapkan di UniTime (tidak benar-benar untuk sekolah)
    • Anda juga bisa melangkah lebih jauh dan menggunakan pemrograman Integer. Berhasil dilakukan di universitas Udine dan juga di Universitas Bayreuth (saya pernah terlibat di sana) menggunakan perangkat lunak komersial (ILOG CPLEX)
    • Pendekatan berbasis aturan dengan heuristisc - Lihat perencana Drools
  • Heuristik berbeda - FET dan saya sendiri

Lihat di sini untuk daftar perangkat lunak penjadwalan

Karussell
sumber
0

Saya pikir Anda harus menggunakan algoritma genetika karena:

  • Ini paling cocok untuk kasus masalah besar.
  • Ini menghasilkan kompleksitas waktu yang berkurang pada harga jawaban yang tidak akurat (Bukan yang terbaik)
  • Anda dapat menentukan batasan & preferensi dengan mudah dengan menyesuaikan hukuman kebugaran untuk yang tidak terpenuhi.
  • Anda dapat menentukan batas waktu untuk eksekusi program.
  • Kualitas solusi tergantung pada berapa banyak waktu yang Anda ingin habiskan untuk menyelesaikan program ..

    Definisi Algoritma Genetika

    Tutorial Algoritma Genetika

    Proyek penjadwalan kelas dengan GA

Lihat juga: pertanyaan serupa dan satu lagi

Betamoo
sumber
0

Saya tidak tahu ada yang akan setuju dengan kode ini tetapi saya mengembangkan kode ini dengan bantuan algoritma saya sendiri dan bekerja untuk saya di ruby. Semoga ini akan membantu mereka yang mencarinya di kode berikut periodflag, dayflag subjectflag dan teacherflag adalah hash dengan id yang sesuai dan nilai flag yaitu Boolean. Ada masalah hubungi saya ....... (-_-)

periodflag. setiap 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
                                                @[email protected]_struct_id
                                                @[email protected]_id
                                                @finaltt.section_id=section.id
                                                @finaltt.standard_id=standard.id
                                                @finaltt.division_id=division.id
                                                @[email protected]_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

sumber