├── 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 |
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 |
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
--------------------------------------------------------------------------------