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.
Jawaban:
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:
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.
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".
sumber
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:
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.
sumber
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:
sumber
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.
sumber
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".
sumber
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"):
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).
sumber
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.
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.
sumber
Algoritma genetik sering digunakan untuk penjadwalan semacam itu.
Temukan contoh ini (Membuat Jadwal Kelas Menggunakan Algoritma Genetik) yang sangat sesuai dengan kebutuhan Anda.
sumber
Berikut beberapa tautan yang saya temukan:
Jadwal sekolah - Buat daftar beberapa masalah yang terlibat
Algoritma Genetik Hibrid untuk Penetapan Waktu Sekolah
Utilitas dan Alat Penjadwalan
sumber
Makalah ini menjelaskan masalah jadwal sekolah dan pendekatan mereka terhadap algoritme dengan cukup baik: " Pengembangan SYLLABUS — Penjadwal Berbasis Kendala yang Interaktif untuk Sekolah dan Kolese. " [PDF]
Penulis memberi tahu saya bahwa perangkat lunak SYLLABUS masih digunakan / dikembangkan di sini: http://www.scientia.com/uk/
sumber
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.
sumber
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 !
sumber
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.
sumber
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:
Lihat di sini untuk daftar perangkat lunak penjadwalan
sumber
Saya pikir Anda harus menggunakan algoritma genetika karena:
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
sumber
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 |
sumber