├── 1csv.PNG ├── LICENSE ├── README.md ├── README_AR.md ├── README_EN.md ├── console1.PNG └── result1.PNG /1csv.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SigmaAdrich/CourseMasterX/5bf85cf64471ae5d3e4f0e091e0aba0cc1ae9664/1csv.PNG -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 what 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🎓 CourseMasterX 2 | 快速、高效地解决高校排课问题,让排课变得更轻松! 3 | --- 4 | 适用于按班级排课 5 | 6 | [📄 English](README_EN.md) [📄 عربي ](README_AR.md) 7 | ## ⚙️ **运行要求** 8 | 确保以下环境满足运行需求: 9 | - **操作系统**:🖥️ Windows 10 | - **显卡**:🎮 NVIDIA 显卡,可运行cuda程序(已在 RTX 4070、RTX 2060上测试 ✅,其他型号显卡还未测试) 11 | 12 | --- 13 | 14 | ## 📥 **软件下载** 15 | 16 | 1. **下载并解压程序** 17 | 18 | 📦 下载压缩包后解压。如果操作系统提示存在安全威胁,请选择 **允许运行**。⚠️如果未允许运行,系统会自动删除程序文件。 19 | 20 | 2. **文件说明**: 21 | 22 | - **`CourseMasterX.exe`**:🚀 主程序文件,双击后即可执行排课任务。 23 | - **`really_data_csv` 文件夹**:📂 包含待排课的样例文件,供测试和参考。 24 | 25 | --- 26 | 27 | ## **程序运行** 28 | 29 | 1. **启动程序** 30 | 双击 `CourseMasterX.exe`,运行默认配置,检查程序是否能够正常启动。 31 | 32 | 2. **设置搜索范围** 33 | 程序启动后,会提示你输入搜索范围。 34 | - **建议输入值:** `9` (数值越大,程序尝试搜索的范围越广)。 35 | 36 | 程序运行截图 37 | 38 | 39 | 3. **运行结果** 40 | 运行结束后,检查是否生成结果文件,包括: 41 | - `result_class_0.csv` 42 | - `result_room_0.csv` 43 | - `result_teacher_0.csv` 44 | - `result_unit_0.csv` 45 | 46 | 如果生成了更多文件,不必担心,这表示程序生成了多个排课方案。 47 | 48 | 结果文件截图 49 | 50 | --- 51 | 52 | ## **高校配置文件说明** 53 | 54 | 成功完成基本操作后,学习如何修改配置文件以满足用户需求。 55 | 56 | ### **配置文件位置** 57 | 所有配置文件都位于 `really_data_csv` 文件夹中。本程序所有涉及的文件均为 **CSV 格式**,可使用 **Office Excel** 或 **WPS Excel** 打开和编辑,也可以用记事本打开直接编辑。 58 | 59 | --- 60 | 61 | ### **配置文件一览表** 62 | | 文件名 | 描述 | 功能 | 63 | |--------------|--------------|----------------------------| 64 | | `class.csv` | 班级信息 | 包含班级人数等信息 | 65 | | `room.csv` | 教室信息 | 包含教室类型和容量等信息 | 66 | | `cut.csv` | 分课信息 | 定义课程分课的具体方式 | 67 | | `unit.csv` | 课程计划 | 需要排课的教学计划 | 68 | 69 | --- 70 | 71 | ### **class.csv** 72 | | 字段名 | 描述 | 类型 | 73 | |--------|-------------------|--------| 74 | | id | 班级id | 自然数 | 75 | | size | 班级人数 | 自然数 | 76 | 77 | --- 78 | 79 | ### **room.csv** 80 | | 字段名 | 描述 | 类型 | 81 | |--------|--------------------------|--------| 82 | | id | 教室id | 自然数 | 83 | | type | 教室类型 | 自然数 | 84 | | size | 容纳人数 | 自然数 | 85 | | 其余字段 | 未使用 | 默认填0,下同 | 86 | 87 | --- 88 | 89 | ### **cut.csv** 90 | | 字段名 | 描述 | 类型 | 91 | |--------|----------------------------------|--------| 92 | | id | 分课id | 自然数 | 93 | | data | 分课方式,例如 `2 2` 或 `4 4 4` | 多个空格分隔的自然数 | 94 | 95 | --- 96 | 97 | ### **unit.csv** 98 | | 字段名 | 描述 | 类型 | 99 | |-----------|-------------------------------------------------------------------|------------| 100 | | class_id | 班级id,可多个,用空格分割 | 自然数 | 101 | | teacher_id| 教师id,可多个,用空格分割 | 自然数 | 102 | | course | 课程id | 自然数 | 103 | | room_type | 所需教室类型,与 `room.csv` 中的 type 字段对应 | 自然数 | 104 | | week_num | 未使用 | - | 105 | | cut | 每周分课方式,对应 `cut.csv` 中的分课id | 自然数 | 106 | | merge | 未使用 | - | 107 | | time_type | 使用的时间配置文件名 | 字符串 | 108 | | vacation | 未使用 | - | 109 | | week_start| 未使用 | - | 110 | | week_end | 未使用 | - | 111 | 112 | --- 113 | 114 | ### **time 文件夹** 115 | 116 | `time` 文件夹中包含两个时间配置文件:`1.csv` 和 `2.csv`,用于自定义上课的时间段。以 `1.csv` 为例: 117 | 118 | | | | | | | | | 119 | |-|-|-|-|-|-|-| 120 | |0|0|0|0|0|1|1| 121 | |0|0|0|0|0|1|1| 122 | |0|0|0|0|0|1|1| 123 | |0|0|0|0|0|1|1| 124 | |0|0|0|0|0|1|1| 125 | |1|1|1|1|1|1|1| 126 | |0|0|0|0|0|1|1| 127 | |0|0|0|0|0|1|1| 128 | |0|0|0|0|0|1|1| 129 | |0|0|0|0|0|1|1| 130 | |0|0|0|0|0|1|1| 131 | |1|1|1|1|1|1|1| 132 | |1|1|1|1|1|1|1| 133 | |1|1|1|1|1|1|1| 134 | |1|1|1|1|1|1|1| 135 | 136 | - 表格包含 7 列,分别对应一周的 7 天,每天有 15 个时间段。 137 | - **被 `1` 标记的时间段**:不可用。 138 | - **被 `0` 标记的时间段**:可用。 139 | - 例如: 140 | - 周一到周五的“上午”有 5 个时间段为 `0`,“下午”也有 5 个时间段为 `0`,这些时间段可以安排课程。 141 | 142 | --- 143 | 144 | ### **特殊情况说明** 145 | 146 | #### 示例问题: 147 | **如果有一门课要求连上 6 节,按照 `1.csv` 的设置,能安排吗?** 148 | 149 | **答:不能**,因为没有任何一个时间区间可以容纳连续 6 节课。 150 | 建议将课程拆分为两次授课,例如“3 3”或“2 4”,确保每次占用课时小于等于 5。 151 | 152 | --- 153 | 154 | ## **结果文件说明** 155 | 156 | 每组尾部数字相同的 CSV 文件为同一套排课方案。例如: 157 | `result_room_0.csv`、`result_teacher_0.csv`、`result_unit_0.csv` 和 `result_class_0.csv` 属于同一结果方案。 158 | 159 | --- 160 | 161 | ### **result_room_0.csv** 162 | | 字段名 | 描述 | 163 | |--------|----------------------------------------------------------------------| 164 | | room | 一个课程计划被安排的教室id | 165 | | course | 课程id | 166 | | day | 3 个数字为 1 组,表示周几、课程起始节次、课程结束节次(字段名可能修改) | 167 | | start | 未使用 | 168 | | end | 未使用 | 169 | | 补充说明 | 文件中的每行对应输入的unit.csv中每行的位置。 | 170 | --- 171 | 172 | ### **result_teacher_0.csv** 173 | | 字段名 | 描述 | 174 | |---------|----------------------------------------------------------------------| 175 | | teachers| 教师id | 176 | | course | 课程id | 177 | | day | 3 个数字为 1 组,表示周几、课程起始节次、课程结束节次(字段名可能修改) | 178 | 179 | --- 180 | 181 | ### **result_unit_0.csv** 182 | | 字段名 | 描述 | 183 | |--------|----------------------------------------------------------------------| 184 | | day | 同上 | 185 | | 补充说明 | 文件中的每行对应输入的unit.csv中每行的位置。 | 186 | --- 187 | 188 | ### **result_class_0.csv** 189 | | 字段名 | 描述 | 190 | |--------|----------------------------------------------------------------------| 191 | | classes| 班级id | 192 | | course | 课程id | 193 | | day | 同上 | 194 | 195 | ## **中小学排课配置文件说明** 196 | 区别于高校,中小学在固定教室排课,需要我们对配置文件做一点修改。 197 | 198 | 程序默认读取的是really_data_csv文件夹下的内容,所以首先将really_school_data_csv里的文件全部拷贝到really_data_csv中,替换到原来的文件。 199 | 200 | 201 | ### **配置文件一览表** 202 | | 文件名 | 描述 | 功能 | 203 | |--------------|--------------|----------------------------| 204 | | `class.csv` | 班级信息 | 实际的班级人数已经不重要了,只要和room中教室的size大于等于班级人数即可 | 205 | | `room.csv` | 教室信息 | 每个教室都改为一个不重复的type类型,保证在unit中分到对应的课程计划 | 206 | | `cut.csv` | 分课信息 | 根据实际情况安排 | 207 | | `unit.csv` | 课程计划 | 每个班级的id和教室的id需要保持一致 | 208 | --- 209 | 210 | 我们逐个来解释下really_school_data_csv中的文件。 211 | 212 | ### **class.csv** 213 | | id | size | 214 | |--------|-------------------| 215 | | 0 | 50 | 216 | | 1 | 50 | 217 | --- 218 | 表示有两个班级,id为0和1,每个班级的人数为50。 219 | 220 | 因为不需要对教室进行安排,所以这里的人数可以随便设置。 221 | 222 | ### **room.csv** 223 | | id | building|floor|name|type|size | 224 | |--------|------|---|------|-----------|--------| 225 | | 0 | 0| 0| 0| 0 | 50 | 226 | | 1 | 0| 0| 0| 0 | 50 | 227 | --- 228 | 这里提供了两个教室,id为0和1,教室尺寸为50,要大于对应的班级人数。 229 | 230 | building、floor、name三个字段未使用,默认0即可。 231 | 232 | ### **cut.csv** 233 | | id | data | 234 | |--------|----------------------------------| 235 | | 0 | 1 1 1 1 1 | 236 | | 1 | 1 1 1 1 | 237 | | 2 | 1 1 1 | 238 | --- 239 | id=0的分课方式,表示一周上5次课,每次上1节。 240 | 241 | id=1的分课方式,表示一周上4次课,每次上1节。 242 | 243 | 每个1之间用空格分割,1改成2也可以,表示每次上2节课。 244 | 245 | 以此类推。 246 | 247 | ### **unit.csv** 248 | | class_id | teacher_id | course | room_type | week_num | cut | merge | time_type | vacation | week_start | week_end | 249 | |----------|------------|--------|-----------|----------|-----|-------|-----------|----------|------------|----------| 250 | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 251 | | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 252 | | 0 | 2 | 2 | 0 | 0 | 0 | 0 | 2.csv | 0 | 0 | 0 | 253 | | 0 | 3 | 3 | 0 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 254 | | 0 | 4 | 4 | 0 | 0 | 0 | 0 | 2.csv | 0 | 0 | 0 | 255 | | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 256 | | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 257 | | 1 | 2 | 2 | 1 | 0 | 0 | 0 | 2.csv | 0 | 0 | 0 | 258 | | 1 | 3 | 3 | 1 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 259 | | 1 | 4 | 4 | 1 | 0 | 0 | 0 | 2.csv | 0 | 0 | 0 | 260 | --- 261 | 这里我们假设教室0安排给班级0,教室1安排给班级1。 262 | 263 | 方法是将class_id为0的行中room_type都设置为0,由于在room.csv中type为0的教室有且只有1个id=0的,所以达到了固定教室的目的。 264 | 265 | 同理我们将class_id为1中的room_type都设置为1,从而将room.csv中id=1的教室固定分配给1班。(反过来也可以教室0安排给班级1,教室1安排给班级0) 266 | 267 | time_type字段我设置了两个文件1.csv和2.csv。 268 | 269 | `1.csv` 270 | | | | | | | | | 271 | |---|---|---|---|---|---|---| 272 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 273 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 274 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 275 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 276 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 277 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 278 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 279 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 280 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 281 | --- 282 | `1.csv`的含义是每周7天,有5天上课,对于在unit.csv的time_type字段中选择1.csv的课程计划的课程,只安排在每天的前3节课,也就是`0`的位置。 283 | 284 | `2.csv` 285 | | | | | | | | | 286 | |---|---|---|---|---|---|---| 287 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 288 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 289 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 290 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 291 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 292 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 293 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 294 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 295 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 296 | --- 297 | `2.csv`表示只安排在每天的第4、6、7节课,也就是`0`的位置。 298 | 299 | 其余部分和高校排课的设置一样,可以查看前面的说明。 -------------------------------------------------------------------------------- /README_AR.md: -------------------------------------------------------------------------------- 1 | # 🎓 CourseMasterX 2 | حل سريع وفعّال لمشكلة جدولة الدروس الجامعية، اجعل الجدولة أسهل بكثير! 3 | --- 4 | مناسب لجدولة الدروس حسب الفصول الدراسية 5 | 6 | [📄 中文](README.md)[📄 English](README_EN.md) 7 | 8 | المحتوى التالي مستند إلى ترجمة الذكاء الاصطناعي وهو للاطلاع فقط. 9 | ## ⚙️ **متطلبات التشغيل** 10 | تأكد من توفر البيئة التالية لتشغيل البرنامج: 11 | - **نظام التشغيل**: 🖥️ Windows 12 | - **بطاقة الرسومات**: 🎮 بطاقة NVIDIA تدعم برامج cuda (تم الاختبار على RTX 4070 و RTX 2060 ✅، لم يتم اختبار باقي الأنواع بعد) 13 | 14 | --- 15 | 16 | ## 📥 **تحميل البرنامج** 17 | 18 | 1. **تنزيل وفك ضغط البرنامج** 19 | 20 | 📦 بعد تنزيل الملف المضغوط قم بفك الضغط عنه. إذا ظهر تحذير أمني من نظام التشغيل، اختر **السماح بالتشغيل**. ⚠️ إذا لم تسمح بالتشغيل سيتم حذف ملفات البرنامج تلقائياً. 21 | 22 | 2. **شرح الملفات**: 23 | 24 | - **`CourseMasterX.exe`**: 🚀 ملف البرنامج الرئيسي، انقر عليه مرتين لتشغيل مهمة الجدولة. 25 | - **مجلد `really_data_csv`**: 📂 يحتوي على ملفات أمثلة للجدولة، للاختبار والرجوع إليها. 26 | 27 | --- 28 | 29 | ## **تشغيل البرنامج** 30 | 31 | 1. **تشغيل البرنامج** 32 | انقر مرتين على `CourseMasterX.exe` لتشغيل البرنامج بالإعدادات الافتراضية، وتحقق من أن البرنامج يعمل بشكل سليم. 33 | 34 | 2. **تعيين نطاق البحث** 35 | بعد التشغيل، سيطلب منك البرنامج إدخال نطاق البحث. 36 | - **القيمة الموصى بها:** `9` (كلما زادت القيمة، أصبح البحث أوسع). 37 | 38 | لقطة شاشة للبرنامج 39 | 40 | 3. **نتيجة التشغيل** 41 | بعد انتهاء التشغيل، تحقق من وجود ملفات النتائج التالية: 42 | - `result_class_0.csv` 43 | - `result_room_0.csv` 44 | - `result_teacher_0.csv` 45 | - `result_unit_0.csv` 46 | 47 | إذا ظهرت ملفات أكثر، لا تقلق، فهذا يعني أن البرنامج أوجد عدة مخططات للجدولة. 48 | 49 | لقطة شاشة لملفات النتائج 50 | 51 | --- 52 | 53 | ## **شرح ملفات إعدادات الجامعة** 54 | 55 | بعد إتمام التشغيل الأساسي بنجاح، تعلّم كيف تعدّل ملفات الإعدادات لتناسب احتياجاتك. 56 | 57 | ### **مكان ملفات الإعدادات** 58 | كل ملفات الإعدادات موجودة في مجلد `really_data_csv`. جميع الملفات بصيغة **CSV**، يمكن فتحها وتعديلها بواسطة **Office Excel** أو **WPS Excel**، أو حتى المفكرة. 59 | 60 | --- 61 | 62 | ### **جدول ملفات الإعدادات** 63 | | اسم الملف | الوصف | الوظيفة | 64 | |-----------------|--------------|-------------------------------| 65 | | `class.csv` | معلومات الفصول | يتضمن عدد الطلاب لكل فصل | 66 | | `room.csv` | معلومات القاعات | نوع القاعة وسعتها | 67 | | `cut.csv` | تقسيم الحصص | يحدد طريقة تقسيم الحصة | 68 | | `unit.csv` | خطة المقررات | خطة التدريس التي تحتاج جدولتها| 69 | 70 | --- 71 | 72 | ### **class.csv** 73 | | اسم الحقل | الوصف | النوع | 74 | |-----------|-------------------|---------| 75 | | id | معرف الفصل | عدد صحيح| 76 | | size | عدد الطلاب بالفصل | عدد صحيح| 77 | 78 | --- 79 | 80 | ### **room.csv** 81 | | اسم الحقل | الوصف | النوع | 82 | |-----------|--------------------------|---------| 83 | | id | معرف القاعة | عدد صحيح| 84 | | type | نوع القاعة | عدد صحيح| 85 | | size | السعة | عدد صحيح| 86 | | الحقول الأخرى | غير مستخدمة | عيّن القيمة 0 افتراضياً | 87 | 88 | --- 89 | 90 | ### **cut.csv** 91 | | اسم الحقل | الوصف | النوع | 92 | |-----------|----------------------------------|---------| 93 | | id | معرف التقسيم | عدد صحيح| 94 | | data | طريقة التقسيم مثل `2 2` أو `4 4 4`| أرقام صحيحة مفصولة بمسافة| 95 | 96 | --- 97 | 98 | ### **unit.csv** 99 | | اسم الحقل | الوصف | النوع | 100 | |-------------|-----------------------------------------------------------------------|---------------| 101 | | class_id | معرف الفصل، يمكن أن يكون أكثر من فصل (افصل بينهم بمسافة) | عدد صحيح | 102 | | teacher_id | معرف المدرس، يمكن أن يكون أكثر من مدرس (افصل بينهم بمسافة) | عدد صحيح | 103 | | course | معرف المقرر | عدد صحيح | 104 | | room_type | نوع القاعة المطلوبة مطابق لحقل type في room.csv | عدد صحيح | 105 | | week_num | غير مستخدم | - | 106 | | cut | طريقة التقسيم الأسبوعي، مطابق لمعرف في cut.csv | عدد صحيح | 107 | | merge | غير مستخدم | - | 108 | | time_type | اسم ملف إعدادات الوقت | نص | 109 | | vacation | غير مستخدم | - | 110 | | week_start | غير مستخدم | - | 111 | | week_end | غير مستخدم | - | 112 | 113 | --- 114 | 115 | ### **مجلد time** 116 | 117 | يحتوي مجلد `time` على ملفي إعداد وقت: `1.csv` و `2.csv`، لتخصيص فترات الدروس. مثال على `1.csv`: 118 | 119 | | | | | | | | | 120 | |-|-|-|-|-|-|-| 121 | |0|0|0|0|0|1|1| 122 | |0|0|0|0|0|1|1| 123 | |0|0|0|0|0|1|1| 124 | |0|0|0|0|0|1|1| 125 | |0|0|0|0|0|1|1| 126 | |1|1|1|1|1|1|1| 127 | |0|0|0|0|0|1|1| 128 | |0|0|0|0|0|1|1| 129 | |0|0|0|0|0|1|1| 130 | |0|0|0|0|0|1|1| 131 | |0|0|0|0|0|1|1| 132 | |1|1|1|1|1|1|1| 133 | |1|1|1|1|1|1|1| 134 | |1|1|1|1|1|1|1| 135 | |1|1|1|1|1|1|1| 136 | 137 | - الجدول مكون من 7 أعمدة، كل عمود ليوم من الأسبوع، ولكل يوم 15 فترة زمنية. 138 | - **الفترة بـ `1`**: غير متاحة. 139 | - **الفترة بـ `0`**: متاحة. 140 | - مثال: 141 | - من الاثنين إلى الجمعة، الفترات الصباحية 5 فترات بقيمة `0`، وفترات بعد الظهر أيضاً 5 بقيمة `0`، وهي الفترات المتاحة للجدولة. 142 | 143 | --- 144 | 145 | ### **ملاحظات للحالات الخاصة** 146 | 147 | #### مثال على مشكلة: 148 | **إذا كان هناك مقرر يتطلب 6 حصص متواصلة، هل يمكن جدولته حسب إعدادات `1.csv`؟** 149 | 150 | **الإجابة: لا**، لأنه لا يوجد فترة متواصلة تتسع لـ6 حصص. 151 | يفضل تقسيم المقرر إلى حِصتين مثلاً "3 3" أو "2 4"، بحيث لا تزيد الحصة الواحدة عن 5. 152 | 153 | --- 154 | 155 | ## **شرح ملفات النتائج** 156 | 157 | كل مجموعة من ملفات CSV التي لها نفس الرقم الأخير تمثل مخطط جدولة واحد. 158 | مثلاً: 159 | `result_room_0.csv`، `result_teacher_0.csv`، `result_unit_0.csv` و`result_class_0.csv` تمثل نفس مخطط الجدولة. 160 | 161 | --- 162 | 163 | ### **result_room_0.csv** 164 | | اسم الحقل | الوصف | 165 | |-----------|-----------------------------------------------------------------------| 166 | | room | معرف القاعة التي تم تعيينها لمقرر معين | 167 | | course | معرف المقرر | 168 | | day | 3 أرقام كمجموعة: يوم الأسبوع، بداية الحصة، نهاية الحصة (قد تتغير أسماء الحقول)| 169 | | start | غير مستخدم | 170 | | end | غير مستخدم | 171 | | ملاحظة | كل صف يقابل نفس صفه في unit.csv المدخل. | 172 | --- 173 | 174 | ### **result_teacher_0.csv** 175 | | اسم الحقل | الوصف | 176 | |------------|-----------------------------------------------------------------------| 177 | | teachers | معرف المدرس | 178 | | course | معرف المقرر | 179 | | day | 3 أرقام كمجموعة: يوم الأسبوع، بداية الحصة، نهاية الحصة (قد تتغير أسماء الحقول)| 180 | --- 181 | 182 | ### **result_unit_0.csv** 183 | | اسم الحقل | الوصف | 184 | |-----------|-----------------------------------------------------------------------| 185 | | day | كما في الأعلى | 186 | | ملاحظة | كل صف يقابل صفه في unit.csv المدخل. | 187 | --- 188 | 189 | ### **result_class_0.csv** 190 | | اسم الحقل | الوصف | 191 | |-----------|-----------------------------------------------------------------------| 192 | | classes | معرف الفصل | 193 | | course | معرف المقرر | 194 | | day | كما في الأعلى | 195 | 196 | ## **شرح ملفات إعدادات الجدولة للمدارس (ابتدائي/إعدادي/ثانوي)** 197 | بخلاف الجامعات، في المدارس غالباً ما تكون الفصول في قاعات ثابتة، لذا يجب تعديل بعض ملفات الإعدادات. 198 | 199 | يقرأ البرنامج افتراضياً من مجلد really_data_csv، لذا انسخ كل الملفات من really_school_data_csv إلى really_data_csv مع الاستبدال. 200 | 201 | ### **جدول ملفات الإعدادات** 202 | | اسم الملف | الوصف | الوظيفة | 203 | |-----------------|--------------|-------------------------------| 204 | | `class.csv` | معلومات الفصول | عدد الطلاب ليس مهماً، فقط يجب أن تكون سعة القاعة >= عدد الطلاب | 205 | | `room.csv` | معلومات القاعات | كل قاعة تعطى نوع (type) مختلف، لضمان تخصيصها الصحيح | 206 | | `cut.csv` | تقسيم الحصص | حسب الاحتياج الحقيقي | 207 | | `unit.csv` | خطة المقررات | يجب أن يتطابق معرف الفصل مع معرف القاعة | 208 | --- 209 | 210 | سنشرح كل ملف في really_school_data_csv. 211 | 212 | ### **class.csv** 213 | | id | size | 214 | |----|-------------------| 215 | | 0 | 50 | 216 | | 1 | 50 | 217 | --- 218 | يوجد فصلان، معرفاتهما 0 و1، وكل فصل به 50 طالب. 219 | 220 | عدد الطلاب ليس مهماً هنا، فقط يجب أن تكون سعة القاعة كافية. 221 | 222 | ### **room.csv** 223 | | id | building|floor|name|type|size | 224 | |----|--------|-----|----|----|-----| 225 | | 0 | 0 | 0 | 0 | 0 | 50 | 226 | | 1 | 0 | 0 | 0 | 0 | 50 | 227 | --- 228 | يوجد قاعتان، معرفاتهما 0 و1، والسعة 50. 229 | 230 | حقول building وfloor وname غير مستخدمة، عيّنها 0. 231 | 232 | ### **cut.csv** 233 | | id | data | 234 | |----|-------------| 235 | | 0 | 1 1 1 1 1 | 236 | | 1 | 1 1 1 1 | 237 | | 2 | 1 1 1 | 238 | --- 239 | مثلاً: id=0 يعني أسبوعياً 5 حصص كل واحدة مدتها 1. 240 | 241 | يمكنك تغيير الأرقام حسب الحاجة، مثلاً "2" يعني حصة مزدوجة. 242 | 243 | ### **unit.csv** 244 | | class_id | teacher_id | course | room_type | week_num | cut | merge | time_type | vacation | week_start | week_end | 245 | |----------|------------|--------|-----------|----------|-----|-------|-----------|----------|------------|----------| 246 | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 247 | | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 248 | | 0 | 2 | 2 | 0 | 0 | 0 | 0 | 2.csv | 0 | 0 | 0 | 249 | | 0 | 3 | 3 | 0 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 250 | | 0 | 4 | 4 | 0 | 0 | 0 | 0 | 2.csv | 0 | 0 | 0 | 251 | | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 252 | | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 253 | | 1 | 2 | 2 | 1 | 0 | 0 | 0 | 2.csv | 0 | 0 | 0 | 254 | | 1 | 3 | 3 | 1 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 255 | | 1 | 4 | 4 | 1 | 0 | 0 | 0 | 2.csv | 0 | 0 | 0 | 256 | --- 257 | نفترض القاعة 0 للفصل 0، والقاعة 1 للفصل 1. 258 | 259 | الطريقة: اجعل room_type=0 في صفوف الفصل 0 (class_id=0) ليأخذ القاعة ذات type=0 فقط (id=0)، ونفس الشيء للفصل 1. 260 | 261 | يمكنك عكس التخصيص حسب الحاجة. 262 | 263 | حقل time_type هنا فيه ملفي وقت 1.csv و2.csv: 264 | 265 | `1.csv` 266 | | | | | | | | | 267 | |---|---|---|---|---|---|---| 268 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 269 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 270 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 271 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 272 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 273 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 274 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 275 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 276 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 277 | --- 278 | `1.csv` يعني 5 أيام في الأسبوع، والفترات المتاحة هي أول 3 حصص يومياً (`0`). 279 | 280 | `2.csv` 281 | | | | | | | | | 282 | |---|---|---|---|---|---|---| 283 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 284 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 285 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 286 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 287 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 288 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 289 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 290 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 291 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 292 | --- 293 | `2.csv` يعني الحصص توزع فقط على الحصة الرابعة والسادسة والسابعة. 294 | 295 | باقي التفاصيل كما في إعدادات الجدولة للجامعات. 296 | -------------------------------------------------------------------------------- /README_EN.md: -------------------------------------------------------------------------------- 1 | # 🎓 CourseMasterX 2 | Quickly and efficiently solve university course scheduling problems, making scheduling easier! 3 | --- 4 | Applicable for scheduling by class 5 | 6 | [📄 中文](README.md)[📄 عربي ](README_AR.md) 7 | 8 | The following content is based on AI translation and is for reference only. 9 | ## ⚙️ **Requirements** 10 | Ensure the following environment requirements are met: 11 | - **Operating System**: 🖥️ Windows 12 | - **Graphics Card**: 🎮 NVIDIA GPU capable of running CUDA programs (tested on RTX 4070, RTX 2060 ✅; other models not yet tested). 13 | 14 | --- 15 | 16 | ## 📥 **Software Download** 17 | 18 | 1. **Download and Extract the Program** 19 | 20 | 📦 After downloading the compressed file, extract it. If your operating system warns of potential security threats, choose **Allow to Run**. ⚠️ If not allowed, the system may automatically delete program files. 21 | 22 | 2. **File Description**: 23 | 24 | - **`CourseMasterX.exe`**: 🚀 The main program file. Double-click to execute the scheduling tasks. 25 | - **`really_data_csv` folder**: 📂 Contains sample files for scheduling, provided for testing and reference. 26 | 27 | --- 28 | 29 | ## **Running the Program** 30 | 31 | 1. **Launch the Program** 32 | Double-click `CourseMasterX.exe` to run the program with default configurations and check whether it launches correctly. 33 | 34 | 2. **Set Search Range** 35 | Once the program starts, it will prompt you to input the search range. 36 | - **Recommended Value**: `9` (Larger values increase the search range the program attempts). 37 | 38 | Program Execution Screenshot 39 | 40 | 41 | 3. **Output Results** 42 | After execution, check whether the result files are generated, including: 43 | - `result_class_0.csv` 44 | - `result_room_0.csv` 45 | - `result_teacher_0.csv` 46 | - `result_unit_0.csv` 47 | 48 | If more files are generated, don’t worry. This indicates that multiple scheduling plans have been generated. 49 | 50 | Result Files Screenshot 51 | 52 | --- 53 | 54 | ## **University Configuration File Description** 55 | 56 | After completing the basic operations, learn how to modify configuration files to meet specific user requirements. 57 | 58 | ### **Configuration File Location** 59 | All configuration files are located in the `really_data_csv` folder. All files used by this program are in **CSV format**, which can be opened and edited using **Office Excel**, **WPS Excel**, or a text editor. 60 | 61 | --- 62 | 63 | ### **List of Configuration Files** 64 | | File Name | Description | Function | 65 | |-----------------|-----------------|--------------------------------| 66 | | `class.csv` | Class Information | Contains details like class sizes | 67 | | `room.csv` | Room Information | Includes room types and capacities | 68 | | `cut.csv` | Course Splitting Information | Defines how courses are split | 69 | | `unit.csv` | Course Plan | Includes teaching plans to be scheduled | 70 | 71 | --- 72 | 73 | ### **class.csv** 74 | | Field Name | Description | Type | 75 | |------------|--------------------------|--------| 76 | | id | Class ID | Integer | 77 | | size | Number of Students | Integer | 78 | 79 | --- 80 | 81 | ### **room.csv** 82 | | Field Name | Description | Type | 83 | |------------|----------------------------------|--------| 84 | | id | Room ID | Integer | 85 | | type | Room Type | Integer | 86 | | size | Capacity | Integer | 87 | | Other Fields | Unused | Default to 0 | 88 | 89 | --- 90 | 91 | ### **cut.csv** 92 | | Field Name | Description | Type | 93 | |------------|----------------------------------------|--------| 94 | | id | Course Splitting ID | Integer | 95 | | data | Splitting Method, e.g., `2 2` or `4 4 4` | Space-separated integers | 96 | 97 | --- 98 | 99 | ### **unit.csv** 100 | | Field Name | Description | Type | 101 | |---------------|--------------------------------------------------------------|------------| 102 | | class_id | Class ID(s), multiple IDs separated by spaces | Integer | 103 | | teacher_id | Teacher ID(s), multiple IDs separated by spaces | Integer | 104 | | course | Course ID | Integer | 105 | | room_type | Required Room Type, corresponds to the `type` field in `room.csv` | Integer | 106 | | week_num | Unused | - | 107 | | cut | Weekly Splitting Method, corresponds to `cut.csv` splitting ID | Integer | 108 | | merge | Unused | - | 109 | | time_type | Time configuration file name | String | 110 | | vacation | Unused | - | 111 | | week_start | Unused | - | 112 | | week_end | Unused | - | 113 | 114 | --- 115 | 116 | ### **time Folder** 117 | 118 | The `time` folder contains two time configuration files: `1.csv` and `2.csv`, used to customize class schedules. Taking `1.csv` as an example: 119 | 120 | | | | | | | | | 121 | |-|-|-|-|-|-|-| 122 | |0|0|0|0|0|1|1| 123 | |0|0|0|0|0|1|1| 124 | |0|0|0|0|0|1|1| 125 | |0|0|0|0|0|1|1| 126 | |0|0|0|0|0|1|1| 127 | |1|1|1|1|1|1|1| 128 | |0|0|0|0|0|1|1| 129 | |0|0|0|0|0|1|1| 130 | |0|0|0|0|0|1|1| 131 | |0|0|0|0|0|1|1| 132 | |0|0|0|0|0|1|1| 133 | |1|1|1|1|1|1|1| 134 | |1|1|1|1|1|1|1| 135 | |1|1|1|1|1|1|1| 136 | |1|1|1|1|1|1|1| 137 | 138 | - The table contains 7 columns, corresponding to the 7 days of the week, with 15 time slots per day. 139 | - **Marked with `1`**: Unavailable time slots. 140 | - **Marked with `0`**: Available time slots. 141 | - For example: 142 | - On Monday to Friday, the mornings have 5 `0` slots, and the afternoons also have 5 `0` slots, which can be used for scheduling classes. 143 | 144 | --- 145 | 146 | ### **Special Cases** 147 | 148 | #### Example Question: 149 | **If a course requires 6 consecutive periods, can it be scheduled based on the settings in `1.csv`?** 150 | 151 | **Answer**: No, because no single time block accommodates 6 consecutive periods. 152 | It is recommended to split the course into two sessions, such as "3 3" or "2 4," ensuring each session uses fewer than or equal to 5 periods. 153 | 154 | --- 155 | 156 | ## **Result File Description** 157 | 158 | CSV files with the same trailing numbers belong to the same scheduling plan. For example: 159 | `result_room_0.csv`, `result_teacher_0.csv`, `result_unit_0.csv`, and `result_class_0.csv` are part of the same scheduling plan. 160 | 161 | --- 162 | 163 | ### **result_room_0.csv** 164 | | Field Name | Description | 165 | |------------|------------------------------------------------------------------| 166 | | room | Room ID assigned to a course plan | 167 | | course | Course ID | 168 | | day | A group of 3 numbers indicating day of the week, start period, and end period (field name may vary) | 169 | | start | Unused | 170 | | end | Unused | 171 | | Notes | Each row corresponds to the rows in `unit.csv`. | 172 | --- 173 | 174 | ### **result_teacher_0.csv** 175 | | Field Name | Description | 176 | |------------|------------------------------------------------------------------| 177 | | teachers | Teacher ID(s) | 178 | | course | Course ID | 179 | | day | A group of 3 numbers indicating day of the week, start period, and end period (field name may vary) | 180 | 181 | --- 182 | 183 | ### **result_unit_0.csv** 184 | | Field Name | Description | 185 | |------------|------------------------------------------------------------------| 186 | | day | Same as above | 187 | | Notes | Each row corresponds to the rows in `unit.csv`. | 188 | --- 189 | 190 | ### **result_class_0.csv** 191 | | Field Name | Description | 192 | |------------|------------------------------------------------------------------| 193 | | classes | Class ID(s) | 194 | | course | Course ID | 195 | | day | Same as above | 196 | 197 | ## **Primary and Secondary School Scheduling Configuration Description** 198 | Compared to universities, scheduling for primary and secondary schools in fixed classrooms requires some modifications to the configuration files. 199 | 200 | The program defaults to reading content from the `really_data_csv` folder. Therefore, copy all files from the `really_school_data_csv` folder into the `really_data_csv` folder to replace the original files. 201 | 202 | --- 203 | 204 | ### **List of Configuration Files** 205 | | File Name | Description | Function | 206 | |-----------------|-----------------|--------------------------------| 207 | | `class.csv` | Class Information | The actual class size is not important; it just needs to be less than or equal to the classroom size in `room.csv`. | 208 | | `room.csv` | Room Information | Assign each room a unique `type` to ensure it is allocated correctly in `unit.csv`. | 209 | | `cut.csv` | Course Splitting Information | Adjusted based on actual needs. | 210 | | `unit.csv` | Course Plan | Ensure `class_id` and `room_id` match. | 211 | 212 | --- 213 | 214 | The following explains the files in `really_school_data_csv` one by one. 215 | 216 | ### **class.csv** 217 | | id | size | 218 | |----|-------------------| 219 | | 0 | 50 | 220 | | 1 | 50 | 221 | --- 222 | This file indicates there are two classes, ID 0 and 1, each with a size of 50 students. 223 | 224 | Since room arrangement is fixed, the size here can be set arbitrarily. 225 | 226 | ### **room.csv** 227 | | id | building | floor | name | type | size | 228 | |----|----------|-------|------|------|------| 229 | | 0 | 0 | 0 | 0 | 0 | 50 | 230 | | 1 | 0 | 0 | 0 | 0 | 50 | 231 | --- 232 | This file provides two rooms, IDs 0 and 1, each with a capacity of 50 students. 233 | 234 | Fields `building`, `floor`, and `name` are unused and can default to 0. 235 | 236 | ### **cut.csv** 237 | | id | data | 238 | |----|----------------------------------| 239 | | 0 | 1 1 1 1 1 | 240 | | 1 | 1 1 1 1 | 241 | | 2 | 1 1 1 | 242 | --- 243 | - `id=0`: 5 sessions per week, 1 session each time. 244 | - `id=1`: 4 sessions per week, 1 session each time. 245 | - Each `1` is separated by spaces. Changing `1` to `2` would mean 2 sessions each time. 246 | 247 | ### **unit.csv** 248 | | class_id | teacher_id | course | room_type | week_num | cut | merge | time_type | vacation | week_start | week_end | 249 | |----------|------------|--------|-----------|----------|-----|-------|-----------|----------|------------|----------| 250 | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 251 | | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 252 | | 0 | 2 | 2 | 0 | 0 | 0 | 0 | 2.csv | 0 | 0 | 0 | 253 | | 0 | 3 | 3 | 0 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 254 | | 0 | 4 | 4 | 0 | 0 | 0 | 0 | 2.csv | 0 | 0 | 0 | 255 | | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 256 | | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 257 | | 1 | 2 | 2 | 1 | 0 | 0 | 0 | 2.csv | 0 | 0 | 0 | 258 | | 1 | 3 | 3 | 1 | 0 | 0 | 0 | 1.csv | 0 | 0 | 0 | 259 | | 1 | 4 | 4 | 1 | 0 | 0 | 0 | 2.csv | 0 | 0 | 0 | 260 | --- 261 | Here, classroom 0 is assigned to class 0, and classroom 1 is assigned to class 1. 262 | 263 | To achieve this, set all `room_type` fields to 0 for rows where `class_id=0`. Since type 0 corresponds to room ID 0 in `room.csv`, classroom 0 is fixed for class 0. 264 | 265 | Similarly, set all `room_type` fields to 1 for rows where `class_id=1`, fixing classroom 1 for class 1. (You can reverse the assignments if needed.) 266 | 267 | The `time_type` field uses two example files: `1.csv` and `2.csv`. 268 | 269 | `1.csv` 270 | | | | | | | | | 271 | |---|---|---|---|---|---|---| 272 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 273 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 274 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 275 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 276 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 277 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 278 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 279 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 280 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 281 | --- 282 | `1.csv` specifies that the first 3 periods of each day (marked as `0`) are available for scheduling classes. 283 | 284 | `2.csv` 285 | | | | | | | | | 286 | |---|---|---|---|---|---|---| 287 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 288 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 289 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 290 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 291 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 292 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 293 | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 294 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 295 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 296 | --- 297 | `2.csv` specifies that only the 4th, 6th, and 7th periods of each day (marked as `0`) are available for scheduling. 298 | 299 | The remaining components are identical to university scheduling settings and can be referenced in the earlier section. 300 | -------------------------------------------------------------------------------- /console1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SigmaAdrich/CourseMasterX/5bf85cf64471ae5d3e4f0e091e0aba0cc1ae9664/console1.PNG -------------------------------------------------------------------------------- /result1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SigmaAdrich/CourseMasterX/5bf85cf64471ae5d3e4f0e091e0aba0cc1ae9664/result1.PNG --------------------------------------------------------------------------------