10.5-------------------------------------------------------- 2From different old custom FET-MA users, for the new mornings-afternoons mode, on forum: 3 4https://lalescu.ro/liviu/fet/forum/index.php?topic=4519.0 5 6- Students (set) min half-days per week (suggested by Abdeljalil Elghazoui) - but is it needed, considering we have available min mornings/afternoons and min hours daily without allowing empty real days? 7 8- Max days per week for a room, 9- Max hours daily (half day) for a room, 10- Max hours daily (real day) for a room (suggested by bachiri401). 11 12- Default 100% or saving the value of min days between activities constraints when adding a split activity (suggested by Mohamed Ait Ichou). 13 14- Another suggestion, is it possible to combine morning and evening periods during viewing. That is, it is not divided between morning and evening periods (suggested by Mohamed Ait Ichou). 15 16- Drag and drop manual timetabling in the time horizontal view timetables (suggested by Abdeljalil Elghazoui). 17 18- Suggested by BOUHADEF (https://lalescu.ro/liviu/fet/forum/index.php?topic=4501.msg25467#msg25467): 19There is an important constraints if it can be added 20Max resting hours between morning and afternoon. With the possibility of setting it 0. 21This restriction is important for schools that provide food as students cannot be discharged at the end of the morning or the first hour in the evening. 22Also important for teachers who live far from the institution. Breaks between morning and evening are tiring for the teacher as he cannot move home. 23Also if it is possible to space constraint 24 As set of activities are in the same room if they are consecutive 25with a weight less than 100%. 26Also, please add it in space constraint 27My important place if possible is 28a set of activities occupies minimum different rooms 29 30- Suggested by nguyenhuuduyet (https://lalescu.ro/liviu/fet/forum/index.php?topic=4501.msg25772#msg25772): 31Can you help me. I want when entering the teacher's name will be displayed immediately like the official version. 32Example: 1. Enter the teacher's name 332. Add 343. OK 35Then the teacher's name will appear in item 4 36 37From mohammed, on forum (https://lalescu.ro/liviu/fet/forum/index.php?topic=4805.0): 38- Teacher(s)/students (set) activity tag min hours continuously. 39 40From ghani1990, on forum (https://lalescu.ro/liviu/fet/forum/index.php?topic=4729.0): 41- Activity(ies) start(s) or end(s) students day. 42This was implemented as a custom version for him, but it is ugly/not perfect, because each half day may contain only one 43such activity, and the implementation is not perfect (even if ghani1990 says in practice it works very well). 44ghani1990 says on that forum topic that this is to ensure that optional activities begin or end the students' day. But a 45perfect way to do this would be to divide the students and add all the activities for a students set, all the activities 46without the optional ones for another students set, and add max zero gaps for these students. 47 48From bachiri401: 49- Constraints teacher(s)/students (set) min hours per afternoon. 50-> And in general every constraint referring to days should have a corresponding constraint for real days, 51and every constraint referring to mornings should have a corresponding one referring to afternoons. 52 53From Mohamed Ait Ichou: He suggests good printing and output. 54Liviu Lalescu: In case of mornings-afternoons, to print and output the same real day continuously? 55Mohamed Ait Ichou: Yes, morning and evening combined in one day in case of printing. 56 57From Ziani Ben Alia: Please add the following condition: Maximum rest periods between morning and evening for teachers. 58Liviu Lalescu: I am sorry, but this is too difficult. But maybe you could use max gaps per real day and max span per real day. 59Also suggested by saidmechri: Max resting hours between morning and afternoon for teacher (https://lalescu.ro/liviu/fet/forum/index.php?topic=4951.0). 60 611---------------------------------------------------------- 62From Liviu Lalescu: 63 64These are some rather technical problems, for developers, referring to some possible improvements in the generation code: 65 66- In the initial order, in nIncompatible, consider also teachers(students)intervalMaxDaysPerWeek, like in teacherMaxDaysPerWeek 67 68- Make students max gaps per day perfect. This is very difficult/complicated. Any bug/mistake would be critical. 69 70- Instead of if-else, use switch in rules.cpp when there are many alternatives (like in modify teacher or read time/space constraints). 71Also in the all time/space constraints dialogs in the interface. 72 732---------------------------------------------------------- 74From Volker Dirr: 75 76Disable menus and shortcuts (in FET main form) if they are currently not 77usable. For example: Disable teacher constraints, if there is no teacher 78in the dataset. Disable space constraints if there is no room in the 79dataset. (Disable means: Just make them unavailable/gray. Don't hide 80them. Do it like OpenOffice.org, Firefox, etc.) 81 823---------------------------------------------------------- 83From Horatiu Halmajan: 84 85Max gaps constraints with weight under 100% 86 87Liviu: This is very difficult. 88 894---------------------------------------------------------- 90From Horatiu Halmajan: 91 92Horatiu: 93I met a situation: a teacher asks for maximum 2 working days, but these 94days should not be consecutive. 95 96Is there a way to implement it in FET? 97 98The only (manual) way I could think of, is to set the teacher as 99unavailable on Tuesdays and Thursdays, thus leaving him available on 100Monday, Wednesday and Friday (any two of these are unconsecutive). 101 102Any other ideas...? 103 104Liviu: 105I have another idea: add a dummy activity for this teacher, split into 2 106per 107week, min n days = 2, with 100%. You just need to take care that this 108teacher 109has place for these dummy activities (enough slots in the day) and to 110consider 111these dummy activities as possible gaps, so if teacher has max gaps 2 then 112make max gaps for him 0. 113 114Horatiu: 115For my case, the second idea worked perfectly, as my teacher does not accept 116gaps. 117 118I have also "played" with the first with the first idea, as it seems to be 119the most un-restrictive one. It also worked. I tried it three times, and in 120all three situations at least one of the dummy activities was the first or 121the last activity for the teacher's day. So, there is a chance that the 122teacher would end up with only one gap. 123 124Which leads me to a suggestion: An activity ends (or starts) a teacher's day. 125Similar to "an activity ends students's day". 126 1275---------------------------------------------------------- 128From daviodan: 129 130I will refer to sample_Brazil_more_difficult_max_2_gaps_for_teachers.fet 131 1321. In the FET activities dialog there exist more filters after the teacher, group, etc. 133If we choose for instance the subject "Math" and we do the filtering also after the name of 134the teacher, then the list of the filter should contain only the name: Bruna,Silvania,Wellington, 135because only these teach Maths. In the present moment the filter contains the list of all teachers. 136The same for all the other filters. 137 1382. In the teachers' statistics dialog, when we click a teacher, there should appear in the right 139in a box all the constraints for this teacher inputted by that moment. 140 1416---------------------------------------------------------- 142From Volker Dirr: 143 144for code cleanup always use the same style: 145some constraint c have 146c->teacher_ID 147others have 148c->teacher_Index 149 1507---------------------------------------------------------- 151From Azu Boba (modified/updated by Liviu Lalescu): 152 153About timetable view teachers: ... I propose is to 154have fixed cell height and width so it would be easier to comprehend and 155pinpoint what you see when switching between teachers. 156We have a 3D table (teachers/days/hours). I propose to 157add a new view named e.g. "View (day for teachers)" (of course you keep 158the "View (teachers)" too). This view will be similar to "View 159(teachers)" but it will have all the days as selectable tabs on the top. 160The 2D table it will display below the tabs would be the Teachers/Hours 161view for the day selected. The buttons and functionality will be the 162same as in the case of "View (teachers)". ... 163The best part though is that with this 164new View you will be able to better comprehend/modify the schedule in a 165day by day base... 166You might also want to consider adding an additional flag when locking 167an activity. This flag might be called "Save data and timetable flag" 168and would be set when an activity is locked automatically during the 169"Save data+timetable as..." procedure. Why? Mainly, because when you 170want to unlock e.g. a specific day in a "Save data+timetable as..." 171saved timetable you do not want to unlock all the activities of the day; 172you want unlocked only the ones that were locked by the "Save 173data+timetable as..." process. There are activities that the schedule 174creator manually locked them before FET generated the table (e.g. a 175specific lesson needs to happen only on a specific day and time). By 176selecting and unlocking a whole day as things are now you unlock these 177activities too! This means that if the schedule creator doesn't pay 178enough attention he might mistakenly create a schedule with activities 179set at undesired hours. The solution I propose to this is to toggle 180between locked/unlocked only the activities that have the "Save data and 181timetable flag" set. To unlock the manually locked ones the user would 182have to do it in a different/manual way (see the paragraph below about 183the editable "Details" box) or even better be asked with a message box 184if he wants to unlock the manually locked activities too. 185I also mentioned that in order to remove a teacher from a specific day 186(because he is ill or on a leave) I have to go to "View (teachers)" and 187pinpoint all the activities assigned to the teacher for this day 188(checking their IDs from the "Details" text box and then writing them 189down in notepad). Then I close this view and go to the "Activities" 190list, find the specific activities and uncheck "Active" for them. This 191is a little annoying and a prone to errors procedure especially if there 192are more than one teachers missing. What I thought as a solution for 193this has to do with the "Details" text box on the "View (teachers)". It 194would be great if it wasn't just a simple text box but an editable 195interface for every changeable value. What I have in mind is to split 196the "Details" into two parts; the upper part would include all the non 197editable values while the lower part all the editable ones. Right now 198for me, only the "Active" and "locked time" values are worth of being 199editable, so simple check boxes would suffice but someone else might 200want other values editable too (e.g. Total number of students, duration) 201or new values worth being editable might be added in the future, so it's 202a good thing to have. 203Last but not least (and certainly the most difficult modification) it 204would be great if you could drag and drop activities in the "View 205(teachers)" and "View (day for teachers)" GUIs. Of course by doing so 206you create conflicts and this will need handling. But I think all the 207before mentioned changes are enough work for you now and I need to think 208this a little more to come up with a viable solution. 209 2108---------------------------------------------------------- 211From Marco Barsotti: 212 213The only thing that I would like to find in a future version of FET is the 214ability 1) to find when a combination of constraints is impossible to 215respect. 2) to recognize which constraints generate a bottleneck, where FET 216stand by searching the little hole where to pass and go on, placing 217activities. 218 2199---------------------------------------------------------- 220From Saad (on forum): 221 222Manual improvements of the timetable. 223 22410--------------------------------------------------------- 225From Volker Dirr: 226 227Change remove redundant to deactivate redundant. 228 22911--------------------------------------------------------- 230From Volker Dirr 231 232I got reports from a user that he had trouble to find the correct 233output files today, because there were so many files in the directory. 234 235just maybe: 236maybe write only the index file into the result directory. then make 3 237subdirectories. one subdirectory with all html files, one with all xml 238files and one with all csv files. so we don't need the export menu 239anymore, because it is exported always by default and the directory is a 240little bit more tidy. 241 24212--------------------------------------------------------- 243From Volker Dirr 244 245We have: 246 2471. category: 3-4 classes 2482. category: 5 courses 2493. category: 4 religions (always same time, so i didn't enter it) 2504. category: several working groups (afternoon lesson, so i add them 251manually) 252 253Now have a closer look: 2544 classes * 5 courses * 4 religion is already 80 subgroups. 255so if i also add working groups (lets say 5, but there are more!) 256then we have total 400 subgroups. 257 258that is stupid, because i have only around 100 students in a year! 259 260i think in that case it is wise to enter data not in groups, add 261students 262individual. 263 264that is like high school do it. 265 266- add a year. 267- add groups (NOT with split year, but same names) 268- add a group ALL STUDENTS. 269- add subgroup with all students names into ALL STUDENTS. 270 271- now we need a table to every year: 272 - horizontal are the division names (must not be group names, but 273 can) 274 - vertical must be the student names 275 - every cell is a bool checkbox 276 277no the timetablemaker can check every single student. of yourse by 278checking the studentsname must be added as subgroup into that group. 279 28013-------------------------DONE---------------------------- 281 28214-------------------------DONE in FET-6.0.0--------------- 283 28415--------------------------------------------------------- 285From Volker Dirr 286 287how about displaying "minimum home 288room hours" and maybe also "maximum special room hours" in the teacher 289statistics? because a timetable maker (maybe) need that for his 290planning. 291 29216--------------------------------------------------------- 293From Danail Traichev: 294 295You see, this division in subgroups is very complicated - to understand 296and to add by hand. And at the end you came with a lot of subgroups that 297have only formal sense, for the algorithm, but are visible in dialogs, 298in the final chart and everywhere. It should not be like this. One will 299have to divide years in wizard-like dialog, with questions: 3001. How many classes you have for this year? 3012. Define courses for which students from this year study together 3023. Which of these curses start at same time. Group them by this criteria 3034. Define from which classes came students for these courses. Whole 304class is caming, or only part of it? Where other part goes - have rest, 305or has another activity, and if yes - which one? 3065. Define teacher that is teaching in every course. 307 308This is a draft, but some wizard like this will save *a lot of* 309mistakes, and will make program much more user friendly. Then you can 310add internal groups, but not show them to users, or at least show if 311they set some option. Show them only groups and subgroups that they need 312to put in activities, and show these same in final html output. 313 314This is my opinion of user in trouble :-) 315 316Second set: 3171. Ability to select more than one constraint and delete it, or set its 318weight 3192. Ability to disable all informative and warning messages, or to display 320them in status bar or in another log window. 3213. Option to remember last focused control in dialogs - very useful if 322you want by keyboard to open many constraints and change their weight 3234. Constraint "longest gap is n hours" 3245. A way to save last generated timetable and reopen it again (for example 325for printing it with different html level, or for viewing it. 3266. Ability to show free teachers for every position in students and 327teachers timetable - very useful if you want to find somebody to replace you 328 32917--------------------------------------------------------- 330From my80s: 331 332also in program we have 333a matrix with days x hours = n x n 334if this is allocated from some activity it should get error in 335precomputing in real time 336if we put another activity 100% in same cell 337 338that would take less time to find mistakes 339 34018--------------------------------------------------------- 341From my80s: 342 343export as odt (OpenOffice.org) table (spreadsheet) 344 345See also TODO item #310 346 34719--------------------------------------------------------- 348From Danail Traichev: 349 350If you make it how it is now with years, groups and subgroups, it will not 351be complicated for entering and even will not need change in most 352constraint dialogs. What I mean - define "groups of subjects", and allow 353"group of subjects" name to be used in every place where subject can be 354used. Much like it is now with student sets - both student years, groups 355and subgroups are placed in one control and added from one place. 356 357But of course, I don't know how this will fit with FET internals. And FET 358is fine even without this. It simple will make entering constraints a bit 359easy. The other posibility is if every activity constraint dialog has a 360posibility to select multiple activities, and to filter them by "subject 361group", or at least by "selected subjects". That will make entering 362constraints like in my case easy. 363 36420--------------------------------------------------------- 365From Volker Dirr: 366 367maybe it's possible to do Form::setLayoutDirection(Form::LeftToRight) only to the filename or language in menu. 368(bracket bug in Arabic translation) 369 37021--------------------------------------------------------- 371From Volker Dirr: 372 373I saw at Les's timetable, that he called hour==period. 374also at wikipedia it´s called period. (see School_timetables chapter, terminology) 375 376I am not sure about that. in German we have the also the word "periode", 377but we don´t use it for timetables. we say hour. 378but maybe that´s just colloquial language. this colloquial language is ok, 379because the schools have 1 schoolhour (45 minutes) or 2 schoolhours (90 380minutes). 381 382but maybe it´s better to use also the word periode, because by this 383schools with 60 minutes activities (2 periods) and 90 minutes activities 384(3 periods) don´t get trouble with the word hour (because it entrap / 385ensnare / 386inveigle so write 1 hour and 1,5 hour. but "hour" is an integer values! 387 388but on the other hand people (maybe) will not understand immediately the 389word period. 390 391so maybe we should write "period (hour)". 392 39322--------------------------------------------------------- 394From Volker Dirr: 395 396maybe change "current constaint" into "description", "constraint 397information", "description of the selected constraint", ... (very very low 398priority, maybe one day) 399 40023--------------------------------------------------------- 401From Volker Dirr, regarding translation: 402 4031. maybe it's better to be more exact. example: phrases "min hour" better "min hour per day" 404 4052. sometimes the english version isn't always the same. 406 407sometimes you wrote "add current activity" 408sometimes you wrote "add activity" 409sometimes you wrote "add current" 410sometimes you wrote "add" 411i think it should always be the same. 412 413also sentence like: "You have to know that this constraint ..." 414should only be: "This contraint ..." 415 4163. maybe "start" should be "generate" in the generateform. 417 4184. - if you wrote one or more sentences, please always end with ., ! or ?. 419 - sometimes you wrote "students subgroups", i think you just need to write 420 "subgroups", because teachers have no subgroups. 421 - all "add", "modify", and "remove", "close" phrases should only contain 422 this word. no more words like "current" or "group". maybe wrote them with 423 QObject, because nearly every dialog have this 4 phrases. 424 4255. i think we should think and write a small definition note for english 426phrases. 427 428it looks like in a few times this terms are not always used same/correct: 429hour 430duration 431period 432lesson 433activity 434 435when we write a small definition note, then we have to care about this: 436words must also be correct for schools that don't use "hours" as one time 437hour. 438in Germany one school hour is 45 minutes. but that's no problem. we use the 439same words for that. 440but i remember a letter, a user wrote that he has 60 441minutes hours and 90 minutes hours. so he defined 30 minutes "hours" and 442set duration == 2 or duration == 3 to the activities. 443so the definition and use of hour, duration, period and lesson must also 444match to this. 445 446please let us first a small definition not for this terms: 447hour, duration, periode, lesson, activity 448this will help if we add new or modify old english phrases and it will 449also help translators. 450 4516. maybe: no brackets in "view (students)", "view (teachers)", and "view 452(rooms)". 453 4547. and it looks like we shouldn't use the word "lesson". 455in the most phases it's better to replace "lessons" by "subactivities" 456 4578. that is also why i already asked you to change english translations, 458because some phrases can be shorten. 459for example all sentences with "you", "current" or "that mean" can be 460shorten (in english and german). 461example: 462"If you insert current group to current year, that means that some years 463share the same group (overlap)" 464 465shorten version: 466"Some years share this group if it's inserted." 467 4689. and a maybe other thing. example: 469view in fet-mainform. 470there is "Time contraints (techers)". 471and in this folder is for example "Teachers max gaps per Week". 472i recommend to write just "Max gaps per Week". 473Reason: 474- it's shorter 475- it's clear that it "teachers" contraint, because it´s in that folder 476 477the English version looks fine, because you are always possible to write 478first "teachers". (except on min days between activities. You 479are not able to write Activities first.) 480In German translation it is much more difficult the write "teacher" always 481first. even including the word teacher is a much longer phrases than in 482english. it will be much easier and nice, if we don't write teacher here. 483maybe the same problem in other languages. 484 48524-------------------------DONE---------------------------- 486 48725--------------------------------------------------------- 488From Volker Dirr: 489 490For multiple generation: 491 492Maybe add a checkbox "shutdown after job is done". 493 49426--------------------------------------------------------- 495(see also entry #194) 496From Volker Dirr: 497 498long time goal: code cover planning. 499 50027-------------------------------------------------------- 501From bmlahcen13: 502 503for that i advice to start thinking from now to 504- enhance the UI 505- use Database 506- add web client 507- use UML models 508 509and also for the structure, use "int id", this will 510enhance both runtime and will reduce the storage, 511because in the FET xml files, for example to store and 512activity, you have to write again the name of the 513subject, teacher, students and also the day and time 514slot in a solution. the same happens in time and space 515constraints, these 3 entities represent a big 516percentage of the size of the file, so you use int IDs 517and not names you will certainly gain a lot of space 518and also a better execution time, i know, as you said, 519that the internal structure uses int id but for 520loading and saving xml files and searching, the usage 521of strings delays them. 522 523Liviu: maybe it would be better to compress the input file 524 52528-------------------------------------------------------- 526From more users: 527 528Improve the user interface - add help and wizard. 529 53029-------------------------------------------------------- 531From Michael Towers: 532 533What about a rewrite of the front end in a scripting language - e.g. Python? It might speed 534development and help debugging. It could also make maintenance of the code easier. 535 536Is there some way of doing "interactive" timetable development? The human would make 537suggestions, or place some items, run the program, maybe move a few things around, run the 538program again ... 539 540A clear and clean interface to your engine as an entity separate from the 541input/output might be useful. 542 543It seems to me, it should be possible (but of course only after a lot of work!) to have 544a beautiful manual timetable editor (which can also print the various timetables, and 545perhaps save the data sets and results in a database) with an interface to an automatic 546timetable scheduler which can be used to speed up the work." 547 54830-------------------------------------------------------- 549From TheStar: 550 551A constraint to think about is that some activities, and I suspect 'normal school management' 552talks about teachers as in "One teacher per x students". 553 554In the HSC year here, it's about one teacher per 26 students (or something like that). 555At a recent excursion, it was one teacher per 10 students. Hope that helps :) 556 557Liviu Lalescu: Of course, you can add each student. I could have implemented this solution. 558But I doubt that the user has such patience. 559 560You could always autogenerate the students... 561"Quick-Build Students" 562[Properties] 563[Number] 564(Build) 565 566And it will generate students with name: AutoGen-11231, ID: 11231, and the like. 567 568The user could then 'select' groups of these students... and... (Just an idea) 569 57031-------------------------------------------------------- 571From Abdul Hadi Kamel: 572 573Do you have a plan in mind to upgrade the existing fet from standalone 574application to a client-server/web-based database oriented type of 575application in the future. This is because the current fet is quite limited 576especially in terms of timetable data which cannot be keyed-in /view s 577amongs several users at the same time. This will cause hardship because the 578people involved in making the class timetable in universities normally 579consist of several key persons from different departments. Using standalone 580application by several persons sometimes make data consolidation process 581among departments become difficult and error-prone 582 583I think it will be better if the FET can support a single timetable data 584repository (using client-server model) in a database that can be input/view 585by several users simultaneously. 586 58732--------------------------------------------------------- 588From Volker Dirr: 589 590If you think that other people don't like this default constaint how about 591making a menu "default settings". there you can add "language" and my 592default wish. maybe there are other parameters, that can be set in this 593settings. I guess that there a people who want set duration to 2 or 4 by 594default. 595 59633--------------------------------------------------------- 597From kdsayang: 598 599I would like to see FET generate the time table in 600 6011. certain amount of time for each time table 6022. with some setting about the remaining weight soft conflicts 6033. generate multiple variants 604 605For example 606(A) rules are 607(i) the user select to generate 10 minutes time limit for each time table 608(ii) user set 0 for remaining weight soft conflicts 609(iii) the user select 10 variants 610 611the outcome 612(B) 613(i) the time table finished and it has generate 10 time table that concur with 0 remaining soft conflicts for each time table 614(ii) the time table finish and it only manage to get 5 variants from 0 remaining weight soft conflicts 615(iii) the time table finish BUT it don't manage to generate any variants with 0 remaining weight soft conflicts 616 617refer to (B)(iii) 618 619the user can change 620(i) longer run time to generate time table (with crossing finger) hehe... Others setting is not change 621(ii) longer run time to generate time table with increasing value for remaining soft conflicts (0.5, 1.0, 1.5 etc) 622 623As you can see in timetable --> generate multiple variants, features in (A)(i) and (A)(iii) are already there. I hope that you 624can figure it out on how to implement the feature in (A)(ii). It would be marvelous. 625 62634--------------------------------------------------------- 627From kdsayang: 628 629If a user want to add "an activity have a set of preferred rooms", the user will need to click one 630by one to add right???... So, I would like to suggest that we group them like when user want to add 631an "activity". There (activity), we can select by years, groups and subgroup for students. Instead of 632clicking all the student groups in years 1, user can just click year 1 to include them all into students.... 633 634For example for rooms (room group then room subgroup) 635 636HALL 637Hall A 638Hall B 639Hall C 640 641TUTORIAL 642A-A1 643A-A2 644B-A1 645 646COMPUTER LAB 647Lab 1 648Lab 2 649Lab 3 650 651So when user want to add "an activity have a set of preferred rooms" for all the tutorial room, instead 652of clicking 20 tutorial room one by one, user just click the group that is Tutorial. Easy right??? 653 65435--------------------------------------------------------- 655From kdsayang: 656 657What I meant is in Data --> Time Constraints --> Teacher Time Constraints --> A Teachers not available time, 6581. If you double clicked Afida, 6592. It will show Afida not available time right. 6603. Then if you want to change Sambilan not available time by choosing Teacher drop down menu, nothing happen. In fact, It still shows Afida not available time. 6614. So, if you want to change Sambilan not available time, you have to clicked Cancel button first, 6625. then double clicked Sambilan. 6636. Now you can see that Sambilan not available time is updated. 664 665My suggestion is that It will be better If FET can update to Sambilan from Afida in Step no 3. 666 66736--------------------------------------------------------- 668From kdsayang: 669 670I have some other suggestion. 671 6721. It will be GREAT if FET can be turn to tree structure. We can show/hide the structure 6732. In the tree structure, we can use the copy, cut and paste to edit the subject, activities, etc in the tree structure 674 67537--------------------------------------------------------- 676From kdsayang: 677 678If I want to change many teacher not available time, I need to add one by one although the teacher not available time is the SAME. 679 680So, I suggest that you can add a set of teachers not available time. Same as rooms not available time feature. 681 68238--------------------------------------------------------- 683From kdsayang: 684 685On current version, there is no group for subject and teacher. It is quite annoying if you have to look for certain subject X and teacher Y in that list. When the list grows bigger (let say 100), it's kinda hard because you have to find that lecture and subject in that 100 lists. Although the sorting is a good way to find the subject and teacher, IMHO maybe we can make groups in that teacher and subject section 686 687For example I want to find teacher X and subject X. Teacher X is a teacher that teach Diploma IT student. So, I just search that teacher in Diploma IT group rather than searching 100 other list. Same as subject X. 688 689This feature is needed if my/our/your university/school is a big one where teacher and subject are hundreds. 690 69139--------------------------------------------------------- 692From Zsolt Udvari: 693 694We've created a timetable but the rooms aren't. So we do it by hand. 695How can I change in FET the rooms simpler in a generated timetable? 696The times are locked. 697It would be the most simplier when I open e.g. the teachers timetable, 698click on a activities and I can add room to this. 699 700Liviu: 701I'm sorry, but you'll have to add manually constraints activity preferred 702room for each of the activities. 703I am not sure I understood correctly the problem, if not, please excuse me 704and explain more detailed. 705 706Yes, imho you understand my problem. I hoped that there is a simpler 707solution. So, maybe in the next releases would be nice: when a 708timetable is generated, user can changes/sets the rooms (only the 709activities without rooms of course) from the timetable (Timetable -> 710Show teachers/students): you select an activity, you click a button 711with "Assign room" and choose a room. 712 71340--------------------------------------------------------- 714From Naji: 715 716Hopefully, FET's team can enhanced it to be able to export the xml data to database, that will facilitates the 717output of the data and enables programmers to engage it with their programs. 718 71941--------------------------------------------------------- 720From Massimo Mancini: 721 722This is a request for a new feature... 723For Teachers and Subjects I like to use a brief description (BD), a code, and I optionally convert it to corresponding long description (LD) in the generated timetables (I refer to my current timetable procedures). So I need to define two new fields. Example: 724Theacher: MANC, MANCINI 725Subjects: MAT, MATEMATICA 726 727I think that this can be achieved without any change to current interface, simply using the format above. Of course I want use the BD only in defining activities and when I have to specify subject and Teacher. 728I wish to output the brief (only BD) or complete (LD) timetables 729 73042--------------------------------------------------------- 731From jaspal: 732 733INSTRUCTION FOR ALLOTMENT OF SUBSITUTION/ ARANGEMENT PERIODS 734 735On a particular day, faculty can be on leave, or may be busy with some 736other work hence unable to take the assigned classes. Thus, the classes 737taken by those faculty members are to be assigned to some other faculty 738members. 739 740Facility of keeping track of back log periods due to absence or 741unavailability are to be recorded year and group wise in the software. 742Also extra periods taken by the faculty has to be recorded year and group 743wise. 744 74543--------------------------------------------------------- 746From ßingen: 747 748For the internal organization of my school, it's convenient to have a general timetable for each 749group, A and B, and our timetabling software gives it. But as you observed, the footnote legend 750style it's not probably the best, as it's a little bit difficult to understand. I think in FET a good 751solution could be to be able to define a group of activities for a group (for example A, or even the whole 752year A and B), and then subdivide this group of activities in many subactivities, each of them 753with its own teacher and classroom (I have read the term "subactivity" in the manual, but I 754can't find a definition of it, nor find it in FET menus). So a group would be attending many 755activities at a time, which is not possible right now in FET. Maybe if it represents a structural 756problem FET could define internally subgroups, but being transparent for the user. This activity 757group should have a user defined name to identify (for example "Optative 1"). And then inside, 758each subactivity would have the real subject ("French language", "Arts", etc.). In this way the 759user would avoid to define such a great number of subgoups, and in the teacher's timetable 760everything would appear right and clear, with no reference to the activity group, just to his own 761subactivity, and with information of room besides of the group (opposed to the pseudoactivity 762solution to book the room). 763 764In the group timetable, the common activities would appear as always, and the others would appear 765with the activity group name. Then parallel timetables with blanks in the common activities and 766one of the subactivities for the rest could be printed . So we would need as much timetables as 767the maximum number of subactivities of the largest activity group. Maybe the subactivities could 768be diplayed in couples to avoid many timetables, as it happens now with group timetables and 769"same day+hour" activities. 770 771These parallel timetables could be hanged up on the classroom board, and, of course, each pupil 772should know which of the subactivities has to attend. I think this display should be clearer than 773the footnote legend style. I don't know if I have explained it clear enough, but if not I could 774send a spreadsheet with an example. 775 776Also, with this solution, if no activity group are defined all works as before, so we would avoid 777the problem commented by Liviu of people not needing it. 778 77944-------DONE since FET-5.19.0-(10 January 2013)----------- 780 78145--------------------------------------------------------- 782From Massimo Mancini: 783 784SUGGESTION BY: Massimo Mancini 785 786WHERE: add activity form 787 788WHAT: a check box to lock the total duration of activity 789 790WHY: to introduce an automatic check and alert on the sum of durations of 791single subactivities (currently the total duration reflect always the sum, 792so if you alter the single duration, FET recompute the total, this can be 793what you want or maybe not) 794 795WHEN: all new future are always ASAP :-D (the programmer says...) 796 797FURTHER DEVELOPMENTS: a templates system for automatic generation of activity based 798on year and subjects expected for a class of that year (normal italian 799situation, abroad I don't know ;-) 800 80146--------------------------------------------------------- 802From ßingen: 803 804- In my school the timetable is divided in morning (from 8:00 to 14:30h) and afternoon (15:00 to 17:00h). In the morning there's a break from 11:00 to 11:30h. 805I have defined this break as an hour of the timetable, but not allowing activities for any set of students in this slot. The reason is to plan the surveillance 806of the teachers in this slot. There must be always 2 teachers looking after the pupils during this period, so I define activities without students. 807The problem is that if a teacher does not have surveillance at break time, it should not count as a gap. If I define this slot as break in "Misc time constraints" 808then I can not define the surveillance activities. 809- We try that all the teachers work maximum 2 afternoons per week. This has been easy to define with "All teachers work in an hourly interval max days per week". 810But we try also that teachers who work two days per week in the afternoon to have a free morning. I don't know how to define this situation. 811 81247--------------------------------------------------------- 813From T. Renganathan: 814 815You can include a provision for multiple selection of subjects, teachers, 816activities, etc., for example using Ctrl or Shift key. This will especially be useful for deleting 817multiple entries. 818 81948--------------------------------------------------------- 820From Volker Dirr: 821 822Volker: 823if i am in FET->Data->Subjects 824i can't see at the right side all constraints. 825 826in my latest samplefiles for example the "a set of subactivities has a 827set 828of preferd time slots" is missing to that subject. 829 830also in FET->Data->Activity Tags are not all constraints displayed. 831 832Liviu: 833Yes, I know, because these are related to activities. I chose not to show them. 834 835Volker: 836please add in TODO. i think this is a nice feature we should not forgot. 837 838Liviu: 839I thought about your proposal. I think it cannot be done and I know the reasons why I didn't do that: 840a constraint activities preferred starting times has subject "" or specified. If it is "", then it is for 841all subjects. So, I should write all constraints of this type with subject "" for each subject. But this 842is not correct. A constraint might have a teacher who doesn't have this subject. 843 84449--------------------------------------------------------- 845From Volker Dirr: 846 847by the way we should add a new tests before generating a timetable: 848if 2 activities are grouped, then turn of min n day constraint of that 849activities. 850if 2 activities are consecutive, turn of min n day. 851if 2 activitives have same starting time, turn of min n day. 852 853or the opposite, bedending on what has a higher weight. 854 855maybe instead of turning of maybe just warn the user that this two 856constraints are not acceptable at the same time and tell him he should 857care about that problem first of all (by removing or reducing weight to 8580%). 859 86050--------------------------------------------------------- 861From Les W. Johnstone: 862 863Hi Liviu, 864 865I'm into the thick of it again scheduling... 866now working on two different schools... 867 868Sacred Heart College is not a problem since they use a five day blocked 869schedule. Saint John's College though is a slightly different problem... 870 871They have a five day AB schedule... 872 873which means I entered two activity groups... one for week one and one for 874week two and used different activity tags... w1 and w2 to keep things 875separate, with specific rules of placement of w1 in Week1 and w2 in week 8762... 877 878However, your spacing feature doesn't work ... not on more than five 879days.... not sure it would be possible to extend your logic or not... (what 880do you think?) 881 882The other thing I've noticed is a bit of an annoyance concerning 883constraints... when you are trying to get a schedule to work you push in 884constraints however, on slight modification of activities (concerning 885resources etc.) sometimes, what was once soluble becomes insoluble. 886 887Usually this means you have to relax constraints in order to get the 888schedule soluble... some (most) can be set to a 0% weight which means they 889are ineffective.. then later you can turn them on again... however, some 890rules are only acceptable at 100%... which means you need to drop them from 891the constraint set... 892 893but the constraint may be important and be forgotten to reimplement... 894could you set an active/inactive flag for constraints like you have for 895activities... so it can later be reimplemented? 896 89751--------------------------------------------------------- 898From Chafik Graiguer: 899 900Liviu: 901There is no easy way to remove a component. 902 903Chafik Graiguer: 904well 905to re-use last year .fet file, 906what about 907-removing all activities at once, so Data keeps only subjects, teachers and groups ? 908or 909- removing all teachers from all activities (because teachers dont teach the same groups every year) 910or 911- removing all groups from all activities 912 913Liviu: 914I just looked in the sources and it seems that in statistics I only count active activities. Please verify that, though. 915 916Chafik Graiguer: 917yes ! 918and I spend nealy ONE hour counting periods for teacher Eng1!! 919in Statistics, teacher Eng1 has only 20 hours 920in Data ---> activities, I count 21 hours :-)) for him 921finaly, I realised that I has deactivted one hour component by mistake 922 923so, is it possible to add this line into activity window: 924Quote: 925Activity: 926Teacher=fr4 927Subject=fr 928Students=2Lg -1 929Id=1 930Activity group id=1 931Duration=1 932Total duration=5 933Total active: XX 934Active: yes 935Total number of students=0 936 937-----------addition: 938Chafik Graiguer: 939- removing all groups from all activities 940sorry, removing groups does not make sense, because, activities should keep group's information 941Groups have the same set of activities every year 942 943So the most important is: 944-removing all activities at once, so Data keeps only subjects, teachers and groups ? 945but this is not so good, as we will lost time and space constraints related to those activities 946So, the best of the best is: 947- removing all teachers from all activities (because teachers don't teach the same groups every year) 948so we can re-assign new teachers to groups 949 95052--------------------------------------------------------- 951From Massimo Mancini: 952 953Consider this: 9541. I inspect the activities of a teacher (via filter on teacher) 9552. I see the lack of an activity (or I delete one or more filtered 956activities because I want redefine them) 9573. I push the add buttom... why the subjects aren't 958only those that teacher teach? 959 960A more general question... why not associate in advance the teacher with 961his students and with the subject he teaches? In this way I could obtain some 962type of automatic filter. 963If I add an activities of mines I select MANC but MANC teach MAT in GEO_1B, 964GEO_2B, GEO_3B and IGE_1A. The program should be aware of this. 965 96653--------------------------------------------------------- 967From Massimo Mancini: 968 969When I review generated timetable with view (teachers) menu option I can lock/unlock 970the placed activities and this is ok. But why I cannot do the same for 971empty cell? The meaning of locking an empty cell should be to add/modify a 972Teacher not available constraint or something that have the 973same effect... so a new generation leaves those positions untouched. 974 975A I said I would to lock/unlock some students or some teacher and 976recalculate the rest. 977 97854--------------------------------------------------------- 979From Frans Cilliers: 980 981About campuses: What I thought is the following. Currently you have min 982gaps between buildings and maximum building changes per day. If this can 983also be done for campuses, for example minimum gaps between campuses for 984teachers. (An extra constraint but it will probably be to difficult as 985you mentioned) 986 98755--------------------------------------------------------- 988From K: 989 990Maybe you remember my post from April (many teachers – many groups). Since 991than in our team we’ve been trying to adapt our internal solutions to use 992FET (it is really your great success). 993We tried to use FET to solve timetable for a pretty big plan and by the 994way we had to solve a few problems and got some experiences as an 995end-users. Maybe it would be interesting also for you. 996... 997 The third problem was to export data from the program we use for planning 998(a database application) to FET and than import data back. I pre-assumed I must 999enter data to the FET automatically as the number of activities and 1000constraints is too high to handle them manually. Also a plan generated by 1001FET had to be automatically imported to our database. I used FET 1002procedures to import teachers, students and rooms. I also tried to use 1003FET import procedure for activities too but I had a problem with IDs. FET 1004generate its own ids but I needed to use my own ones to keep link between 1005data in the database with those in the FET so finally I decided to 1006generate input file instead. Fortunately FET doesn’t change ids and 1007generate perfect XML file with generated plan and 1008thanks to known ids I could import data from FET to our database with no 1009problem. 1010 The next point. Due to number of constraints we have in our database I 1011used similar procedure to generate a part of FET input file with teacher 1012time constraints and room time constraints. Hence I have a question. 1013Would it be possible to include file path into FET input file to keep 1014data in a couple of separate files as working with 100 000 lines file is 1015not fun? 1016 We prepared the whole procedure for timetabling with FET. First we 1017planned (in the database program) activities for VIPs manually. To use FET 1018we also had to put into the timetable all activities where students from 1019one group could choose one activity from a several ones (languages and 1020some lectures) at the same time. That is why in the input files are so 1021many “permanently locked” activities and activities with many groups and 1022only 10 students to avoid conflicts with room capability (I used 1023<Activity_Tag>UL to mark them). Together with these activities we locked 1024a room by preferred_room constraint. After that I included prepared data 1025to the FET input file and after all we started to generate 1026the plan. Fortunately FET is smart enough to find mistakes in locked 1027activities (room and time conflicts) so than we removed conflicts for 1028already planned activities. 1029 By the way – during reading the input file I noticed the error 1030that rises when the number between tags: 1031<Number_of_Not_Available_Times>NUMBER</Number_of_Not_Available_Times> 1032was not exactly the same as the number of constraints in the file. Of 1033course it is not a bug. It never happens if user use FET to input 1034constraints. But it forced me to count constraints during generating data 1035and shows that program is rather “sensitive”. 1036The first hint for other users is to start with minimum number of 1037constraints and if FET would generate the plan than thinking about adding 1038the next ones. In TODO file I found the suggestion of “possibility to 1039disable constraint without removing it. Such 'Active' checkbox like on 1040activities dialog”. I admit – it would be nice. Moreover finding a good 1041plan is just like using 10 knobs increasing one constraint and decreasing 1042the other so fast access to the constraints window is crucial. I suggest 1043to put “Time constraints” and “Room constraints” buttons also in the main 1044menu (or creating any other shortcuts) as these constraints are rather 1045deep in the menu. 1046The next suggestion is to change the interface for some constraints 1047(particularly wherever there is a long list). For instance for the 1048constraint Max day for a teacher per week if we have many teachers a 1049simple table like: 1050 1051| Teacher Name | Max days| 1052| teacher 1 | n | 1053| teacher n | | 1054 1055with a button “Save all changes” would be great. Now we have to enter 1056value for every teacher one by one in separate windows. 1057 After setting constraints we tried to generate the next version of the 1058plan. We added more and more constraints (for instance WOLNE – dump 1059activities - free day for student or increasing max day for teacher) and 1060I was really surprised when FET coped with that. It took from about 1,5 1061minutes (almost no constraint) to over 20 minutes (with many constraints). 1062With too many constrains after 1063about 10 minutes when I saw no change in the number of placed activities 1064(neither up nor down) I cut simulation, removed some constraints and 1065started it over. 1066 The second hint is not to change too many constraints in one simulation 1067as it may lead to impossible timetable and than it is difficult to say 1068which particular constraint was too much. 1069 Of course there is a lot of work to do. For instance even when two 1070consecutive activities are placed at one day (the same group and the same 1071teacher) sometimes there are placed at different rooms what would force 1072them to needless changing room. I guess that FET is focused on fulfilling 1073constrains but not on optimizing timetable. Sometimes simple changing of 1074two activities makes plan better both for students and teachers. I think 1075that manually improving generated plan is faster than creating many many 1076more constraints and repeating simulations. And this is the third hint. 1077 107856--------------------------------------------------------- 1079From Chafik Graiguer: 1080 1081When a user click on Data ---> activities 1082he is presented with a list of all activities because filter fields are empty 1083all activities are listed based on Activity Id 1084Now, is it possible to a add sort feature like this 1085Sort by: 1086 Teachers 1087 Students 1088 Duration 1089 Subject 1090 Act Id 1091 1092So for example, if you select teachers, all activities will be listed alphapetically in a ascendent order 1093 109457--------------------------------------------------------- 1095From Massimo Mancini: 1096 1097In advanced lock/unlock I would lock/unlock on teachers basis (with pick up 1098the teacher from list of teachers) or on students groups basis (always from 1099a list) The lists are mentained from subsequent generations and saved with 1100data. 1101 110258--------------------------------------------------------- 1103(see also items #149, #368, and #396) 1104From Massimo Mancini: 1105 1106I have another suggestion: an history file where you record all the actions 1107of the timetabler and theirs effects. If the history was visible in a a frame 1108in the View timetable forms, I would see scroll the messages without interruption 1109and with the opportunity to review them (please don't answer that is too 1110complicated... you can use a tab widget, a tab for the current situation 1111another for history... the right answer is: GREAT! I add it in TODO! ;-))). 1112In general an history file should be a great thing and the base for 1113undo/rollup features. 1114 111559--------------------------------------------------------- 1116From George Milliotis: 1117 1118I propose the ability to sort constraints by: 11191. Type [so single ones - ones that you can't add twice - go to the top] 11202. ID of activity 11213. room / day 1122and so on 1123 1124This could also be done for activities. If I add two activities for the 1125same subject, why do I need to have one at the bottom (id 200) and the 1126other at the top (id 5)? 1127 1128BTW, I haven't used the menu once since I got this new version. I like 1129the basic concept of the shortcuts. If the dialogs were not modal I'd be 1130opening all sorts of windows and working much faster. If I could HIDE 1131buttons selectively I'd even be able to get the secretaries to do the 1132schedule and save ALL my time. 1133 113460-------------------------------------------------------- 1135From Frans: 1136 1137I refer to the Data menu, space constraints and say students, set of home rooms and then add. 1138In this box I select the students and then the individual venues. 1139 1140If I for example already defined an activity tag for Large rooms, I want to add the activity tag 1141instead of the individual venues. 1142 1143Now that I think again I doubt if it will be possible, because FET has to make a distiction between 1144general activity tags and "room" activity tags as the room activity tags must also appear in the rooms 1145list so that it can be selected. How will FET know this. 1146 114761-------------------------------------------------------- 1148From Volker Dirr: 1149 1150an other useful feature is: 1151modifying in settings the default min days constraint (for add activity). 1152 1153because we nearly always use 100%, not 95%. 1154 1155modifing later all to 100% isn't the best, because there are a few 1156activities with min days = 0%. 1157 115862------------------------DONE----------------------------- 1159 116063-----------------------DONE------------------------------ 1161 116264--------------------------------------------------------- 1163From aliponte: 1164 1165An activity tag can be assigned the property not to count the underlying activities. 1166 1167Please consider also this flag to affect the constraints with "days". A pseudo activity should not increase the number of days (if it is the only 1168activity of a day). A pseudo activity should be "invisible" for all countings concerning constraints, and for countings concerning statistics (teachers, students, subjects). 1169 117065--------------------------------------------------------- 1171From aliponte: 1172 1173There are many suggestions from FET users to improve FET's UI. It will be nearly impossible to find a UI that meets everybody's needs, I know. But let me just present, what was confusing me for a while. Maybe I'm not the only one. 1174 1175Dialog "Modify activity": 1176Changing the state of the check box "Active" does not change the active/passive state of all subactivities that belong to the same activity. It affects only the single subactivity that shows in the tab (= the one that has been highlighted bevor the dialog was opened). If I want to activate the whole activity I have to click through all of the tabs. (It took some time until I understood this.) 1177 1178Since there are two dialogs, one for activities and one for subactivities the (novice) user does not expect the possibility of editing individual subactivity properties in the activities dialog (because individual activation and individual duration of subactivities can be chosen in the subactivities dialog). 1179 1180By the way, is it really necessary to have two dialogs? I could imagine a check box "subactivity only" in a common dialog for both, activities and subactivities. This would make this comment obsolete. 1181 118266--------------------------------------------------------- 1183From Chafik Graiguer and Pietro (see also items #145 and #248): 1184 1185DONE since FET-5.41.0 - 2019-11-20 --> -Min hours daily with an activity tag (to count real activities only leaving pseudo activities out of count) <-- DONE 1186-Min hours continuously with an activity tag 1187 118867--------------------------------------------------------- 1189From Gert Veltink: 1190 1191I would be very pleased, if in a future version it would be possible to specify the number of students for an activity as an extra column in the activities.csv. 1192 1193Rationale: I mainly use FET for planning examinations. In this setting the number of calculated participants and actual participants differs significantly, because students have to repeat examinations or do not register for examinations. 1194 119568--------------------------------------------------------- 1196From Mr Robo: 1197 1198In the Time tab, Break button, leading to the dialog to set up break times... At the moment, I set up one break time constraint that has 1199morning breaks and lunch breaks combined. 1200 1201If I set up two (one for break and one for lunch) and I could attach a label that would be displayed in the unavailable slots in the 1202finished timetable, such as 'Break' or 'Lunch', it would save me having to edit each Student, Teacher and Room timetable before they 1203can be printed, etc. It's quite manual at the moment because '-X-' is used throughout and I can't do a global search and replace. 1204 1205Also suggested by S Chandrasekar, on forum: 1206 1207It is important to display a text like "LUNCH INTERVAL" or "SHORT INTERVAL" or "ASSEMBLY" in the break slots rather than an 1208"-X-" symbol. Is it possible? 1209 1210Also suggested by Nagendra, on forum: 1211 1212You can consider including this in settings -> timetables -> "Mark break slots with custom text". Let the user decide, whether s/he wants 1213to use the default '-X-' or any custom text. Similarly for 'uniting' the cells. 1214 121569--------------------------------------------------------- 1216From George Miliotis: 1217 1218About the "Years", "Groups", "Subgroups" check boxes in add/modify activity and 1219modify subactivity dialogs: 1220 1221I'd be more interested in FET actually remembering these settings 1222globally (not even per form) for each session, no need to actually store 1223to disk. 1224 122570--------------------------------------------------------- 1226From Frans (on forum): 1227 1228Frans: 1229 1230I came across the following, it is possible that you know about this: 1231 1232I generate a timetable with constraints such as minimum hours daily for a students set 1233 1234Next from the data, students, groups or subgroup menu I deactivate all activities for one group. This group has the constraint minimum hours. 1235 1236I generate again and then Fet- gives an error message and stops, namely you have too little activities to respect the constraint minimum hours .... 1237 1238In other words I must go to minimum hours and delete the constraint. It is not deactivated automatically. 1239 1240As said I do not know if it must be like this. Other constraints such as same starting time are automatically de-activated. 1241 1242Liviu: 1243 1244It is normal to be like that, because it is hard to take care of such constraints, and because you don't deactivate a students set, but a set of activities. The constraint min hours daily is for a students set, not for a set of activities. 1245 1246Frans: 1247 1248I understand what you say, but I am not talking about deactivating activities. In my case however I had to deactivate a complete studens set and this one can only do from the data menu. In other words everything for a students set must be deactivated. 1249 1250Studens go out to work in private practice for a few months. During that period they are not on campus and everythig must therefore be deactivated as another students set takes their place and must be scheduled. 1251 1252If it was possible to deactivate everything only when one uses the data menu. 1253 1254Liviu: 1255 1256Yes, you are right in a way, but there are many problems which may appear if I do like you say, and the things are complicated. 1257 1258For instance, user deactivates a students set's activities, then activates only one activity for this user. Or if there is an activity with more students sets, of which some are deactivated and some are activated. Or there might be a global constraint min hours daily for all students. 1259 1260The perfect approach might be to add a flag to each teacher, subject, activity tag, students set -> active or not active. 1261It would be kind of tedious and difficult to change now, as it was not designed from the beginning. 1262 126371--------------------------------------------------------- 1264From Jason (on guestbook): 1265 1266Ask for new feature: 1267 1268- Auto generated after allow user to manual adjust timetable (Drag and Drop in view timetable) 1269 127072--------------------------------------------------------- 1271From Zsolt Udvari (on forum): 1272 1273If I de-activity all activities of a whole year (student set), FET will not ignore "min hours daily" constraint. 1274So I've two suggestion immedi: 1275- when FET checks this (and similar) constraints, would tolerate this 1276- can deactivate the students set (and related activities, constraints, etc.) 1277 127873--------------------------------------------------------- 1279From Zsolt Udvari (on forum): 1280 1281It would be nice when can filter in activities list by "no teacher" and "no students". 1282 128374---------------------------DONE-------------------------- 1284 128575--------------------------------------------------------- 1286From Chafik Graiguer (on forum): 1287 1288Clone activities or constraints: 1289 1290Is it possible to clone activities for one student set to another? 1291Last year, Year 1S had 3 student sets 1292Now Two new student sets have been added 1293Student sets from same year have same activities and of course same time constraints 1294So how it is possible to do an activities Clone from 1S03 to both 1S04 and 1S05 with or without assigned teachers ? 1295 129676--------------------------------------------------------- 1297From Zsolt Udvari (on forum): 1298 1299Default settings per subject: 1300 1301Is there any chance to make it? In my school the all "English" subject is 4 per week (and there are more similar subjects). So it would be nice, when I don't should set these settings (activities per week, tags). 1302 130377--------------------------------------------------------- 1304From Chafik Graiguer (on forum): 1305 1306Save button on Activity Planing Window: 1307 1308For users working with activity planning window, they will probably spend most of the time on it 1309But this window is lacking a save button, so users have to close it from time to time to get access to FET main window to save work 1310Can a save button be added to activity planning window? 1311 131278--------------------------------------------------------- 1313From Chafik Graiguer (on forum): 1314 1315About constraint min gaps between a set of activities: 1316 1317Now, how about applying this contraint globally? I mean every activities with subject (or tag) Math sould be 2 hours apart from an activity with subject (or tag) Physics? 1318Entering all activities, one by one is tedious 1319How it is easy/possible to add: min gaps between a set of activites with a tag? 1320 1321or better: 1322Min gaps between two subjects/tag 1323 132479--------------------------------------------------------- 1325From Chafik Graiguer (on forum): 1326 1327Filter for modify multiple constraints at once: 1328 1329In the min days between activities window 1330there is an option for: Modify multiple constraints at once 1331Is it possible to add a standard filter: teacher, student set, subject, tag ? 1332So I can multi-change only those activities with a given subject or teacher... etc? 1333 133480--------------------------------------------------------- 1335From Chafik Graiguer (on forum): 1336 1337Filter teachers: 1338 1339Students are easily filtered because they are grouped using years then groups 1340So at Students set not available time window, we can, for example, apply unvailability to only one year, thus affecting groups under that year 1341We can also apply unvailability to group, thus affecting Subgroups under that group. 1342 1343Unfortunately , teachers are treated either individually or totally (constraints for ALL teachers): ONE or ALL 1344Zsolt Udvari already wrote: 1345Quote: 1346It would be nice when can pair teachers with his/her subjects and can filter in the activity dialog. 1347So, what do I think? I'm teaching Math and Phisycs. So to my name can add these subjects and when I add a new activity and select Literature, my name will not shown, only those teachers who teaches Literature. 1348 1349So it would be very practical, less time consuming, to treat teachers per groups based on 1350- Home subject 1351or 1352- any other artificial tag like : 1353-part_time_teachers, 1354- team teachers, 1355-..etc 1356 135781----------------------------DONE------------------------- 1358 135982--------------------------------------------------------- 1360From Valdo (on forum): 1361 1362Conclusion: he has many teachers, and almost all should have max 2 gaps per week, with 2 exceptions, who may have more gaps. He 1363does not want to add manually that many constraints. So, he suggests that FET should add constraints for all teachers, 1364with a selected number of max gaps per week, and then the user can modify each one by hand. 1365 1366(Suggested indirectly also by Julio González Gil, on the forum.) 1367 1368Added on 2017-07-31, by Valdo, on the forum: He wanted to add teachers' max hours daily 4 for all teachers, with an exception to allow max 5 hours daily for 1369a single teacher. There were too many constraints to add. 1370 1371Suggested also by utismetis, on the forum, on 2017-08-07. 1372 1373Suggested also by Davide Cottignoli, on the forum, on 2017-08-18. 1374 1375Suggested also by mercurialuser, on the forum, on 2017-09-05. 1376 1377Suggested also by auriolar and Rodolfo Ribeiro Gomes, on the forum, on 2018-04-15 (they suggest to add exceptions to the general constraint). 1378Rodolfo Ribeiro Gomes: I don't think it needs to change the constraint names. Just add the 'exception' field. 1379 1380Suggested also by pg788, on the forum, on 2018-07-02 1381 1382Suggested also by satellite2, on the forum, on 19 December 2018 (https://lalescu.ro/liviu/fet/forum/index.php?topic=3996.0): 1383 There are very useful time constraints for me concerning teachers (or students) such as "max days per week for a teacher (or for all teachers)". 1384I want to use this constraint for the majority of teachers but not all of them. We have some teachers that have to teach 5 days a week because their 1385course load is impossible for less days. I wonder whether there is a way to adapt this constraint like "max days per week for the selected teachers" 1386or "max days per week except these teachers" instead of entering all of the teachers one by one. Is this difficult to implement? (Because there are 1387lots of teachers in the university). 1388 1389Suggested also by Zafar Allah Askar (on forum), on 26 October 2019 (https://lalescu.ro/liviu/fet/forum/index.php?topic=4313.0): 1390 Create lists of teachers to be added to a constraint. 1391 1392See also TODO item #84. 1393 139483--------------------------------------------------------- 1395From Massimo Mancini: 1396 13971. Constraint not available time slots for a teacher 13982. I put a name in filter and I see there's any constraint of this kind on 1399that teacher 14003. Then I press Add. I expect the teacher field filled with the name I used in 1401filter... but currently FET propose always the first teacher in list. 1402 140384--------------------------------------------------------- 1404From Massimo Mancini and Chafik Graiguer: 1405 1406Consider this: 1407 14081. the max num of hours for day is 5 for ALL teachers, the max num for teacher X is 3: this 1409works 1410 14112. the max num of hours for day is 4 for ALL teachers, the max num for teacher X is 5: this 1412NOT works as expected. FET simply refuse the exception. The exception does 1413not override the global in any case. 1414 1415I remember we discussed this "strange" logic (imho an exception is an 1416exception and always override a global condition) last year, it seems that 1417the workaround is to manage this scenario using only individual constraints 1418(isn't it?), very tedious. If so I suggest a button in the form of global 1419constraint to automatically generate all the individual constraints one 1420needs. 1421 1422From Chafik Graiguer (same subject): 1423 1424My suggestion was not only about adding a teacher one by one 1425It is about get rid of double menu entries 1426For example, for Teachers and students, and for every constaint, FET has double entry like this: 1427-Max days per week for a teacher 1428-Max days per week for all teachers 1429-Min days per week for a teacher 1430-Main days per week for all teachers 1431...etc 1432My idea is to make a single entry for any constraint like this : 1433-Max days per week for teacher (s) 1434 1435-Min days per week for teacher (s) 1436 1437This has another advantage: 1438user will be presented by a window like described in my screenshot, where he can press Add all button 1439Now suppose, like user X, that I have 50 teachers or 50 student sets 1440I can easily add them all into Min days per week =5 1441then on the right pan double click on 5 teachers to deselect them before clicking Add constraint 1442Then add another Min days per week =3 for those 5 teachers !! 1443If we have tags for teachers (and rooms) it will even more easier 1444 1445This concept is already used in FET in two places: 1446- Set all available, set all not available 1447- subject has a set of prefered rooms 1448 1449See also TODO item #82. 1450 145185--------------------------------------------------------- 1452From Massimo Mancini: 1453 1454Consider the form that lists the constraint "teacher non available": 1455change the line format from DESC CONSTRAINT + TEACHER'S NAME to 1456TEACHER+CONSTRAINT or, better, codify description of constraint using some string of 1457fixed size like so: 1458 1459HTNA - NAME ..... 1460 1461I know the problem of translation (you may omit the description at all, it is 1462useful only when you display ALL constraints), but I think that a code is less boring 1463than a long and incomplete description repeated at beginning of all lines. 1464 146586--------------------------------------------------------- 1466From Andres Chandia (on forum): 1467 1468Is there a way to tag teachers, for different purposes like, a group of teachers can only work in the morning, or an activity can only be given by a 1469teacher of certain group, etc. 1470 147187--------------------------------------------------------- 1472From Massimo Mancini: 1473 1474a problem that we discussed in the past is about the description of 1475constraints (specially in the list of constraints or in the list of 1476conflicts): they are too long. 1477You must well understand that the unlucky timetable maker need to see the 1478troubles at a glance: reading long sentences with absolutely redundant 1479parts is very difficult and time consuming. 1480This is a problem in english but the solution can be achieved also and only in 1481translations... (a buon intenditor...;-) 1482 1483So in the following you will find an example of that I think is a good list. 1484Of course is only my opinion. But, trust me, is a useful one 1485 1486----- NOW -------------------------------------------------- 1487 1488Conflitti lievi totali: 13.7 1489Elenco dei conflitti leggeri (in ordine decrescente): 1490Vincolo di tempo infranto Numero minimo di giorni tra attività: l'attività con id= 290 (I:PANS, M:FRA, S:AMM_1 B) è in conflitto con l'attività con id= 289 (I:PANS, M:FRA, S:AMM_1 B), essendo 1 giorni troppo vicine, nei giorni Martedì e Martedì, incremento dei conflitti= 0.99. Le attività sono collocate consecutive nell'orario, perchè hai scelto questa opzione nel caso che esse capitassero nello stesso giorno 1491Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante DIRU il giorno Mercoledì durata=5. Questo incrementa la conflittualità di 0.99 1492Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante GADO il giorno Sabato durata=5. Questo incrementa la conflittualità di 0.99 1493Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante MALG il giorno Sabato durata=5. Questo incrementa la conflittualità di 0.99 1494Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante MESS il giorno Sabato durata=5. Questo incrementa la conflittualità di 0.99 1495Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante OSIO il giorno Lunedì durata=5. Questo incrementa la conflittualità di 0.99 1496Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante POLE il giorno Venerdì durata=5. Questo incrementa la conflittualità di 0.99 1497Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante PULI il giorno Mercoledì durata=5. Questo incrementa la conflittualità di 0.99 1498Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante RAPE il giorno Sabato durata=5. Questo incrementa la conflittualità di 0.99 1499Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante xAZ1 il giorno Sabato durata=5. Questo incrementa la conflittualità di 0.99 1500Vincolo di tempo infranto Numero minimo di giorni tra attività: l'attività con id= 416 (I:LUCH, M:DIR, S:IGE_2 C) è in conflitto con l'attività con id= 415 (I:LUCH, M:DIR, S:IGE_2 C), essendo 1 giorni troppo vicine, nei giorni Sabato e Sabato, incremento dei conflitti= 0.95. Le attività sono collocate consecutive nell'orario, perchè hai scelto questa opzione nel caso che esse capitassero nello stesso giorno 1501Vincolo di tempo infranto Numero minimo di giorni tra attività: l'attività con id= 521 (I:LUZZ, M:EAZ, S:IGE_5 A) è in conflitto con l'attività con id= 517 (I:LUZZ, M:EAZ, S:IGE_5 A), essendo 1 giorni troppo vicine, nei giorni Martedì e Martedì, incremento dei conflitti= 0.95. Le attività sono collocate consecutive nell'orario, perchè hai scelto questa opzione nel caso che esse capitassero nello stesso giorno 1502Vincolo di tempo infranto Numero minimo di giorni tra attività: l'attività con id= 617 (I:xAZ2, M:EAZ, S:IGE_3 B) è in conflitto con l'attività con id= 615 (I:xAZ2, M:EAZ, S:IGE_3 B), essendo 1 giorni troppo vicine, nei giorni Sabato e Sabato, incremento dei conflitti= 0.95. Le attività sono collocate consecutive nell'orario, perchè hai scelto questa opzione nel caso che esse capitassero nello stesso giorno 1503Vincolo di tempo infranto Numero minimo di giorni tra attività: l'attività con id= 718 (I:CARU, M:COS_DIS, S:GEO_3 A) è in conflitto con l'attività con id= 715 (I:CARU, M:COS_DIS, ChA:info4, S:GEO_3 A), essendo 1 giorni troppo vicine, nei giorni Sabato e Sabato, incremento dei conflitti= 0.95. Le attività sono collocate consecutive nell'orario, perchè hai scelto questa opzione nel caso che esse capitassero nello stesso giorno 1504 1505----TOMORROW I HOPE ()IMHO)------------------------------------------------- 1506 1507Conflitti lievi totali: 13.7 1508Elenco dei conflitti leggeri (in ordine decrescente): 1509VT: Num.min.gg, tra attiv.: AttID= 290 (I:PANS, M:FRA, S:AMM_1 B) vs. AttID= 289 (I:PANS, M:FRA, S:AMM_1 B): +1 Mar -Mar : +0.99 1510VT: Num.max. 4 h consec. : DIRU : Mer : 5 : +0.99 1511VT: Num.max. 4 h consec. : GADO : Sab : 5 : +0.99 1512VT: Num.max. 4 h consec. : MALG : Sab : 5 : +0.99 1513VT: Num.max. 4 h consec. : MESS : Sab : 5 : +0.99 1514VT: Num.max. 4 h consec. : OSIO : Lun : 5 : +0.99 1515VT: Num.max. 4 h consec. : POLE : Ven : 5 : +0.99 1516VT: Num.max. 4 h consec. : PULI : Mer : 5 : +0.99 1517VT: Num.max. 4 h consec. : RAPE : Sab : 5 : +0.99 1518VT: Num.max. 4 h consec. : xAZ1 : Sab : 5 : +0.99 1519VT: Num.min.gg, tra attiv.: id.416 (I:LUCH, M:DIR, S:IGE_2 C) / id.415 (I:LUCH, M:DIR, S:IGE_2 C): +1 Sab-Sab : +0.95 1520VT: Num.min.gg, tra attiv.: id.521 (I:LUZZ, M:EAZ, S:IGE_5 A) / id.517 (I:LUZZ, M:EAZ, S:IGE_5 A): +1 Mar-Mar : +0.95 1521VT: Num.min.gg, tra attiv.: id.617 (I:xAZ2, M:EAZ, S:IGE_3 B) / id.615 (I:xAZ2, M:EAZ, S:IGE_3 B): +1 Sab-Sab : +0.95 1522VT: Num.min.gg, tra attiv.: id.718 (I:CARU, M:COS_DIS, S:GEO_3 A) / id.715 (I:CARU, M:COS_DIS, ChA:info4, S:GEO_3 A): +1 Sab-Sab : +0.95 1523 152488--------------------------------------------------------- 1525From Volker Dirr: 1526 1527students set max gaps per week 1528and 1529students set begins early 1530 1531need a filter/checkbox show only O year O group O subgroup 1532because there are so many students (subgroups) and it is useful to add 1533that counstraints for lower years. but the list is so long, so it is very 1534difficult to find the years. 1535 1536that filter is also useful for students set not available. 1537 153889--------------------------------------------------------- 1539From Paolo (on forum): 1540 1541Well, for me it would be very very (very) important thinking over the constraints while fet is working. 1542 1543So i ask, kindly, if it is possible getting a print function of all constraints (at least of time constraints). 1544 1545Liviu: A temporary solution would be to open two FET programs simultaneously. 1546 154790--------------------------------------------------------- 1548From daviodan: 1549 1550Possibility to edit the timetable after generation, drag-drop of activities. 1551 155291--------------------------------------------------------- 1553From Yush Yuen: 1554 1555Sometimes we have 3 teachers available to teach the same "kind" of 1556class. For example, Teacher A, B C may teach either one of Math for 15577A, 7B, and 7C. It is possible that one combination may yield a 1558timetable that is easier than another. So, it would be nice if we can 1559have an option to generate "alternative" scenarios with the different 1560combination. 1561 1562A possible way to do that may be: 1563- adding a "teachers-activities pool" dialogue. 1564- activities of the same pool may swap teacher 1565- each pool may be enabled or disabled at timetable generating time 1566(you may not need all combination all the time) 1567- all generation time, make an option for "generating alternatives" 1568and save each alternative in a different folder or something 1569 1570Or: 1571- activities are created without teachers 1572- adding a "teacher can teach: activity tag" dialogue 1573- at generation time, teachers are assigned to activities based on 1574which teacher has the right "teacher can teach tag" 1575 1576Or, another way of doing this (perhaps a more elegant way) is to make 1577a "preferred teacher" constraint like the preferred room constraint. 1578However, also add an "same room/teacher" option. That is, room/teacher 1579may be selected from list of preferred rooms/teachers, however, the 1580same room/teachers must be assigned to the same activities. 1581 158292--------------------------------------------------------- 1583From Silver (on forum): 1584 1585Constraint "Min gaps between activities in the day for teacher". 1586I mean like this : 1587when I select Min gaps = 2 1588Saturday: activity - gap - gap - activity - gap - gap - activity 1589 159093--------------------------------------------------------- 1591From George Miliotis (on forum): 1592 1593I think the ability to renumber the IDs of the activities starting from a specific ID would be very useful in other XML-related work, too. 1594 1595An advanced option: "renumber activities" with a dialog asking for "new lowest ID" would be ideal for these merge-split issues. 1596 1597In this case we could renumber the first FET file from 1, the second from 1000, then copy paste directly into the XML file. 1598 1599This would get all rules and activities, wouldn't it? 1600 1601But maybe we could use XSL for this. 1602 160394--------------------------------------------------------- 1604From aang (on forum): 1605 1606I have a problem though in the formatting of the html files and consequently the printing. Now, an activity will be printed with six subgroups on the timetable 1607making it unusually wide(or tall) and the subgroup names do not actually reflect the student set that should be displayed e.g Mwaniki-CRE-4 E BIOCRE1, 4 E PHYCRE1, 16084 W BIOCRE1, 4 W PHYCRE1, 4 N BIOCRE1, 4 N PHYCRE1, 4 S BIOCRE1, 4 S PHYCRE1 1609instead of Mwaniki-CRE-4 CRE1 or Mwaniki-CRE-4. This means i edit the timetable manually after every generation to make this changes. I suggest adding a displayname 1610tag to the activity which defaults to the current display name (without the activityID) and using this to determine what is displayed for the activity. 1611 1612Another thing, for activities with same starting time, is it possible to have them in one column/row so that the number of rows/columns is fixed to the either the number 1613of days or lessons (depending on the selected timetable)? This way it is easier to print. 1614 161595--------------------------DONE--------------------------- 1616 161796--------------------------DONE--------------------------- 1618 161997--------------------------------------------------------- 1620From liquid (on forum): 1621 1622Based on what I experience while creating not an easy timetable I would do suggest to enable more categories than 3. Max number of categories I need years to split to is 7. I do it manually at the moment but it is time and mind consuming. I know it might seem unusual however requirements for the timetable are indeed real not theoretical. 1623 1624Liviu: Too many categories might slow down the generation and consume too much memory (there will be many empty subgroups). Anyway, anybody can consider as many categories as needed, by adding groups/subgroups manually or using another program to generate the .fet XML file. 1625 1626liquid: I'd like to mention something that might be worth to consider. As we said earlier we can always make our own division of the year to groups and subgroups which are going to be most suitable to one's needs. It would be good to have the possibility to delete unused (empty) subgroups from all groups. Now, FET kindly informs us that a subgroup belongs to another group and you have to delete it again and again from every other group. 1627 1628Update: The maximum number of categories now is 4. 1629 163098------------------------DONE----------------------------- 1631 163299-------------------------DONE---------------------------- 1633 1634100--------------------------------------------------------- 1635From Chafik Graiguer (on forum): 1636 1637I spent much time striving to solve an impossible timetable 1638I wonder if FET can automatically report it impossible then abort 1639-First case: a teacher having only 5 hours per week: 1+1+1+2 (Min days between activities=1) 1640With Min hours per day for teachers = 2 1641This lead for an impossible timetable, but FET desperately trying to solve it for hours and hours 1642 1643-Second case: 1644A teacher has 15 hours 1645 1646With a maximum of 4 hours per day, given a 6 days week, this would allow him 1 free day or even 2 free days (4+4+4+4) 1647But activities were split in a rather strange fashion 1648Group G1: 3+3 1649Group G2: 2+2+2+3 (Min days between activities = 1) 1650Activities from G1 alone would occupy him for 2 days 1651Then come activities form G2 which require additional 4 days 1652Total is 6 days !! 1653I set Max days per week = 5 1654This leads to yet another impossible timetable 1655 1656My question: can FET automatically report it impossible then abort? 1657 1658101--------------------------------------------------------- 1659From drew: 1660 1661Actually the biggest problem was with teacher T1, who was mistakenly scheduled for 7 activities with activity AT1. But, there are only 6 timeslots available for AT1. FET needs a way to detect and report on this kind of error. This is not the first time I made that kind of mistake. 1662 1663After I deactivated activity id 1, a problem with teacher T2's not available times. Instead of marking him not available for the first two AT1 time slots on Saturday afternoon. After I relaxed it to him just being not available for the 1st time slot FET was able to create a schedule. 1664 1665I'm not sure how you in on T2's not available time slot as the cause of the problem. I think you need to try to find a way to automate that process and generate warnings about which constraints need to be relaxed. 1666 1667The problem with activity id 2 was a variation on this problem. T2 had 5 activities for tag AT1, AT1 has 6 preferred time slots, but T2 was unavailable for 2 of them. 1668 1669You do similar checking for student groups which have too many activities for the available time slots. 1670 1671102--------------------------------------------------------- 1672From Christian Kemmer: 1673 1674I have another suggestion which would make things easier for me. 1675When defining time constraints for activities, I can choose a group of students, let's say "year 05". But no activity belongs to this group, because all activities belong to subgroups of that group, let's say "class 05A" or "class 05B". So choosing a group in those dialogs has no effect for me. 1676What I really want to do is to define constraints for some activities that all belong to subgroups of a special group, for example all lessons in a certain subject of all classes in "year 05". I cannot use the "choose group"-combo-box at the moment, but I have to use the "subject" or "teacher" combo-boxes. If I use subject, I also get a lot of activities from other years, if I use teacher, I also get those other activities, and I have to change the teacher for each activity I am searching for. 1677 1678My suggestion is that there is a checkbox "show subgroups of group" with the following effect: 1679If I choose a group and activate that checkbox, all subgroups of that group are also shown. 1680So if I choose "year 05" and subject "physics", all activities with subject "physics" in all subgroups like "class 05A", "class 05B", ... of group "year 05" are shown. 1681If I only choose the group and activate that checkbox while leaving the other comboboxes blank, all activities of all subgroups of that group are shown. 1682 1683103--------------------------------------------------------- 1684From Silver (on forum): 1685 1686He needs a constraint to ensure that all activities of each teacher are hosted in different rooms (for exam scheduling). 1687 1688104--------------------------------------------------------- 1689From Davide G. M. Salvetti (on forum): 1690 1691Would it be possible to sort on comments the activities list (like sorting the constraints)? 1692 1693105--------------------------------------------------------- 1694From Davide G. M. Salvetti (on forum): 1695 1696I wonder if it's sensible to write a .fet file with all placed activities time and space constraints spelled out (i.e., just like the usual 1697_data_and_timetable.fet, where each activity is (non permanently) blocked in time and space) even when FET gets interrupted, rather than only 1698if it completes succesfully. I think it could be useful, because that file could then be reused as a start, maybe manually deleting or adding 1699some constraint. 1700 1701106--------------------------------------------------------- 1702From Silver (on forum): 1703 1704He needs "teachers_rooms.html" in the statistics folder, he thinks it would be useful for the examination timetable. 1705 1706107--------------------------------------------------------- 1707From Horatiu Halmajan and Yush Yuen: 1708 1709They suggest the possibility of selecting more constraints in the all time/space constraints dialogs and 1710de(activate)/remove them in a single operation. 1711 1712108--------------------------------------------------------- 1713From skinkone (on forum): 1714 1715What I realized is that FET won't allocate your students for you, so I will do that by hand. I can only suspect that such a problem increases the 1716complexity exponentially. However, if you are thinking of going down this road in future developments, I would vote in favor of having such a 1717feature where students can have "tag preferences". The user would set "minimum or maximum number of tags a student group must have". This would 1718then be an optimization problem to try to get the most students with their preferences. Essentially FET would form student groups as an output 1719rather than as an input. 1720 1721109--------------------------------------------------------- 1722From Jonathan Block (on forum): 1723 1724It would be nice to have a fourth dimension. 1725 1726Explanation from Liviu Lalescu: He considers students (1), teachers (2) and rooms (3) as three dimensions. He would like to allocate activities 1727to teachers (4) (and these teachers should be the fourth dimension, different in concept from the second dimension, but similar to the third dimension). 1728 1729110--------------------------------------------------------- 1730From Liviu Lalescu: 1731 1732Possibility (check box, default checked) of safe saving for File/Save and Save as. Maybe even for Timetable/Save data and timetable as. 1733 1734Safe saving means: create a temporary file (make sure it is truncated), write the data to it, remove the original file and rename the temporary file to the original file. 1735 1736111-------DONE since FET-5.35.0-(21 December 2017)---------- 1737 1738112--------------------------------------------------------- 1739From murad: 1740 1741Create please, in QComboBox, auto-complete. With a large number of students and teachers it is very difficult to find the necessary students or teachers. 1742 1743113--------------------------------------------------------- 1744From kdrosos: 1745 1746In FET there is "School's name", where the school's name appears in the final .html files. 1747 1748Maybe the text "School's name" can be parametric and thus to allow changing to "Department's name" or "Institution's name" etc. 1749 1750This can also allow a "School's name field" as: 1751 1752"Faculty of FET: Department of FET" 1753 1754Liviu's note: I think that kdrosos refers to the Greek FET. In the English FET, the string is "Institution name". 1755 1756114-------DONE since FET-5.40.0-(20 September 2019)-------- 1757 1758115--------------------------------------------------------- 1759From nouvakis: 1760 1761I've seen that with html files you save a "xxx_data_and_timetable.fet" file. 1762In this xml file, you save 1763<Time_Constraints_List> element which contains many <ConstraintActivityPreferredStartingTime>. 1764 1765These <ConstraintActivityPreferredStartingTime> elements are the generated timetable data (Activity_Id, Preferred_Day, Preferred_Hour). 1766 1767So, you could add an option (for example autosave) saving each generated timetable with a unique name (for example name_year_month_day_hour_minute.fet) 1768 1769This file could easily be loaded from a user just to be able to preview the generated timetable inside FET. 1770 1771116--------------------------------------------------------- 1772From nouvakis: 1773 1774I would like to suggest an extra optional field to entities of FET program. 1775 1776For example: 1777Teachers_List: name, [id] 1778Students_List: name, [id] 1779Subjects_List: name, [id] 1780Hours_List: Name, [id] 1781Days_List: Name, [id] 1782 1783etc 1784 1785When someone (like me) would like to import FET generated timetable data to another program, 1786there should be a more accurate way to associate an FET entity with my database records beside the name ... 1787 1788If you add the id field (as an optional field) there should be no problem to users already using FET ... 1789 1790117--------------------------------------------------------- 1791From mma: 1792 1793When adding a constraint, a useful feature would be to check if an identical constraint exists already, and thus not adding the constraint. I just tried to add the same constraint repeatedly (just kept pressing 'Add'), and it kept adding. When there are many constraints it can be difficult to keep track of them all. 1794 1795Removing identical constraints reduces the clutter, and perhaps also speeds up the timetable generation? 1796 1797118------------------------DONE----------------------------- 1798 1799119--------------------------------------------------------- 1800From Yush Yuen: 1801 1802For printing: It would nice if I can specify a custom css file for the style. 1803 1804120--------------------------------------------------------- 1805From Yush Yuen: 1806 1807I find that while the fixed max-room contraint works well, I notice 1808something with my situation: 1809 1810I have a teacher, teacher A, uses room A and teaches year 6 classes. Unlike 1811the more senior years, which are heavily blocked (lots of constraints with 1812activities with same start time), year 6 classes are pretty free floating. 1813Therefore, the year 6 classes always appear at the end of the order of 1814allocation. 1815 1816I have included room A as one of the available rooms for the preferred room 1817list for another teacher. room A is almost always chosen. But the problem 1818is, teacher A and room A become very difficult toward the end of the 1819allocation. My timetable has about 1280 activities, and most of the year 6 1820classes are toward the end of the list. The generation always got stuck 1821toward the end, like 1250, with teacher A not being able to get the right 1822allocation. 1823 1824I don't think this is a bug. This is easily solved by removing room A from 1825the preferredRooms list for that other teacher. But I just want to point 1826that out to you. 1827 1828Answer Liviu Lalescu: 1829 1830I could improve the algorithm to take care of situations like that. So 1831it will know that in room A there can be only one type of activity 1832(one type of look-ahead). Or that in room A there can be only teacher A 1833(another type of look-ahead). But there are contrary reasons: 1834 18351) Will make other timetables slower, by the additional look-ahead. 1836 18372) Each look-ahead is to be avoided, because of possible new critical 1838bugs and general slowdown. There are many look-aheads in FET, but they 1839are necessary and not very time-consuming. 1840 18413) The user is advised to help FET towards a solution. The user needs 1842to collaborate with FET. (Of course, not necessarily us. We want to 1843push its limits ) 1844 18454) This is the most important reason. Say I solve this problem for a 1846single preferred room for teacher A. But this is not everything. A user 1847may invent two preferred rooms for teacher A and go into the same 1848situation, which now becomes more complicated to manage. I cannot 1849forecast all situations similar to yours. 1850 1851Please tell me what you think, I might need to treat situation like 1852these - I am still thinking. Because I did many look-aheads which are 1853necessary. 1854 1855121--------------------------------------------------------- 1856From Andres Chandia: 1857 1858He has a custom version, developed by Liviu Lalescu, which among other things 1859ensures that if more people open the same file (on a common server), only the first 1860one who opened it will be able to save it, and the others will see that their file 1861is read-only. He suggests to add this into official FET. But it might be tricky and 1862potential bugs might be critical. 1863 1864122--------------------------------------------------------- 1865From Robert Sutcliffe: 1866 1867I need to print out all the rules and constraints to document the settings to supply to another system, and for peer review. 1868Staff availability, activities, room allocation rules, not-overlapping activity selections - everything! 1869Is there any way to do this? 1870---Answer Liviu Lalescu: no, there is no direct way in FET--- 1871If not, another web report that details all these settings would be ideal. 1872 1873123--------------------------------------------------------- 1874From Zsolt Udvari: 1875 1876I think the following feature would be nice: when I deactivate a year FET should deactivate some time constraints, e.g. min hours daily for a student set. 1877When I deactivate a year and I want to generate timetable, FET says that some groups don't have enough activities to respect this constraint. 1878 1879And when I activate a whole year these constraints will again be activated. 1880 1881Answer Liviu Lalescu: 1882 1883The best would be other buttons: "Activate/deactivate all constraints for selected students year" and so on, for groups, teachers, etc. 1884Because the button says "Activate/deactivate all activities for selected students year" (it refers only to activities). 1885 1886124--------------------------------------------------------- 1887From rjmillett (on guest book): 1888 1889there are many things i would like to have in FET: 1890 18911. when adding activities there should be a choice list similar to the new print option now included in 5.18 1892 1893to add multiple classes (sub-groups) with the same choice of periods and teacher in one click i.e. all same 1894 18952. there should be a similar option in the preview to choose a class and teacher preview both at the same time so as to make changes without having to go back and every time i.e. side by side view at one time click in drop down box 1896 18973. to right click in the preview and change the position ot LT or PLT activities and not having to go back every time to time > all > search > etc to make changes 1898 18994. print preview choice button on main panel 1900 19015. un/lock buton on main panel 1902 19036. an import and export to EXCEL or txt other than CSV file 1904 19057. print option of teachers statistics on preview not from HTML 1906 1907In addition to (6.), when Liviu said that Excel was not free software, rjmillett replied: 1908 1909Another option would be to export as a Google sheet that's open source and 1910free for all other than Microsoft's excel 1911 1912125--------------------------------------------------------- 1913From Volker Dirr and Bobby Wise: 1914 1915Bobby: 1916 19171) I have a situation where a school has 3 Grade 11 classes. 11a, 11b and 11c. 1918 1919All the classes have compulsory subjects: 7 Periods of English, 7 periods of 1920second language (Afrikaans, French and German) and 8 periods of Mathematics. 1921 1922Then each student must select 1 subject from each of the combinations below: 1923 1924 1925Combination 1 (6 Periods) 1926 1927Accounting 1928 1929Biology 1930 1931History 1932 1933Science 1934 1935 1936Combination 2 (6 Periods) 1937 1938Art 1939 1940Biology 1941 1942Economics 1943 1944Science 1945 1946 1947Combination 3 (6 Periods) 1948 1949Art 1950 1951Biology 1952 1953Geography 1954 1955Science 1956 1957 1958They also have 2 remaining subjects of 1 period each Life Skills and 1959Religious Instruction. 1960 1961 1962They have a 7 day cycle and 6 periods in each day. 1963 1964 1965Could you please recommend a manner in which I should split the classes in 1966order to make it possible for all the subject choices? 1967 1968 19692) Thanks Liviu, Volker did help while you were away so I have sorted out the 1970problem. 1971 1972What I also discussed with Volker was the possibility of a forth category 1973split. I know it will slow down the generation but for me that is not too 1974much of a problem. I suggested that perhaps in the Settings Parameters you 1975should put an option so the user can decide if they would like a 4th 1976category or not. Then obviously they should realize if they do select the 1977option that the generation process will be much slower. 1978 1979 1980Volker: 1981 1982i had several talkings about the number of categories now again. 1983 1984what do you think about the following suggestion: 1985 1986add in the settings a integer "max number of subgroups for split year 1987automaticly". 1988 1989by that idea it is much much flexible in the number of categories and 1990the number of splits per category. 1991 1992so you can increase/change as long as you are not over that limit. 1993 1994the current limit is 12*6*6=432. 1995i think setting the limit to 500 is ok. 1996 1997we maybe also allow the user to increase that limit a bit more, but of 1998course only with the warning that it will be slow, produce large html 1999files and doesn't make sence if it is (much) greater then "real" 2000students per year. 2001 2002126--------------------------------------------------------- 2003From Volker Dirr: 2004 20051) 2006>> i just want to tell you this and ask you if we maybe need that also 2007>> in FET. 2008>> 2009>> i am currently coding on an other small tool. 2010>> 2011>> i saved settings with QSettings and i reload that settings on an other 2012>> function. 2013>> the strange thing was this: 2014>> i saved QSettings in the destructor ~xxx and reload it in an other 2015>> function/file again, but it look like Qsettings didn't save. the 2016>> strange things was that visible/correct as soon as i restarted that 2017>> reload function a bit later. 2018>> first of all i tried a QSettings.sync(), but it doesn't help. 2019>> i also tried with a global variable, but it also doen't help. 2020>> it look like my "update"-function already run before the destructor 2021>> source was done. 2022>> 2023>> now i removed the destructor ~xxx and replaced it by a protected: void 2024>> closeEvent(QCloseEvent *event); 2025>> 2026>> now all work fine. it look like the protected: void 2027>> closeEvent(QCloseEvent *event); wait long enough. 2028>> 2029>> so a destructor run simultaneously? so it is critical to use 2030>> destructors with qt, because they might be to slow? (for example if 2031>> you clear variables, reload variables or something like that.) 2032 20332) 2034i am not sure if it is a problem. 2035 2036it was more an information to you. 2037 2038i was able to proove that the destructor is doing his job, but to slow. the 2039destructor isn't ready if the function go back to the main programm. 2040if i add a delay in the main programm and check if the destructor have 2041done his work, then it is ok. but without that delay it isn't ok. so 2042destructor is slow (i guess it simply run in a second thread 2043simultaniously). 2044 2045so the solution is: 2046a) adding a delay in main code. (but that is a bad style, especialy because 2047i don't know how long it must be) 2048b) coding it with an closeEvent. (like in qt book). i coded it with 2049closeEvent and it run very fine now. 2050 2051i just didn't check if this is maybe also critical for fet. that is why i 2052just want to warn you, because it took several hours to find this bug. 2053 2054Liviu: 2055 2056I think I understood. 2057 2058You are right: "The readSettings() and writeSettings() functions must 2059be called from the main window's constructor and close event handler as 2060follows:" (from http://qt-project.org/doc/qt-4.8/qsettings.html#details) 2061 2062I wanted to say: "For efficiency, the changes may not be saved to 2063permanent storage immediately. (You can always call sync() to commit 2064your changes.)", but looks like you already checked that. 2065 2066I think that if the control goes to user interface (like waiting for 2067user to click), the critical time is gone. So, I hope your situation 2068will not appear. 2069 2070I really cannot do all perfectly with closeEvent. There are too many 2071files. Maybe in the future. 2072 2073127--------------------------------------------------------- 2074From Volker Dirr: 2075 2076Lift the limits for the generation algorithm, like MAX_TEACHERS and 2077MAX_TOTAL_SUBGROUPS. 2078 2079128--------------------------------------------------------- 2080From yasin dehghan: 2081 20821- show warning message when enter 2 same activity 20832- add exam date with subject in subject form 20843- add list for teacher to show allow subject for each teacher in techer form 2085 2086Liviu Lalescu: 2087 2088I will add your suggestions in the TODO, but please explain to us more 2089detailed: 2090 20911 - When the user adds two same SPLIT activities? 20922 - I do not understand. 20933 - I think you mean each teacher has his own subjects list? 2094 2095yasin dehghan: 2096 20971- no, don't split. when the user add 2 same activity show warning msg and 2098don't save 2nd activity 2099 21002- user able to add date of exam for each subject and print exam date with 2101subject name, just it, no exam planing and etc 2102 21033- yes, user able select list of allow subject for teacher, when add 2104activity, only allow subject show for teacher or show warning msg if select 2105don't allow subject 2106 2107and other sugestion 2108 21094- user able enter min and max hour of each teacher per week and show this 2110min and max hour in teacher statiscal foe compare 2111 2112129--------------------------------------------------------- 2113From Volker Dirr: 2114 2115do following speed check: 2116 2117check all connections of radio buttons. 2118check if they use singnal toggled. 2119 2120if you can see 2 times the same slot, then it is bad to use toggled. 2121example: 2122this is bad: 2123connect(radioButton1, SIGNAL(toggled(bool)), this, SLOT(something(bool))); 2124connect(radioButton2, SIGNAL(toggled(bool)), this, SLOT(something(bool))); 2125 2126this is ok: 2127connect(radioButton1, SIGNAL(toggled(bool)), this, SLOT(something1(bool))); 2128connect(radioButton2, SIGNAL(toggled(bool)), this, SLOT(something2(bool))); 2129 2130if you can find a bad version, then it should be converted into this: 2131connect(radioButton1, SIGNAL(clicked(bool)), this, SLOT(something(bool))); 2132connect(radioButton2, SIGNAL(clicked(bool)), this, SLOT(something(bool))); 2133 2134reason: 2135if you click a button in bad example, then something is called twice! 2136(once, because one RB is checked and a second time, because the other RB 2137is unchecked). 2138if you use click, then something is called only once. 2139 2140130--------------------------------------------------------- 2141From Daniel (on forum, see https://lalescu.ro/liviu/fet/forum/index.php?topic=1224.0): 2142 2143Allow activities to span over breaks. (For the moment, a solution is to split activities 2144and add constraints two (or three) activities grouped. Another solution is to not 2145consider explicitly the breaks in the timetable, but this way the constraints of 2146type max hours continuously may not work as needed.) 2147 2148131--------------------------------------------------------- 2149From daviodan: 2150 2151After clicking 'Add' in the add activity dialog, he suggests that the students list 2152widget should be cleared, because usually the user adds activities for a specific 2153teacher (with all his students), then goes to another teacher. 2154 2155132--------------------------------------------------------- 2156From Massimo Mancini: 2157 2158Display the total number of hours of an activity: when I divide an activity 2159I would see the total of durations of all defined subactivities. 2160This total must be updated changing the number/duration of subactivities. 2161 2162A good place for this changing label could be near number of sub in 2163group *divide*: 2164 2165In my mind (italian one) I know that a teacher have 6 hours of a subject, 2166only then I think about how divide them. 2167See the total expedite and reduce input errors. 2168 2169--- 2170 2171comment by Liviu Lalescu: 2172 2173I added this in the TODO. But there is so little space in the dialog there. 2174 2175--- 2176 2177comment by Massimo Mancini: 2178 2179I think the space is pretty enough. There are two suitable places: 2180 21811. at the side of the field *divide* (too long, what is the max number of 2182subactivities? 9, 99, 999?) 2183 21842. below the check *consecutive* 2185 2186the format of the label can be as little as T:xxx (5 chars). 2187 2188Just this afternoon I spent 2 hours correcting mistakes that I would have 2189avoided if such counter was in place. Consider the input of a sequence of activities with 2190similar number of subactivities but different duration of some sub, consider also that the 2191tab widget remember the past durations when you reduce and then re 2192increases the number of subs... so. it's easy (too easy) to insert a wrong total 2193duration, for a real check you must tab all the subs and add: very boring. 2194 2195133--------------------------------------------------------- 2196From Massimo Mancini: 2197 2198First, consider this situation... 21991. I'm working on teachers not avalaible (TNA) constraint 22002. I filter on MANC, fet show a blank windows: the constraint on MANC not 2201exist. 22023. Good. I add it but the dialog not inherit MANC as selected teacher :-( 2203why? In general the dialog add/modify is not linked with existing constraints. Fet 2204prevents, of course, multiple TNA about the same teacher, but I ask you, is it 2205possible to link the dialog with existing data? in this manner the 2206add/modify functions would be the same. With the wheel of the mouse I can 2207scroll the list of teachers and quick view/modify the existing constraint! 2208 2209Second, the comment area. I use it to note some info about the 2210contents of fet file. I would like to access the comment 2211space more quickly. My suggestion is "reduce the RECENT button and put near 2212a COMMENT button" 2213 2214NEW OPEN 2215RECENT COMMENT 2216SAVE AS 2217 2218good! isn'it? ;-) 2219 2220The best would be if you could show the first line of the comments along with 2221the file name in the recents list... so I would avoid to remember... 2222 2223134--------------------------------------------------------- 2224From Pietro (on forum): 2225 2226I think would be nice we could enable/disable constraints even in the filtered masks 2227(ex: "constraints teacher not available times" mask), and not only in the "all time 2228constraints" mask. The "comments" button would be very useful too. 2229 2230135--------------------------------------------------------- 2231From Pietro (on forum): 2232 2233I would suggest one more feature: 2234it would be very useful to have shortcuts with "ALT or CTRL + key" for the buttons in the various masks all over the FET. 2235So we could for example enable, disable or delete the various constraints without have to use the mouse, only the keyboard. 2236 2237136--------------------------------------------------------- 2238From arivasm (on forum): 2239 2240I think it would be good if the activities dialog would be actualized every 2241time you enter a new one. That could allow to verify the last entered, and 2242prevent mistakes, without the need to close the new activity dialog. 2243 2244137--------------------------------------------------------- 2245From Pietro (on forum): 2246 2247I think the "pseudo activities" shouldn't be shown in the teacher statistics, or 2248should be shown in a separate column. Infact, with actual situation the user can 2249confuse real activity with pseudo one and don't know the real situation. 2250 2251138--------------------------------------------------------- 2252From Massimo Mancini: 2253 2254If you close and reopen FET, the central tab widget remain on the tab it 2255was when you terminated the program. 2256When FET start, the focus should be always on the File tab. 2257 2258139--------------------------------------------------------- 2259From Massimo Mancini: 2260 2261Please consider to implement a shortcut (Alt+C ?) to popup the comment area... 2262 2263140--------------------------------------------------------- 2264From arivasm (on forum): 2265 2266When you set the constraints of the times in which the teachers are not available, 2267maybe you don't know how many teachers wil be finally available for each time slot 2268(unless you count them manually). So, my suggestion is to include a new statistic 2269to show that information, in order to correct impossible constraints before start 2270the timetable generation. Of course, an authomatic detection (less teachers 2271available than needed) would be better!. 2272 2273Liviu Lalescu: Sorry, but I do not understand. I already do a check on the number 2274of activities for each teacher, versus his not available times. 2275 2276Volker Dirr: Your suggestion isn't that easy as you might think now. It's easy if 2277teacher/students have full timetables (all timeslots are used), but it's complicated 2278if the tables are not full. 2279 2280Liviu already include common checks like that. The checks also need to care about 2281timetables that are not full (not all timeslots are used). Maybe the checks can be 2282improved if the timetables are full, but that mean: a) you must code a check that 2283check if the timetables are full. b) it will help only a few datasets, because most 2284datasets (compare examples) don't have full timetables. 2285 2286arivasm: Excuse me if my previous post wasn't clear! 2287 2288Of course, Volker is right: it will be a weak information know how many teachers are 2289available for each time slot if the timetable isn't full. Furthermore, the fact to 2290have for each of all time slots more teachers than groups don't will guarantee that 2291the whole problem will be solvable. But if the timetable is full, and this condition 2292fails at some time slot, it will be certain that the problem will be impossible to solve. 2293 2294The idea arose when I was entering the preferences of my workmates and I suspected that 2295too many of them were requesting be free at some times, i.e. last class of friday 2296(of course!). Then I missed to have a simple account as an alternative in order to avoid 2297passing sheet after sheet, looking for the petition and count them. 2298 2299141--------------------------------------------------------- 2300From AZ (on forum): 2301 2302I would appreciate a statistical feature that tells the user which constraint(s) is (are) 2303causing the greatest number of rejects; if a user could see, during computation, a counter 2304that tells him the top 10 blocking constraints, maybe the debugging could be easier. 2305I don't know if it's possible, though. 2306 2307Liviu Lalescu: Unfortunately, it is probably impossible or it would give wrong results. 2308But someone should study this suggestion, so I'm adding it in the TODO. 2309 2310142--------------------------------------------------------- 2311From Etlau (on forum): 2312 2313Maximum delta in time for day per week per group. For example 7-7-3-4-5 is unacceptable, 2314better will be 5-5-5-5-6. And same for teacher. Yes, you can set max and min activities 2315per day, but number need to calculate manually for every class and teacher, not really 2316comfortable. 2317 2318143--------------------------------------------------------- 2319From Etlau (on forum): 2320 2321Will be nice to click-and-drop and lock activities in shedule directly. 2322 2323144--------------------------------------------------------- 2324From Etlau (on forum): 2325 2326Add "start student day" for activity, like "end student day" 2327 2328Liviu Lalescu: I'll add this in the TODO. But if students begin at first hour, 2329add preferred times for the activities in the first hours. 2330 2331145------------DONE since FET-5.41.0 - 2019-11-20----------- 2332 2333146--------------------------------------------------------- 2334From Frans (on forum): 2335 2336I just wonder how the following can be done. 2337 2338Let say I set a timetable for a specific term with constraints. The timetable is accepted by everyone and published. 2339 2340What I do now for the next term is to export the information, I am interested in the activities, as csv files. These files are send to the people in charge to make changes for the second term for example. What I want to do now is to import the activity files using Fet to set the timetable for the specific term. 2341 2342I do have a problem now. If I import the activities then I must add the constraints from scratch, hundreds of them. 2343 2344If there are only one or two constraints and a few changes to the activities that is ot a problem. 2345Is there not a way that the existing constraints can be inported withou entering them again. I know that I can save the timetable with data, including constraints, but this is of no help to me. 2346 2347Is there a solution? 2348 2349147--------------------------------------------------------- 2350From y (on forum): 2351 2352y: Teacher S has to leave early either on Thursday or Friday. This means that in one out of these two days he has to finish at the 4th hour the latest. How can I do that? 2353 2354Liviu: Say slots are Thu 5,6,7 and Fri 5,6,7. Add occupy max 1 slot from selection for each pair, starting with selection Thu 5 + Fri 5, then Thu 5 + Fri 6, ..., Thu 7 + Fri 7 (3x3=9 constraints). Should work, right? Because you cannot have valid any pair of hours from different days. 2355 2356y: Yes, I think it should work. I'll try this! 2357 2358Thanks a lot! 2359 2360Maybe, in a future version of FET, you could add an extension of the constraint "a teacher works in a hour interval max days per week", to allow to pick which days we want to apply this constraint, and not necessarily the whole week. It could be renamed to "a teacher works in a hour interval, max days from a days set" or something similar. Do you think something like this is feasible? 2361 2362148--------------------------------------------------------- 2363From Christian Kemmer (on forum): 2364 2365For the next timetable at our school, I need the following: 2366 2367Hours 5 and 6 at one day have the same activity. 2368 2369So I could decide by myself to add an activity 2+1+1 and give the subactivity with "2" hours a special activity-tag "2h" or something like that. I can do this for many activities and then only allow activities with tag "2h" to be placed in hour 5. 2370But if I do this, I have to decide, which acitivity should be placed there. If I choose too much activities, there will also be activities lasting two hours during other times of the day, which is not wanted in many cases. 2371 2372I could also use constraint "consecutive if same day", but then an activity 1+1+1+1 may become 2+2. But I only want 2+1+1 or 1+1+1+1 for that kind of activities. I am also not sure, how to ensure that "consecutive if same day" is only used for hours 5 and 6. 2373 2374So, what would be the best solution to let FET decide which activities to use, so that for every student and every teacher for every day I have the following: 2375If the student / the teachers has an activity in hour 5, he also has this activity in hour 6. Each activity may only have one two hour lesson (like 2, 2+1, 2+1+1, 2+1+1+1), but no activity is allowed to have more than one two hour lesson (like 2+2, 2+2+1). 2376 2377I hope that I have explained it clearly. 2378 2379Thanks for your help. 2380 2381... 2382 2383The reason is the following: Between 1st and 2nd hour there is a small break for students and teachers to change rooms. Between 3rd and 4th hour, there is also this small break. Between 5th and 6th hour, there is no break. So the teacher and the students must stay in the room without any break. 2384 2385So I want to avoid those two hour lessons for all 1+1+1+1 and 1+1+1 and 1+1 activities if possible, but during 5th and 6th hour, I need them. 2386 2387Liviu Lalescu: I think the best is a new constraint, students/teachers max building changes in a time interval, and each room is in a different building in your case. 2388 2389149--------------------------------------------------------- 2390(see also items #58, #368, and #396) 2391From uni_instructor (on forum): 2392 2393Finding a good optimized timetable means playing around with the parameters and constraints. 2394 2395In my opinion an UNDO (button) would be a helpful feature, since I could add / or modify some constraints and test the feasibility of the new timetable. Otherwise I can undo my last modifications and retry the timetable generation with other settings. 2396I conceive an UNDO function as it can be seen e.g. in MS-office showing a history of my last n modifications, where n ist the number of undoable steps. 2397The "history" of modification-steps would give me a good hint on what steps I could try otherwise. 2398 2399150--------------------------------------------------------- 2400From Nemo (on forum): 2401 2402Issue is I am always having to make changes as teachers leave, swap etc. I of course have the timetable 'fixed' but it is quite laborious to make changes to rooms etc. 2403 2404What it really needs now is a front end any one can use for room changes/teacher changes for a fixed timetable. I have plenty of programming experience (from a long time ago though) so using FET no issue for me. But even the ICT teachers can't understand it easily. 2405 2406The other major issues we face is cover - would be fantastic to have a cover generator. That takes up a lot of time practically as teachers are off sick and the time taken to check their timetable and find others free is a job that would be nice at a click of a button. I know these are "nice to haves" but I bet a lot of FET users have the same practical issues day to day. 2407 2408151--------------------------------------------------------- 2409From Anton Anthofer (see also item #275): 2410 2411- modify the IDs of (sub)activities. 2412- possibility to remove subactivities. 2413- multicore generation for multiple timetables generation. 2414 2415Also suggested by sln_rj, on forum: 2416 2417Is it possible to edit a split option in activity once we entered the data in FET? 2418 2419152--------------------------------------------------------- 2420From yasin dehghan: 2421 2422can you add excel export to software 2423this is so useful for view and share 2424 2425153--------------------------------------------------------- 2426From Leandro Bueno: 2427 2428I have another question to you. If you open the file, you may have seen that the schedule of our school has 3 turns (morning, afternoon and evening), 2429but, the activity hours are of one clock hour for the evening and 50 minutes (clock) for the morning and afternoon turns. I can generate the timetable, 2430but the statistics only considers FET hours, but the FET hour to clock hour relationship is not defined. This relationship would help generate the work 2431hours of the teachers (in clock hours). Today, I take the statistics and make a spreadsheet applying the relationship between FET hours and clock hours. 2432 2433I think that something like a relationship between FET and clock hours should be interesting to add in future versions, so the teachers statistics could 2434be shown in terms of number of activities (as it is today) and clock hours in a quick way, right from the FET interface. 2435 2436154--------------------------------------------------------- 2437From Leandro Bueno: 2438 2439Always (or never) use span in the HTML timetables if an activity has 2440duration larger than 1. 2441 2442155--------------------------------------------------------- 2443From Leandro Bueno: 2444 2445Another suggestion for a future release is the option to only 2446"print" to HTML the hours that the students have. In my case, I have 2447students divided in turns (morning, afternoon and evening) and each 2448turn only have activities in that specific turn. When I generate the 2449tables, the morning students' table have the afternoon and evening 2450hours as not available (there are restrictions for this in the .fet 2451file). The same occurs in the afternoon and evening students. I 2452suggest that these not available hours of the students don't end up 2453in the final HTML table. 2454 2455Amendment by Volker Dirr: 2456 2457Should be generalised from "hours" to "hours or days or both". 2458 2459156--------------------------------------------------------- 2460From Yush Yuen: 2461 2462It would be cool if there could be an interactive way to do the timetable 2463generation. For example, in the middle of the generation, I can remove 2464some constraints on the fly, un-allocate allocated activities, move 2465activities in different order, ... etc. The work flow might be something 2466like this: 2467 2468- hit the pause button 2469- select activities to be free 2470- inactivate any constraints 2471- move some activities to the front 2472- hit the re-start button 2473 2474I suppose it will only benefit some crazy hard timetable like my school. 2475Even that, the timetable is probably plain impossible, but such interactive 2476approach would make it easier to remove key constraints that makes things 2477difficult. 2478 2479157--------------------------------------------------------- 2480From Yush Yuen: 2481 2482Is it possible that FET could be 2483customized to do the following: 2484 2485- Have most of the activities with preferred time and space initially 2486- but once being placed, it will be treated as if the time and space 2487allocated was not "preferred" so will be free to float 2488 2489I am hoping that this way, I can obtain better solution by using a 2490completed version, unlock some year, then let the program to run again. 2491 2492Liviu: I did such a custom version for Yush, but it turns out not to work 2493as needed, because of broken soft constraints. 2494 2495158--------------------------------------------------------- 2496From Yush Yuen: 2497 2498(Also suggested by daviodan: multiple selection with Ctrl or Shift in the 2499all time/space constraints and activate/deactivate them with a single click). 2500 2501It would be great if the list of "all time constraints" could be a 2502multiple select box. Currently, the way I unlock allocated time is by going 2503to the "all time constraints" list, filter out the years that I want to 2504open, then remove them one at a time. Actually, before that, I go to the 2505student view of the generated timetable, select all, then click unlock time. 2506 2507It would be nice if I can just do multiple selection and click the "remove" 2508or deactivate button just once. 2509 2510159--------------------------------------------------------- 2511From Volker Dirr: 2512 2513FET -> Data -> Time Constraints -> Activities -> A set of subactivities 2514have a set of preferred starting times / time slots. 2515Need also the value to select all activities with the same duration. 2516(because activities with duration 2 should start only in 1., 3. and 5. hour). 2517With this constraint a user would need only to set a single constraint instead 2518of adding a lot of constraints or activity tags. 2519 2520160--------------------------------------------------------- 2521From Volker Dirr: 2522 2523get rid of some "unneeded" tags in the xml file. 2524"unneeded" means: they contain redundant data. this data can be used to 2525assert the dataset, but is unneeded. 2526for example: 2527<Number> in hours list, days list, ... 2528 2529161--------------------------------------------------------- 2530From Volker Dirr: 2531 2532if fet can't generate the data ("Cannot generate - please modify your 2533data"), then the "view difficult activities" pushbutton is disabled. So a 2534user can't search the bug. so a) enable the pushbutton or (maybe even 2535better (but only if you use only 100% constraints?)), display the 2536difficult activities in that textedit with the "Cannot generate - please 2537modify your data" string. 2538 2539162--------------------------------------------------------- 2540From Volker Dirr: 2541 2542generation_pre request: warn if activities has 100% same starting time and 2543100% preferred room in the same room. 2544 2545163--------------------------------------------------------- 2546From Volker Dirr: 2547 2548do an other check in generation_pre.cpp: 2549if an activity has only 100% one room possible (by one or more 2550constraints), then sum all hours of the same room and check if (number of 2551available time slots for room) >= (number of 100% needed slots for this 2552room by activities). 2553 2554164--------------------------------------------------------- 2555From Volker Dirr: 2556 2557name of constraints isn't always the same: 2558fet has for example: "teacher not available times" constraint. 2559but it also has :"A set of activities has preferred times" 2560But are these times preferred? The opposite times are not available. 2561So this constraint should be called "A set of activities has not 2562allowed/available times". 2563 2564maybe even the "activity prefferd time" is also bad, because it is not 2565only preffered. that is a 100% constraint. even the fet interface call it 2566"locked". So this constraint should be "An activity has a locked time". 2567 2568so we get rid of all "preferred" stuff by that. (using instead only 2569"locked" or "not available"). 2570 2571165--------------------------------------------------------- 2572From Volker Dirr: 2573 2574if a constraint doesn't refer to an activity, then generating shouldn't 2575refuse generating. that constraint should be just skipped. Like inactive 2576things are skipped. it can warn, but not refuse generating. 2577 2578(this is highly useful, because someone hunt bugs in his dataset, he can 2579just delete for example some years; just to check if this smaller stuff is 2580solveable, but some constraints might now refer to no activity anymore, 2581because the activities are deleted.) 2582 2583166--------------------------------------------------------- 2584From Yush Yuen: 2585 2586I made a custom version for myself with a "remove all" button 2587in the "all constraints" dialog box. I found it necessary for me when I 2588want to unlock the time constraint for a whole year after a timetable is 2589generated. The "remove all" button in combination with the filter function 2590make it very easy to remove a large set of constraints. I was trying to 2591change the selection box to a multi-select and have a "remove all selected" 2592button, but I couldn't figure out how to do that easily (hard to manage the 2593index of array after each removal), so I did the simple remove all instead. 2594It worked great for me. So, maybe you can consider something similar for 2595your official release. 2596 2597167--------------------------------------------------------- 2598From karim (forum personal message to Liviu Lalescu): 2599 2600max gaps (hours) between a set of activities 2601 2602Within : 2603time constraints -->activities 2604 -min gaps (hours) between a set of activities 2605+max gaps (hours) between a set of activities 2606 2607168--------------------------------------------------------- 2608From Davide Cottignoli (on forum): 2609 2610I would suggest a new simple constraint for teacher: 2611In Italy, the work contract for a teacher is often tethered to a specific number of workdays so, to achieve the desired result, is necessary to insert two constraint: 2612"Max days per week for a teacher" and "Min days per week for a teacher" that have to set the same value. 2613Why not add a "Number of workdays per week for a teacher"? 2614In the interface I am glad to see a button that add all teacher and set every single-type constraint to the same value so to be individually modified later. 2615 2616169-------------------------DONE---------------------------- 2617 2618170--------------------------------------------------------- 2619From agemagician (on forum): 2620 26211- Print the name of the year, group and class under the institute name. 26222- Print the schedule from right to left rather than left to right "very useful for Arabic countries like our academy". - Qt bug (Liviu) 26233- Make a bold line between each day in the printing and light line between periods. 26244- Make a bold line between groups in the printing. 26255- Change the font in the printing. 26266- Export the schedule to excel. 2627 2628171--------------------------------------------------------- 2629From Vlăduț Frățiman (personal email to Liviu Lalescu): 2630 2631He suggests to drop activities ids and use instead the teacher, students and subject, because ids might puzzle the new user. 2632 2633Also, he suggests to add icons to the buttons. 2634 2635172--------------------------------------------------------- 2636From vlad2005 (on forum): 2637 2638For gaps constraints (and others, maybe) specify the interval for which the constraint should action. Useful for instance 2639if the user wants teachers to have zero gaps in the morning and in the afternoon, but can have gaps in between these two 2640periods. 2641 2642173--------------------------------------------------------- 2643From Davide Cottignoli (on forum): 2644 2645I don't know if comments constraint is a widely spread practice but when I add or modify a constraint I often use these, so add a "comments" button in these dialogs it would be greatly appreciated. Also ad enable/disable constraint button would be useful. 2646I often use comments to group same constraints but alphabetic sort and group by constraint-type, comments and insert order I think would be useful; could you add a preference dialog for these and others future settings? 2647 2648174--------------------------------------------------------- 2649From liquid (on forum): 2650 2651I'd suggest to move print command from Timetable menu to File menu. IMHO, It's more common to have print command there than anywhere else. It may be worth to implement inside Print command some kind of radio button to choose what to print. Overall, it's good to have Print command anyway. 2652 2653175--------------------------------------------------------- 2654From mouiata (on forum) (regarding the custom Algeria version) 2655 2656I suggest that the constraint is added under distinguishes between unloading the morning or evening, especially for a professor in the Algerian version of the program 2657The program is currently the constraint 2658a teacher works in an hourly interval max days per week 2659This is what allows unloading of several periods of morning and evening for the professor without distinguishing between the morning and evening. 2660In Algeria, a lot of professors in favor of unloading the evening than the morning 2661I propose to add the the constraint 2662The least possible number of evening periods that can be discharged to Professor 2663The least possible number of mornings that can be discharged to Professor 2664 2665Liviu: Do you mean maximum number, not "least"? 2666 2667mouiata: I mean, the minimum number if possible 2668If it is not possible The maximum number 2669 2670176--------------------------------------------------------- 2671From clouds (on forum): 2672 2673Topic: teachers for hour 2674 2675What do you think about a function that shows for each hour of the day how many teachers can be assigned at every hour (under the constraints set). 2676In this way it's possible to see what are the most problematic hours 2677 2678177--------------------------------------------------------- 2679From MarioMic (on forum): 2680 2681When I create multiple timetables with fet, to eliminate the bad results (with a high number of conflicts), I have to manually select and 2682remove the folders of the bad timetables in the output path. This is especially annoying if I have many timetables since the names of the 2683folders do not show the level of conflict (it also would be useful to have this, too), and moreover occupy disk space unnecessarily. 2684 2685It would be useful (for the gui and the command line version) to have an option to save only timetables below a configurable threshold of 2686maximum level of conflict. 2687 2688Liviu Lalescu: since version 5.20.2 we added a detailed report for multiple generation of timetables. 2689 2690178--------------------------------------------------------- 2691From Silver (on forum): 2692 2693I suggest you add new window (interface or small editor) for css . 2694for hide and view rooms and subject in "teachers_time_horizontal.html" and other timetables. 2695 2696179--------------------------------------------------------- 2697From nouvakis (on forum): 2698 2699Min hours per day, max hours per day: 2700 2701I use these constraints but there is a problem. 2702If I set 2703min_hours = 3 and 2704max hours = 5 2705and a teacher should work 21 hours per week we could have combination: 5 + 5 + 5 + 3 + 3 2706but a better one should be: 5 + 5 + 4 + 4 + 3 2707 2708So, I recommend a new constraint like "frequency of max hours per day" 2709For my example this new parameter would be 2 (5+5) 2710 2711180--------------------------------------------------------- 2712From Pietro (on forum), also by Matsumoto (on forum): 2713 2714--> A part suggested by Pietro is DONE <-- 2715 2716The second part, suggested by Pietro (on forum): 2717 2718It would be very nice if the border between different days was thicker. 2719 2720Or, as suggested by Matsumoto (on forum): A common point my colleagues present is that there's very little emphasis between different days 2721(like on Teacher's Time table), and it'd be good to have a way to maybe add a thicker line between the different days to separate them better, is it achievable? 2722 2723Or, as suggested by liquid (on forum): I suggest (please) to divide days with bolder or thicker lines. For me, it would enhance clarity when viewing or 2724printing a schedule, both in printable and viewable versions. 2725 2726181------DONE since FET-5.21.0 - 3 December 2013------------ 2727 2728182--------------------------------------------------------- 2729From Bobby Wise (on forum): 2730 2731I think it would be a good idea if the printing of All Activities could be in consecutive order from the lowest grade to the highest, or in alphabetical order. Similar to the Activity Planning. 2732 2733I think that the print order now is in Activity sequence. 2734 2735183--------------------------------------------------------- 2736From nouvakis (on forum): 2737 2738The Min days between activities constraint has a weight percentage which I set to 95%. 2739 2740I think that there should be another weight percentage for the option "if activities in same day, force activities consecutive" (when checked) because you handle it as a 100%. 2741 2742If this is possible, then the word force should be replaced by something else. 2743 2744184--------------------------------------------------------- 2745From Tonny Chan: 2746 2747Please add a multiple select and then add to FET, then I need not to click the students one by one to a course. 2748 2749185------------------------DONE----------------------------- 2750 2751186--------------------------------------------------------- 2752From plaldw (on forum): 2753 2754Max building changes in a time interval. 2755 2756187--------------------------------------------------------- 2757From llbuenoo (on forum): 2758 2759I would like to generate a report that show the teachers and theirs restrictions (mainly the "Teachers not available times") and Activities related to the years (with its Groups and subgroups), in a way that I can better manage the distribution of the teachers activities according to their availability. 2760 2761I have been making this by hand, but it generates a lot of work on each manual iteration on the timetable. As the data is stored on the FET database, it could be generated directly by the program. 2762 2763I think in a pair of tables per year, one with the teachers and their activities in that year and another with the "teachers not available time" for that year. 2764 2765With this table it could be simpler to redistribute Activities or teachers. 2766 2767188--------------------------------------------------------- 2768From Frans (on forum): 2769 2770In the data and timetable fet file the sizes for subjects are indicated. Is it not possible when export to csv file to also export the group and/or subject sizes. 2771 2772In some institutions the group and subject size are important in calculating workloads and ftes for lecturers. 2773 2774The groups with the respective sizes are already exported but this is not always the same for all subjects as the number of students can be changed on the add activities page and this is not exported. 2775 2776189--------------------------DONE--------------------------- 2777 2778190--------------------------------------------------------- 2779From Volker Dirr: 2780 2781most users use the split year automaticly feature only. 2782some need more categories, but that will produce to many subgroups. 2783 2784so how about this feature: 2785a user can disable the "year-group-subgroup" fet and enable only a 2786"year-group" one. 2787so he can't modify, add, delete, ... subgroups anymore. subgroups will be 2788only used and gererated automaticly in the pregeneration and generation 2789part. 2790 2791split year automaticly will look the same, but it won't produce subgroups. 2792instead of this it still store an integer number with the catagory number 2793to each group. 2794 2795now only one new basic time constraint is needed: 2796(i will explain in 2 steps, but i think it can be imporved by storing that 2797value.) 2798 2799if you place an activity into a timeslot, then: 28001. step: it need to check if there is already an activity of the same year 2801stored. 2802no: -> place activity 2803yes: -> 2. step 2804 28052. step: check if that activities (same year) (in fact it need to check 2806only the first one, because others are already the same) have the same 2807category. 2808no: -> impossible to place activity 2809yes: -> place activity 2810 2811 2812i am not 100% sure, but i think with this kind of timetabling we can save 2813space and maybe also improve speed. 2814 2815the problem is: 2816how to implement both features ("year-group-subgroup" fet and enable only 2817a "year-group" one.) at the same time without confusing a user? 2818 2819191--------------------------------------------------------- 2820From Boubker (on forum): 2821 2822Je tente de générer un emploi du temps pour mon collège et je bute sur un petit problème est le suivant : 2823Pour un enseignant donné « T » j’ai affecté des classes répartis sur 3 niveaux (N1, N2 et N3) et je désire que cet enseignant se voie attribuer des classes de deux niveaux max par jour : 2824C’est-à-dire que cet enseignant aura dans un jour de travail des classes des niveaux (N1 et N2) ou bien (N1 et N3) ou bien (N2 et N3). 2825Es ce que vous pouvez me dire comment faire ? 2826 2827192--------------------------------------------------------- 2828From mbarsan (on forum): 2829 2830We have a school with 8 periods per day, with a short break every 2 hours. 2831There are 3 buildings. 2832Teacher may change building during those short breaks. 2833So we haven't to say to FET any duration to change buildings. This may be done at beginning of hours nn. 3, 5 and 7. 2834If a teacher works in a building at first and second periods, he may change building and work at third period. 2835 2836We may chose to insert breaks times (students and teachers not available) between periods 2 and 3, 4 and 5, 6 and 7 to allow building change in a period. But now we can handle 3 hours lessons only with the constraint "two activities are grouped", using the same teacher and same class with (sub)activities of 1 and 2 hours. We have also problems with subactivities with duration 2 that FET may not put with a break inside (so we have to use the same trick as above). 2837 2838Do you think that we may define a grid of hours to allow building changes only at specific periods? 2839 2840193--------------------------------------------------------- 2841From _indianajones (on forum): 2842 2843I think it would be useful, in case of difficult generation, to save the incomplete timetable in a .fet file without stopping the process, 2844so I could convert this file with "Excel FET file import 2010 Marco Albano ver 2.0" and try to solve it manually. 2845 2846--- 2847 2848Liviu Lalescu: Generate, stop, advanced lock -> lock all activities of current timetable -> save file. 2849 2850--- 2851 2852_indianajones: ...but in this way the generation is definitively stopped.... am I wrong? 2853 2854After hours of elaboration I wish to save the best timetable found and let FET goes ahead... 2855is it possible? 2856 2857--- 2858 2859Liviu Lalescu: Oh, sorry, I did not see that you wanted generation to continue. 2860 2861I'll add your suggestion in the TODO, but it is not very nice, because I prefer FET to save .fet timetable files only when they are complete. 2862 2863Meanwhile, you can do this, for only one interruption (if you have a multiple core computer): start two generations on the same timetable, with the same FET version, with the same initial random seed state, then interrupt one of them after a few hours, and leave the other one running. 2864 2865194--------------------------------------------------------- 2866(see also entry #26) 2867From russell (on forum): 2868 2869I hope FET could plan courses soon. 2870 2871195--------------------------------------------------------- 2872From russell (on forum): 2873 2874I have a teacher come to school in Monday and Wednesday OR in Tuesday and Friday. How to implement this constraint in FET? (I have some other constraint related to that teacher and his activities) 2875 2876--- 2877 2878Liviu Lalescu: 2879 2880It would be easy to make a change in the code for this. But I don't know how to make it a general constraint with FET-style-name. 2881 2882These tricks might work: 2883 2884- Teacher not available on Thursday; 2885 2886- Max days per week for this teacher = 4; 2887 2888- Add two dummy activities for this teacher, duration = number of hours per day. Not allowed on Thursday (not really needed, because the teacher is not available). Then min+max 3 days between them; 2889 2890I hope I got all the details. Please correct me if I am wrong. 2891 2892--- 2893 2894russell: 2895 2896Thanks for your reply. 2897 2898Can you please explain to me about "min+max 3"? Dose it mean exactly 3 days distance (Tuesday to Friday)? 2899 2900Dose your solution work for days with different hours (Monday has 8 hours and others 6)? 2901 2902--- 2903 2904Liviu Lalescu: 2905 2906The constraint min, then max days between activities. 2907 2908If the teacher cannot have more than 6 working hours on Monday, use a constraint activities occupy max time slots from selection for his activities, so he has no more than 6 working hours on Monday (less work for you). 2909 2910If he can have 7 or 8 real working hours on Monday, a lot of work for you: constrain each pair dummy - real activity pair for this teacher to not be on the same day (min 1 days between activities). 2911 2912Please think of other solutions, if you want. 2913 2914--- 2915 2916russell: 2917 2918Most of the “select a day’s group from a set of the day’s group for a teacher” constraints can implement by other FET constraints. But if FET has a specific constraint for that it would be better. 2919 2920--- 2921 2922Liviu Lalescu: 2923 2924Maybe better "Teacher works in a days group from a set of days groups". 2925 2926196--------------------------------------------------------- 2927From russell: 2928 2929Maybe adding a Pause/Resume to "Generate new timetable" window (changing Start button after press to Pause). 2930 2931(Related to item #277.) 2932 2933197--------------------------------------------------------- 2934From nouvakis (on forum, also from mercurialuser, also on forum): 2935 2936If I set 2937min_hours = 3 and 2938max hours = 5 2939and a teacher should work 21 hours per week we could have combination: 5 + 5 + 5 + 3 + 3 2940but a better one should be: 5 + 5 + 4 + 4 + 3 2941 2942So, I recommend a new constraint like "frequency of max hours per day" 2943For my example this new parameter would be 2 (5+5) 2944 2945--- 2946 2947Liviu: 2948 2949I am thinking of making it a separate constraint. And put it before max hours daily in the menu, because it might be better than the old existing constraint. Only 100% weight percentage allowed. How to name it? "Teacher(s)/Students (set) max hours daily max occurences per week"? 2950 2951--- 2952 2953Liviu: 2954 2955I thought about this. I looked over the present code (official FET-5.23.3, src/engine/generate.cpp). 2956 29571) The changes are very difficult in generate.cpp. There are many possibilities to consider, and maybe a perfect treatment is impossible. 2958 2959See for instance generate.cpp, lines 7543-7572. These are for a unique limit per day. But if you want two possible limits (5 two times per week, the rest maximum 4), the things become much more difficult. 2960 2961(I care in these lines above about the gaps.) 2962 29632) The changes are critical in generate.cpp. New timetables might become impossible. 2964 2965Anyway, I'll keep this suggestion in my mind. But for now I do not have the courage/possibility to do it. 2966 2967I hope that by using some tricks you can overcome the problems. 2968 2969See also fet-v.v.v/doc/algorithm/improve-todo-item-197.txt. 2970 2971--- 2972 2973From mercurialuser: 2974 2975Italian school, students have 5 days, 6 periods each. 2976Teachers teach 18 periods. 2977 2978I have a min hours per day set to 2, and some teachers have 2 days with 2 hours and unfortunately 2 days with 5 teaching hours... 2979 2980Is it possible to tell FET that teachers may teach 2 periods and 5 periods only once in a week ? 2981 2982I'm testing with minimum hours per day set to 3 but I feel it is a too strict requirements... 2983 2984198--------------------------------------------------------- 2985From Volker Dirr (also from mouiata, on the forum): 2986 2987new useful constraint: 2988time constraints -> teachers -> max total sum of teachers gaps per week 2989 2990199--------------------------------------------------------- 2991From liquid (on forum): 2992 2993I think it would be useful to introduce aliases for years, groups and subgroups. Their names sound kind of technical, particularly when one lets FET automatic year divide. It's OK when you work with schedule but it would be more readable when aliases were shown (of course if present) on the timetable. 2994 2995Volker: 2996 2997Maybe i missunderstood, but it sound to me like you are talking about the names that are generated automatically. You can simply rename them (by "modify") if you want (no problems with years and groups. be carefull with subgroups, because you must do it several times!) 2998 2999liquid: 3000 3001I exactly thought about what Volker had understood. E.g. if you had groups and subgroups automatically generated the name for resulting subgroup would come from names of groups and a year. It would be desirably sometimes to give the generated subgroup a more descriptive name. As the example: 3002year - 1 3003group division: 1. by a and b 2. by i1 and i2 (i for computer science) 3004you will get the following groups: 1 a, 1 b, 1 i1, 1 i2 3005and subgroups: 1 a i1, 1 a i2, 1 b i1, 1 b i2 3006For generation purposes it's OK thanks short names but if you wanted to make a timetable for all the students and teachers they would like maybe 1a comp.sci. group 1. That's what I think about. 3007 3008Liviu: 3009 3010But why not simply divide by a,b then comp.sci. group 1,comp.sci group 2? 3011 3012liquid: 3013 3014...just for simplicity's sake. Aliases almost always serve as more descriptive names. If I tried to give more descriptive names for groups they might not fit into boxes at activity setting window or elsewhere. Particularly when group division is not trivial. Short names are good while designing a schedule. 3015 3016Volker: 3017 3018I can recommend using short names. I use everywhere shortcuts (subjects has only 1-2 characters. Teacher names 3 characters. Students only around 1 to 4 characters.) 3019Of course new students "wonder" the first day about that shortcuts, but they are clever enough to understand it very fast. 3020 3021liquid: 3022 3023Oh, maybe that's the right way. I was afraid that schedule could be misunderstood with many short and cryptic names but your experience tells the opposite. OK then, thanks for suggestions. 3024 3025--- 3026 3027liquid suggests also aliases for rooms. 3028 3029Also from abautu, on forum: Could you add an extra field for subjects and teachers to allow for a short name/abbreviation of it? 3030For example, for a subject called "Classical literature" a short name could be "CL" or "C-101". Then the print timetable features 3031would allow to print the short names (i.e. compact timetable) or long names (i.e. normal timetable). 3032 3033See also item #324 3034 3035200--------------------------------------------------------- 3036(Added on 2014-10-12) 3037From fromturkey (on forum): 3038 3039I think the program should be able to use multiple CPUs/cores. Especially when trying to generate difficult timetables it takes a lot of time processing. If the program could use multiple CPUs, it would take much more shorter. 3040Is it possible with the current algorithm? 3041 3042Liviu: 3043 3044Unfortunately, I cannot think of how to adapt the FET algorithm to multiple cores. 3045 3046201-------------------------DONE---------------------------- 3047 3048202--------------------------------------------------------- 3049From Vanyo Georgiev (on forum): 3050 3051The last opened FET XML file is opened again at start up. 3052 3053(Vanyo Georgiev provided the necessary code changes to do this.) 3054 3055203--------------------------------------------------------- 3056From Vanyo Georgiev (on forum): 3057 3058One more place to check for a language .qm file - the work path. 3059 3060(Vanyo Georgiev provided the necessary code changes to do this: 3061 translation_loaded=translator.load("fet_"+FET_LANGUAGE, QDir::currentPath()); 3062in fet.cpp.) 3063 3064This change makes possible by setting the Working directory of the exe file in QtCreator to test the current translation without copying the .qm file to another directory. 3065 3066204--------------------------------------------------------- 3067From Vanyo Georgiev (on forum): 3068 3069Save and restore tabWidget current page at start up. 3070 3071(Vanyo Georgiev provided the necessary code changes to do this.) 3072 3073Liviu: See the ChangeLog for FET-5.19.0: "- When starting FET, the first shortcuts tab section (File) is selected (suggested by a user)." Previously, I saved the main tab widget position (as you do), but a user suggested that it is better to start always with the File tab selected. 3074 3075Anyway, I'll add this in the TODO, as your suggestion. 3076 3077Vanyo Georgiev: May be there must be a setting: 'Remember current page' and each user to choose his own preference. I'll try to do so. 3078 3079(Vanyo Georgiev provided the necessary code changes to do this.) 3080 3081205--------------------------------------------------------- 3082From bharatstank (on forum): ( https://lalescu.ro/liviu/fet/forum/index.php?topic=1826.0 ) 3083 3084bharatstank: 3085 3086I have below created a Student structure (having 60 students):- 3087 3088(Student) Year - Group - Sub Group 3089 3090Year Group Sub Group 3091MBACPM (60) MBA CPM L (60) MBACPM G1 (30) 3092 MBACPM G2 (30) 3093Activity Tags: 3094Lecture 3095Tutorial 3096Practical 3097 3098Activities created are as follows:- 30991. MBA CPM L (Lecture) of a SUBJECT1 for 2 hours duration is conducted by a FACULTY1 for all the 60 students 31002. MBA CPM G1 (Tutorial) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students 31013. MBA CPM G2 (Tutorial) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students 31024. MBA CPM G1 (Practical) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students 31035. MBA CPM G2 (Practical) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students 3104 31056. MBA CPM L (Lecture) of a SUBJECT2 for 2 hours duration is conducted by a FACULTY2 for all the 60 students 31067. MBA CPM G1 (Tutorial) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students 31078. MBA CPM G2 (Tutorial) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students 31089. MBA CPM G1 (Practical) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students 310910. MBA CPM G2 (Practical) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students 3110 3111and so on... 3112 3113How to place the activities - so that:- 31141. For Subject1 - Lecture followed by Tutorial followed by Practical is conducted in sequence in a day and FET do NOT place tutorial or practical before Lecture 3115 3116I want to use this process as a template for every subject (Lecture -> Tutorial -> Practical). So that FET places all the possible activities according to this template. and constraints are only applied in case of specific activities or exceptions. 3117 3118How to achieve this scenario. 3119 3120--- 3121 3122Liviu: 3123 3124I am not sure I understand well, but I think you can use a constraint three activities grouped and two constraints two activities ordered. 3125 3126--- 3127 3128bharatstank: 3129 3130using "constraint three activities grouped and two constraints two activities ordered." - here I need to create manual constraints for all the approx. 200 activities. 3131 3132is there a way - where I can create a Standardised constraints using Activity Tag. 3133I have defined 3 activity tag (which needs to follow the below sequence):- 31341. Lecture 31352. Tutorial 31363. Practical 3137 3138As per the guideline - for subject1 - First lecture is conducted, Then its Tutorial is conducted and then its Practical is conducted. 3139 3140In my case FET does not places activity like (Subject1 lecture -> Subject1 Tutorial -> Subject1 Practical) in sequence but most of the time it places the activity like (Subject1 Lecture -> Subject2 Tutorial -> Subject3 Practical or vice versa) 3141 3142how to resolve this issue. 3143I have also attached the timetable screenshot:- 3144 31451. Correctly placed activity shown in Green circle 31462. Wrongly placed activity shown in Red Circle 3147 3148Here it is not important that Subject1 (lecture, Tutorial, Practical) should be consecutive but has to follow activity tag order (for a particular subject). otherwise timetable starts with Tutorial or Practical without Lecture - which is not feasible. 3149 3150--- 3151 3152Liviu: 3153 3154I do not understand the picture in your attachment. 3155 3156If it is not important that the three kinds of activities are grouped, you might need to add only two constraints two activities ordered. You might want to add also a constraint activities same starting day. 3157 3158About making this automatic for activity tags - I have added this in the TODO list. 3159 3160206--------------------------------------------------------- 3161From Vanyo Georgiev (on forum): 3162 3163There are translations of the FET User manual in several languages https://lalescu.ro/liviu/fet/doc/ 3164 3165I think it would be nice, when there is an User manual in the currently set language of the FET interface, by clicking on the Help -> Online -> Help contents the User manual in the language of the FET interface is opened. 3166 3167207--------------------------------------------------------- 3168From Volker Dirr: 3169 3170someone used split year automatically. 3171 3172this year he doesn't need all classes again. class / group "5 d" is not 3173needed. 3174so he deletes group "5 d". 3175but in fact that doesn't improve speed (much), because the number of 3176subgroups stays the same. 3177 3178but if there will be a question after removing a group (or year) like "do 3179you also want to remove all subgroups of this group in all other groups?", 3180then the number of subgroups will be reduced and it will be easier to 3181generate. 3182 3183(Yes, instead of removing a group he could simply use the split year 3184automatically once again, but maybe he forgot, he has got a new computer, he 3185already changed "presettings" because of other years or the simply fear 3186that he will do it incorrect; so he like to use delete group only, because 3187it is easier.) 3188 3189Volker wrote code for this, but it is not perfectly optimized for speed. 3190Below is his code for file fet-v.v.v/src/interface/groupsform.cpp (see 3191the string Volker Dirr start/end): 3192 3193old file groupsform.cpp - last modified on 8 February 2015 (FET-5.28.0) 3194new Volker Dirr's code: 5 October 2015 3195 3196--- 3197// 3198// 3199// Description: This file is part of FET 3200// 3201// 3202// Author: Lalescu Liviu <Please see https://lalescu.ro/liviu/ for details about contacting Liviu Lalescu (in particular, you can find here the e-mail address)> 3203// Copyright (C) 2003 Liviu Lalescu <https://lalescu.ro/liviu/> 3204// 3205/*************************************************************************** 3206 * * 3207 * This program is free software: you can redistribute it and/or modify * 3208 * it under the terms of the GNU Affero General Public License as * 3209 * published by the Free Software Foundation, either version 3 of the * 3210 * License, or (at your option) any later version. * 3211 * * 3212 ***************************************************************************/ 3213 3214#include "addstudentsgroupform.h" 3215#include "modifystudentsgroupform.h" 3216#include "groupsform.h" 3217#include "timetable_defs.h" 3218#include "timetable.h" 3219#include "fet.h" 3220#include "studentsset.h" 3221 3222#include "longtextmessagebox.h" 3223 3224#include <QMessageBox> 3225 3226#include <QListWidget> 3227#include <QScrollBar> 3228#include <QAbstractItemView> 3229 3230#include <QSplitter> 3231#include <QSettings> 3232#include <QObject> 3233#include <QMetaObject> 3234 3235extern const QString COMPANY; 3236extern const QString PROGRAM; 3237 3238struct subgroupItem{ 3239 QString yearName; 3240 QString groupName; 3241 QString subgroupName; 3242}; 3243 3244GroupsForm::GroupsForm(QWidget* parent): QDialog(parent) 3245{ 3246 setupUi(this); 3247 3248 groupTextEdit->setReadOnly(true); 3249 3250 modifyGroupPushButton->setDefault(true); 3251 3252 yearsListWidget->setSelectionMode(QAbstractItemView::SingleSelection); 3253 groupsListWidget->setSelectionMode(QAbstractItemView::SingleSelection); 3254 3255 connect(yearsListWidget, SIGNAL(currentTextChanged(const QString&)), this, SLOT(yearChanged(const QString&))); 3256 connect(addGroupPushButton, SIGNAL(clicked()), this, SLOT(addGroup())); 3257 connect(removeGroupPushButton, SIGNAL(clicked()), this, SLOT(removeGroup())); 3258 connect(purgeGroupPushButton, SIGNAL(clicked()), this, SLOT(purgeGroup())); 3259 connect(closePushButton, SIGNAL(clicked()), this, SLOT(close())); 3260 connect(groupsListWidget, SIGNAL(currentTextChanged(const QString&)), this, SLOT(groupChanged(const QString&))); 3261 connect(modifyGroupPushButton, SIGNAL(clicked()), this, SLOT(modifyGroup())); 3262 connect(sortGroupsPushButton, SIGNAL(clicked()), this, SLOT(sortGroups())); 3263 connect(activateStudentsPushButton, SIGNAL(clicked()), this, SLOT(activateStudents())); 3264 connect(deactivateStudentsPushButton, SIGNAL(clicked()), this, SLOT(deactivateStudents())); 3265 connect(groupsListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(modifyGroup())); 3266 3267 centerWidgetOnScreen(this); 3268 restoreFETDialogGeometry(this); 3269 //restore splitter state 3270 QSettings settings(COMPANY, PROGRAM); 3271 if(settings.contains(this->metaObject()->className()+QString("/splitter-state"))) 3272 splitter->restoreState(settings.value(this->metaObject()->className()+QString("/splitter-state")).toByteArray()); 3273 3274 yearsListWidget->clear(); 3275 for(int i=0; i<gt.rules.yearsList.size(); i++){ 3276 StudentsYear* year=gt.rules.yearsList[i]; 3277 yearsListWidget->addItem(year->name); 3278 } 3279 3280 if(yearsListWidget->count()>0) 3281 yearsListWidget->setCurrentRow(0); 3282 else 3283 groupsListWidget->clear(); 3284} 3285 3286 3287GroupsForm::~GroupsForm() 3288{ 3289 saveFETDialogGeometry(this); 3290 //save splitter state 3291 QSettings settings(COMPANY, PROGRAM); 3292 settings.setValue(this->metaObject()->className()+QString("/splitter-state"), splitter->saveState()); 3293} 3294 3295void GroupsForm::addGroup() 3296{ 3297 if(yearsListWidget->currentRow()<0){ 3298 QMessageBox::information(this, tr("FET information"), tr("Invalid selected year")); 3299 return; 3300 } 3301 QString yearName=yearsListWidget->currentItem()->text(); 3302 int yearIndex=gt.rules.searchYear(yearName); 3303 assert(yearIndex>=0); 3304 3305 AddStudentsGroupForm form(this, yearName); 3306 setParentAndOtherThings(&form, this); 3307 form.exec(); 3308 3309 yearChanged(yearsListWidget->currentItem()->text()); 3310 3311 int i=groupsListWidget->count()-1; 3312 if(i>=0) 3313 groupsListWidget->setCurrentRow(i); 3314} 3315 3316void GroupsForm::removeGroup() 3317{ 3318 if(yearsListWidget->currentRow()<0){ 3319 QMessageBox::information(this, tr("FET information"), tr("Invalid selected year")); 3320 return; 3321 } 3322 int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text()); 3323 assert(yearIndex>=0); 3324 3325 if(groupsListWidget->currentRow()<0){ 3326 QMessageBox::information(this, tr("FET information"), tr("Invalid selected group")); 3327 return; 3328 } 3329 3330 QString groupName=groupsListWidget->currentItem()->text(); 3331 int groupIndex=gt.rules.searchGroup(yearsListWidget->currentItem()->text(), groupName); 3332 assert(groupIndex>=0); 3333 3334 QList<QString> yearsContainingGroup_List; 3335 QSet<QString> subgroupsList; 3336 //QSet<QString> yearsContainingGroup_Set; 3337 foreach(StudentsYear* year, gt.rules.yearsList) 3338 foreach(StudentsGroup* group, year->groupsList) 3339 if(group->name==groupName){ 3340 yearsContainingGroup_List.append(year->name); 3341 foreach(StudentsSubgroup* subgroup, group->subgroupsList) 3342 subgroupsList<<subgroup->name; 3343 } 3344 3345 assert(yearsContainingGroup_List.count()>=1); 3346 QString s; 3347 if(yearsContainingGroup_List.count()==1) 3348 s=tr("This group exists only in year %1. This means that" 3349 " all the related activities and constraints will be removed. Do you want to continue?").arg(yearsListWidget->currentItem()->text()); 3350 else{ 3351 s=tr("This group exists in more places, listed below. It will only be removed from the current year," 3352 " and the related activities and constraints will not be removed. Do you want to continue?"); 3353 s+="\n"; 3354 foreach(QString str, yearsContainingGroup_List) 3355 s+=QString("\n")+str; 3356 } 3357 3358 int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s, 3359 tr("Yes"), tr("No"), QString(), 0, 1); 3360 if(t==1) 3361 return; 3362 3363 //by Volker Dirr (start) 3364 QList<subgroupItem> removeSubgroups; 3365 QString removeSubgroupsStringForGUI; 3366 foreach(StudentsYear* year, gt.rules.yearsList){ 3367 foreach(StudentsGroup* group, year->groupsList){ 3368 if(group->name!=groupName){ 3369 foreach(StudentsSubgroup* subgroup, group->subgroupsList){ 3370 if(subgroupsList.contains(subgroup->name)){ 3371 subgroupItem tmpItem; 3372 tmpItem.yearName=year->name; 3373 tmpItem.groupName=group->name; 3374 tmpItem.subgroupName=subgroup->name; 3375 removeSubgroups<<tmpItem; 3376 removeSubgroupsStringForGUI+=tr("%1 - %2 - %3").arg(year->name).arg(group->name).arg(subgroup->name)+"\n"; 3377 } 3378 } 3379 } 3380 } 3381 } 3382 3383 if(removeSubgroups.count()>0){ 3384 s=tr("Subgroups of this group are also used in other groups. They might be needles now. In particular if you used FETs automatic split year feature." 3385 " Should the following subgroups be removed also?"); 3386 s+="\n"+removeSubgroupsStringForGUI; 3387 3388 int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s, 3389 tr("Yes"), tr("No"), QString(), 0, 1); 3390 if(t==0){ 3391 foreach(subgroupItem tmpItem, removeSubgroups){ 3392 bool tmp=gt.rules.removeSubgroup(tmpItem.yearName, tmpItem.groupName, tmpItem.subgroupName); 3393 assert(tmp); 3394 } 3395 } 3396 } 3397 //by Volker Dirr (end) 3398 3399 /*if(QMessageBox::warning( this, tr("FET"), 3400 tr("Are you sure you want to delete group %1 and all related subgroups, activities and constraints?").arg(groupName), 3401 tr("Yes"), tr("No"), 0, 0, 1 ) == 1) 3402 return;*/ 3403 3404 bool tmp=gt.rules.removeGroup(yearsListWidget->currentItem()->text(), groupName); 3405 assert(tmp); 3406 if(tmp){ 3407 int q=groupsListWidget->currentRow(); 3408 3409 groupsListWidget->setCurrentRow(-1); 3410 QListWidgetItem* item; 3411 item=groupsListWidget->takeItem(q); 3412 delete item; 3413 3414 if(q>=groupsListWidget->count()) 3415 q=groupsListWidget->count()-1; 3416 if(q>=0) 3417 groupsListWidget->setCurrentRow(q); 3418 else 3419 groupTextEdit->setPlainText(QString("")); 3420 } 3421 3422 /*if(gt.rules.searchStudentsSet(groupName)!=nullptr) 3423 QMessageBox::information( this, tr("FET"), tr("This group still exists into another year. " 3424 "The related subgroups, activities and constraints were not removed"));*/ 3425} 3426 3427void GroupsForm::purgeGroup() 3428{ 3429 if(yearsListWidget->currentRow()<0){ 3430 QMessageBox::information(this, tr("FET information"), tr("Invalid selected year")); 3431 return; 3432 } 3433 int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text()); 3434 assert(yearIndex>=0); 3435 3436 if(groupsListWidget->currentRow()<0){ 3437 QMessageBox::information(this, tr("FET information"), tr("Invalid selected group")); 3438 return; 3439 } 3440 3441 QString groupName=groupsListWidget->currentItem()->text(); 3442 int groupIndex=gt.rules.searchGroup(yearsListWidget->currentItem()->text(), groupName); 3443 assert(groupIndex>=0); 3444 3445 QList<QString> yearsContainingGroup_List; 3446 QSet<QString> subgroupsList; 3447 //QSet<QString> yearsContainingGroup_Set; 3448 foreach(StudentsYear* year, gt.rules.yearsList) 3449 foreach(StudentsGroup* group, year->groupsList) 3450 if(group->name==groupName){ 3451 yearsContainingGroup_List.append(year->name); 3452 foreach(StudentsSubgroup* subgroup, group->subgroupsList) 3453 subgroupsList<<subgroup->name; 3454 } 3455 3456 assert(yearsContainingGroup_List.count()>=1); 3457 QString s; 3458 if(yearsContainingGroup_List.count()==1) 3459 s=tr("This group exists only in year %1. All the related activities and constraints " 3460 "will be removed. Do you want to continue?").arg(yearsListWidget->currentItem()->text()); 3461 else{ 3462 s=tr("This group exists in more places, listed below. It will be removed from all these places." 3463 " All the related activities and constraints will be removed. Do you want to continue?"); 3464 s+="\n"; 3465 foreach(QString str, yearsContainingGroup_List) 3466 s+=QString("\n")+str; 3467 } 3468 3469 int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s, 3470 tr("Yes"), tr("No"), QString(), 0, 1); 3471 if(t==1) 3472 return; 3473 3474 //by Volker Dirr (start) 3475 QSet<QString> removeSubgroups; 3476 QString removeSubgroupsStringForGUI; 3477 foreach(StudentsYear* year, gt.rules.yearsList){ 3478 foreach(StudentsGroup* group, year->groupsList){ 3479 if(group->name!=groupName){ 3480 foreach(StudentsSubgroup* subgroup, group->subgroupsList){ 3481 if(subgroupsList.contains(subgroup->name)){ 3482 if(!removeSubgroups.contains(subgroup->name)){ 3483 removeSubgroups<<subgroup->name; 3484 } 3485 removeSubgroupsStringForGUI+=tr("%1 - %2 - %3").arg(year->name).arg(group->name).arg(subgroup->name)+"\n"; 3486 } 3487 } 3488 } 3489 } 3490 } 3491 3492 if(removeSubgroups.count()>0){ 3493 s=tr("Subgroups of this group are also used in other groups. They might be needles now. In particular if you used FETs automatic split year feature." 3494 " Should the following subgroups be removed also?"); 3495 s+="\n"+removeSubgroupsStringForGUI; 3496 3497 int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s, 3498 tr("Yes"), tr("No"), QString(), 0, 1); 3499 if(t==0){ 3500 foreach(QString tmpItem, removeSubgroups){ 3501 bool tmp=gt.rules.purgeSubgroup(tmpItem); 3502 assert(tmp); 3503 } 3504 } 3505 } 3506 //by Volker Dirr (end) 3507 3508 3509 /*if(QMessageBox::warning( this, tr("FET"), 3510 tr("Are you sure you want to delete group %1 and all related subgroups, activities and constraints?").arg(groupName), 3511 tr("Yes"), tr("No"), 0, 0, 1 ) == 1) 3512 return;*/ 3513 3514 bool tmp=gt.rules.purgeGroup(groupName); 3515 assert(tmp); 3516 if(tmp){ 3517 int q=groupsListWidget->currentRow(); 3518 3519 groupsListWidget->setCurrentRow(-1); 3520 QListWidgetItem* item; 3521 item=groupsListWidget->takeItem(q); 3522 delete item; 3523 3524 if(q>=groupsListWidget->count()) 3525 q=groupsListWidget->count()-1; 3526 if(q>=0) 3527 groupsListWidget->setCurrentRow(q); 3528 else 3529 groupTextEdit->setPlainText(QString("")); 3530 } 3531 3532 /*if(gt.rules.searchStudentsSet(groupName)!=nullptr) 3533 QMessageBox::information( this, tr("FET"), tr("This group still exists into another year. " 3534 "The related subgroups, activities and constraints were not removed"));*/ 3535} 3536 3537void GroupsForm::yearChanged(const QString &yearName) 3538{ 3539 int yearIndex=gt.rules.searchYear(yearName); 3540 if(yearIndex<0){ 3541 groupsListWidget->clear(); 3542 groupTextEdit->setPlainText(QString("")); 3543 return; 3544 } 3545 3546 groupsListWidget->clear(); 3547 3548 StudentsYear* sty=gt.rules.yearsList.at(yearIndex); 3549 for(int i=0; i<sty->groupsList.size(); i++){ 3550 StudentsGroup* stg=sty->groupsList[i]; 3551 groupsListWidget->addItem(stg->name); 3552 } 3553 3554 if(groupsListWidget->count()>0) 3555 groupsListWidget->setCurrentRow(0); 3556 else 3557 groupTextEdit->setPlainText(QString("")); 3558} 3559 3560void GroupsForm::groupChanged(const QString &groupName) 3561{ 3562 StudentsSet* ss=gt.rules.searchStudentsSet(groupName); 3563 if(ss==nullptr){ 3564 groupTextEdit->setPlainText(QString("")); 3565 return; 3566 } 3567 StudentsGroup* sg=(StudentsGroup*)ss; 3568 groupTextEdit->setPlainText(sg->getDetailedDescriptionWithConstraints(gt.rules)); 3569} 3570 3571void GroupsForm::sortGroups() 3572{ 3573 if(yearsListWidget->currentRow()<0){ 3574 QMessageBox::information(this, tr("FET information"), tr("Invalid selected year")); 3575 return; 3576 } 3577 int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text()); 3578 assert(yearIndex>=0); 3579 3580 gt.rules.sortGroupsAlphabetically(yearsListWidget->currentItem()->text()); 3581 3582 yearChanged(yearsListWidget->currentItem()->text()); 3583} 3584 3585void GroupsForm::modifyGroup() 3586{ 3587 if(yearsListWidget->currentRow()<0){ 3588 QMessageBox::information(this, tr("FET information"), tr("Invalid selected year")); 3589 return; 3590 } 3591 3592 QString yearName=yearsListWidget->currentItem()->text(); 3593 3594 int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text()); 3595 assert(yearIndex>=0); 3596 3597 int q=groupsListWidget->currentRow(); 3598 int valv=groupsListWidget->verticalScrollBar()->value(); 3599 int valh=groupsListWidget->horizontalScrollBar()->value(); 3600 3601 if(groupsListWidget->currentRow()<0){ 3602 QMessageBox::information(this, tr("FET information"), tr("Invalid selected group")); 3603 return; 3604 } 3605 3606 QString groupName=groupsListWidget->currentItem()->text(); 3607 int groupIndex=gt.rules.searchGroup(yearsListWidget->currentItem()->text(), groupName); 3608 assert(groupIndex>=0); 3609 3610 StudentsSet* sset=gt.rules.searchStudentsSet(groupName); 3611 assert(sset!=nullptr); 3612 int numberOfStudents=sset->numberOfStudents; 3613 3614 ModifyStudentsGroupForm form(this, yearName, groupName, numberOfStudents); 3615 setParentAndOtherThings(&form, this); 3616 form.exec(); 3617 3618 yearChanged(yearsListWidget->currentItem()->text()); 3619 3620 groupsListWidget->verticalScrollBar()->setValue(valv); 3621 groupsListWidget->horizontalScrollBar()->setValue(valh); 3622 3623 if(q>=groupsListWidget->count()) 3624 q=groupsListWidget->count()-1; 3625 if(q>=0) 3626 groupsListWidget->setCurrentRow(q); 3627 else 3628 groupTextEdit->setPlainText(QString("")); 3629} 3630 3631void GroupsForm::activateStudents() 3632{ 3633 if(yearsListWidget->currentRow()<0){ 3634 QMessageBox::information(this, tr("FET information"), tr("Invalid selected year")); 3635 return; 3636 } 3637 int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text()); 3638 assert(yearIndex>=0); 3639 3640 if(groupsListWidget->currentRow()<0){ 3641 QMessageBox::information(this, tr("FET information"), tr("Invalid selected group")); 3642 return; 3643 } 3644 3645 QString groupName=groupsListWidget->currentItem()->text(); 3646 int count=gt.rules.activateStudents(groupName); 3647 QMessageBox::information(this, tr("FET information"), tr("Activated a number of %1 activities").arg(count)); 3648} 3649 3650void GroupsForm::deactivateStudents() 3651{ 3652 if(yearsListWidget->currentRow()<0){ 3653 QMessageBox::information(this, tr("FET information"), tr("Invalid selected year")); 3654 return; 3655 } 3656 int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text()); 3657 assert(yearIndex>=0); 3658 3659 if(groupsListWidget->currentRow()<0){ 3660 QMessageBox::information(this, tr("FET information"), tr("Invalid selected group")); 3661 return; 3662 } 3663 3664 QString groupName=groupsListWidget->currentItem()->text(); 3665 int count=gt.rules.deactivateStudents(groupName); 3666 QMessageBox::information(this, tr("FET information"), tr("De-activated a number of %1 activities").arg(count)); 3667} 3668--- 3669 3670208--------------------------------------------------------- 3671From Volker Dirr: 3672 3673Code more checks to warn users about conflicting constraints before generating. For example: 3674min days between activities and consecutive/grouped activities constraints. 3675 3676209--------------------------------------------------------- 3677From andrealva: 3678 3679He is referring to the facility to sort constraints by comments, which was dropped (being considered useless) in FET-5.25.0 and subsequent versions: 3680 3681One use though, which can be given to sorting the comments, is to arrange together all the constraints related to a teacher(s) or a class(es) ... 3682it would help to quickly identify them without using the filter .... 3683 3684210--------------------------DONE--------------------------- 3685 3686211--------------------------------------------------------- 3687From Volker Dirr: 3688 3689FET asks if the user is sure he wants to add an activity without students. Maybe the question must also 3690include something like "it is correct if you want to add a teacher meeting." 3691 3692So that the user is not deterred by the warning in situations in which an activity without students is OK. 3693 3694212--------------------------------------------------------- 3695From Bob Hairgrove (on forum): 3696 3697Colors can be enabled for highlighting the cells. However, looking at this function in the FET source code, it is clear that these are hard-coded values: 3698 3699Code: 3700 3701void AddConstraintStudentsSetNotAvailableTimesForm::colorItem(QTableWidgetItem* item) 3702{ 3703 if(USE_GUI_COLORS){ 3704 if(item->text()==NO) 3705 item->setBackground(QBrush(Qt::darkGreen)); 3706 else 3707 item->setBackground(QBrush(Qt::darkRed)); 3708 item->setForeground(QBrush(Qt::lightGray)); 3709 } 3710} 3711 3712I think the colors should be configurable. For example, I would like to use a light green background for available times and white for not available times in the "student set not available" dialog, whereas for the corresponding teacher dialog, perhaps different colors could be used (white = available; dark grey = not available). In case the colors are used, you could hide the "X" by setting the foreground color to the same as the background color since it would be superfluous. That way, you could keep the rest of the functionality the way it is. 3713 3714213-------------------------DONE---------------------------- 3715 3716214--------------------------------------------------------- 3717From Khalilullah Yosufi: 3718 3719... we expect from software to generate a timetable that we could separate some border or jointed gaps for some teachers 3720but there is no any place to define/plan to the software about separating the jointed gaps during a day. Hopefully 3721someday we would receive an update version of the FET software that has ability to separate joint gaps we want maybe 3722by the name of continuously gaps per day for a teacher. ... 3723 3724--- 3725 3726Further clarification: 3727 3728... Hope one day we could plan or tell to the FET software to add Maximum continuously gaps per day for a teacher = 01 ... 3729 3730--- 3731 3732Further clarification: 3733 3734I need a gap to be maximum 1 hour continuously. 3735 3736215--------------------------------------------------------- 3737From mercurialuser (on forum): 3738 3739To better study the code I'd like to clean generate.cpp: 3740- removing all the commented code 3741- adding comments to illustrate the algo 3742- check to see if I can use some macros for code 3743- in randomswap try to remove all that ok* variables that can be reduced to a couple (since they are not used outside their block) 3744- remove the #if 1/#endif and if(1) { ... } blocks 3745 3746216--------------------------------------------------------- 3747From mercurialuser (on forum): 3748 3749I'd just like to report some thing that may give a little speedup to the code and to avoid duplicates. 3750 3751For example in ::generate several matrixes are reset first and then assigned. The exact same code is used for loading teachersTimetable and newTeachersTimetable but they could be compacted in one loop. There may be probably less cache hits for accessing these 2 matrixes but I think that the multiple loops and retrieving act variable multiple times are more cpu expensive anyway. 3752 3753For assigning these matrixes and some others the code loops (there are 2 variants with different variable names): 3754for(int j=0; j<gt.rules.nInternalActivities/*added_act*/; j++){ 3755 3756The code in the loop does some checks that are replicated in several other loops but they check on data that, as far as I understand, can't change between consecutive checks. So it seems to me that they are redundant. 3757 3758217--------------------------------------------------------- 3759From Bob Hairgrove: 3760 3761Liviu: 3762 3763> > I wrote in the advice on how to translate to not translate the 3764> > large 5 fields in HelpAboutForm_template (which contain difficult 3765> > and large fields, subject to future changes). If you check now, 3766> > your translation of the About is lost (but it is inevitable). 3767 3768--- 3769 3770Bob: 3771 3772> Wouldn't it be better to have the strings in a separate file where 3773> they could be translated, then build the HTML text in a function 3774> which is not routed through the tr() macros? None of the HTML stuff 3775> should be in the .ts file, anyway ... IMHO. 3776> 3777> Should be easy enough since (I assume) there is only one "About..." 3778> form. I wouldn't necessarily translate the list of translators, but 3779> the names of the languages could be translated and the HTML code built 3780> outside of the tr() function as described above. 3781 3782--- 3783 3784Liviu: 3785 3786Unfortunately, I see no easy way to do this. Using a separate file for 3787these is not good. 3788 3789Even if I used simple text instead of HTML, for each new entry I add 3790all the previous translated text is lost, if I lupdate with -noobsolete. 3791 3792I will add this correspondence, and your next email which I just 3793received, to the TODO list. 3794 3795I am not sure what to do. 3796 3797---- 3798 3799Part 2: 3800 3801Bob: 3802 3803Of course, if you don't want the HTML in this form to be translated, 3804there is a much easier way to get rid of it (see attached 3805screenshot). ;) 3806 3807(Bob is referring to the property "translatable" of the string.) 3808 3809--- 3810 3811Liviu: 3812 3813:-) Yes, sure, I thought of this, but some people might really want to 3814translate in a hypothetical situation. All strings in FET should be 3815translatable, I think (I am not sure, though). 3816 3817218--------------------------------------------------------- 3818From Volker Dirr: 3819 3820since FET is able to change split year automatically without losing 3821activities, it is useful to load and save the settings. 3822i don't talk about qsettings. it it already stored there and that is fine. 3823but the settings are different a bit. so year 5 and 6 have very similar 3824categories and divisions, but year 7-10 have got a bit different. 3825so it would be fine to save and load them into a file. so a user can save 3826settings for year 5-6 and save settings for year 7-10. i am not sure if 3827into the fet file or into a separate file. it has different advantages and 3828disadvantages. but i think into a new separate file is a bit better. 3829 3830219--------------------------------------------------------- 3831From chintu and Volker Dirr (on forum): 3832 3833chintu: I have 80 teachers in school, in an academic year if one teacher 3834leaves the school the work load of the teacher is shared with 5 teachers 3835and say about 15 teacher in overall is effected. but remaining 65 teachers 3836time table is still the same. If i re generate the time table all 80 teachers 3837time table will be effected, i want to retain the time table same for 65 3838teachers and only change for 15 how can i achieve this? 3839 3840Liviu: You can generate the timetable, then view the timetable for teachers, 3841and select all activities for a teacher and click "Toggle lock/unlock". 3842 3843Volker: Maybe we should make the unlocking possible without generating the 3844timetable, as in the "Advanced lock/unlock" menus. 3845 3846Liviu: In this case, do it also for students? 3847 3848220--------------------------------------------------------- 3849From Volker Dirr (on forum): 3850 3851When the user clicks "Toggle lock/unlock" with zero selected cells in the 3852"Timetable view" dialogs, maybe it would be better to inform more verbosely 3853the user: "No activities were locked/unlocked, because no activities were 3854selected". 3855 3856221--------------------------------------------------------- 3857From Volker Dirr: 3858 3859in years dialog should be an option: increase all years. 3860 3861now pseudo code: (mixing strings and int. so real code is a bit more 3862complicated) 3863 3864foreach(year, yearsList){ 3865 if(year = int){ 3866 newYearsList<<year 3867 } else { 3868 warning = "unchanged" 3869} 3870 3871sort newYearsList from high to low 3872 3873foreach(year, newYearsList){ 3874 newIntYear=year++; 3875 search that year. 3876 foreach(group, year){ 3877 foreach(subgroup, group){ 3878 if(subgroup.left(year){ 3879 subgroup.replace.left(newIntYear) 3880 else 3881 warning = "impossible to rename. maybe modified manually?" 3882 } 3883 if(group.left(year){ 3884 group.replace.left(newIntYear) 3885 else 3886 warning = "impossible to rename. maybe modified manually?" 3887 } 3888 if(year.left(year){ 3889 year.replace.left(newIntYear) 3890 else 3891 warning = "critical bug!" 3892 } 3893} 3894 3895 3896222--------------------------------------------------------- 3897From Mohamed NAJARI: 3898 38991) Can you add a command to move the teachers, students, materials and activities during entry? 39002) Why not put weight as the 100% value by default instead of 95% during the addition of an activity? 3901 3902223--------------------------------------------------------- 3903From youssouf (on forum): 3904 3905My suggestion is : activating the partition button when modifying the teacher's task. 3906because : 39071. We enter the teacher's tasks ( choice - subject - Partition - period - etc.) 39082. When we want to edit the task of a teacher , we find that the division button is not enabled and we will be forced to delete that task and we retype spot again. 3909 3910224------------------------DONE----------------------------- 3911 3912225--------------------------------------------------------- 3913From jillali elghazoui (on forum): 3914 3915jillali: 3916At the end of the production time table 3917we sometimes want to change instead of an activity 3918But if we follow the normal route of fet its currency fully all activities 3919Is there is a way to change the place of this activity specifically 3920Without major changes in the other activities 3921 3922Liviu: 3923 3924Either: 3925 39261) Open from ~/fet-results/data_and_timetable.fet, then unlock a specific activity and regenerate; 3927 3928or 3929 39302) After generating, select Advanced lock -> lock all activities of the current timetable. Then unlock a specific activity and regenerate. 3931 3932But you may obtain an impossible timetable. 3933 3934jillali: 3935 3936You're right, we can not get what we wanted 3937Is it possible for this to work a new property under the name: 3938 3939"a teacher's not available times with the current timetable" 3940 3941as "not available times" are "the free hours withe the current timetable" 3942And it will save in "a teacher's not available times" 3943And when we want to produce a new table we change a table for one teacher 3944 3945--- 3946 3947We also ask you for a similar property in Students set 3948It seems that these characteristics would be more effective 3949You can set the blank time 3950Although it is possible to move Activitys 3951For a teacher or more 3952Or for one Student set or for more 3953 3954226--------------------------------------------------------- 3955From AlexL (on forum): 3956 3957My proposal is to use transifex for translations: https://www.transifex.com 3958It works fine with .ts files, has suggestions for translations, .etc. 3959 3960227--------------------------------------------------------- 3961From MilesM (on forum): 3962 3963I think it would be helpful to be able to assign time lengths to periods (even if the actual periods are multiples of that as suggested above) in order to be able to generate statistics on time per subject, per grade etc. It would allow another level of validation to make sure everything works. 3964 3965228--------------------------------------------------------- 3966From adso (on forum): 3967 3968It would be useful in the best timetable processed (highest html) (but unfinished) to have at the top of the table for each teacher and each class the number of hours included and not included in order to understand where the problems are. 3969And have a file fet also not complete to import into Excel to be able to work manually. 3970 3971229--------------------------------------------------------- 3972From Volker Dirr: 3973 3974About adding constraints students/teachers interval max days per week: 3975 3976I think you should clarify it in the interface: In FET you call it only 3977"interval start hour" and "interval end hour", but you might say better 3978"start at beginning of hour" and "end at end of hour" (or "until end of hour"). 3979 3980230---------------------------DONE-------------------------- 3981 3982231--------------------------------------------------------- 3983From Davide Cottignoli (on forum): 3984 3985I often need to input many activities with fixed time in working hours and I find the user interface very tedious. 3986It would be more simple if the dialog is divided in two parts a follow: 3987On the left a list of activities (not the combo-box or drop-down box). 3988On the right a table grid with hours and day and the permission to mark only a square of the grid. 3989 3990In many other dialogs with the same scheme (for example in "add teacher not available times") it would be useful to have the list instead of the drop down box. 3991 3992232--------------------------------------------------------- 3993From Davide Cottignoli (on forum): 3994 3995Implement lock/unlock of activities from a specific building. 3996 3997233--------------------------------------------------------- 3998From Volker Dirr and Liviu Lalescu: 3999 4000About coloring the three timetable view dialogs: 4001 4002Volker: 4003A combobox with "disabled" as first item should be perfect for that task. 4004 4005Coloring produces sadly pretty many very similar colors. That should be 4006fixed. (for example by skipping similar colors or calculating a fixed 4007difference between colors.) 4008 4009Liviu: 4010The user can wish to choose the coloring of each view, in a settings menu: 4011Color teachers view by: Students, Subject, Tag, etc., or disabled, etc. 4012 4013234--------------------------------------------------------- 4014From Luigi Valbonesi: 4015 4016When fet generates timetables, to run a parallel routine that saves 4017every new generated timetable (the best possible at the moment) 4018overwriting the previous and the most difficult ativities with the one 4019that blocked the generation. If the computer crashes there will be some 4020data to think about and work with. 4021 4022235--------------------------------------------------------- 4023From fernandolordao and Volker Dirr (on forum): 4024 4025fernandolordao: 4026By default, teachers time constraints are permanently shown at same sequence that we add. 4027It would be useful if we could sort them by teachers' name in order to reduce time wasting for systematic modifications in time restrictions for many teachers. By the proposed way we could do modifications teacher-by-teacher following the name sequence without having to apply filter for each of them. 4028Similar sort options could be designed to other restrictions. 4029 4030Liviu Lalescu: 4031I'd suggest you to go to "All time constraints" dialog, filter "Contains" "Teacher not available", then "Sorted". Because the weight is always 100% and the teacher is after the weight in the constraint description, it works 4032 4033Volker: 4034The request is to save time. You don't save time if you always need to click a filter, write some stuff and also click sort. Very unhandy. 4035 4036In fact nearly all constraints and activities should be sorted. For TODO: 4037 4038Add a new dialog in FET->advanced->sort 4039 4040there should be checkboxes and a sort pushbutton. 4041the checkboxes should be: 4042sort teacher constraints by teacher names. 4043sort students constraints by students names. 4044sort room constraints by room name. 4045sort teacher names of all activities 4046sort students names of all activities 4047sort activity tags of all activities 4048 4049236--------------------------------------------------------- 4050From Wizard (on forum): 4051 4052Wizard: 4053 4054Is there a way to set a minimum distance between first teaching hour and last teaching hour? 4055I have set maximum hours continuously to be 4, but sometimes the generated timetable contains a teacher that teaches 4 hours in a day and they become consecutive. What I would like is for him to be at school for at least 5 hours even if he has a gap. 4056 4057Liviu Lalescu: 4058 4059Unfortunately, I think this is impossible. I am not sure it can be implemented in the FET algorithm. 4060 4061237--------------------------------------------------------- 4062From Volker Dirr: 4063 4064maybe for the TODO: 4065simplify the FET interface. 4066it is currently much to confusing if you work with it. 4067There are many constraint for a single teacher and all teachers. 4068it's unhandy to always check 2 lists. 4069in fact there is normally only a single "all" constraint. 4070in fact this suggestion should be done similar to students and rooms. 4071 4072but i explain now with a single example, so it's easier to explain: 4073there are 2 dialogs: 4074fet -> data -> time constraints -> teachers -> max gaps per week for a 4075teacher 4076fet -> data -> time constraints -> teachers -> max gaps per week for all 4077teachers 4078 4079it should be only a single dialog: 4080fet -> data -> time constraints -> teachers -> max gaps per week 4081the dialog is similar to the current one. just ordered. first the "all" 4082constraints, then the "single" constraints. 4083 4084that will help much, since you only need to check a single list now and 4085it is still ordered, because the "all" will be always the first. 4086this save a lot of space in the fet main window interface. 4087 4088then there are 2 ideas how to implement it. 4089idea a) 4090fet -> data -> time constraints -> teachers -> max gaps per week 4091can stay as "fet -> data -> time constraints -> teachers -> max gaps per 4092week for a teacher" currently is. 4093the "add" button must be renamed to "add one". And a "add all" 4094pushbutton must be added. 4095 4096idea b) 4097we can also remove a lot of dialogs. in this example: 4098remove 4099fet -> data -> time constraints -> teachers -> max gaps per week for all 4100teachers 4101 4102then only modify 4103fet -> data -> time constraints -> teachers -> max gaps per week for a 4104teacher 4105the combobox of this dialog only need a "all teachers" as first item. 4106 4107i prefer variant b, because it will save a lot of code, memory, 4108translations, ... 4109 4110238--------------------------------------------------------- 4111From Volker Dirr: 4112 4113The activity description must be more detailed. 4114 4115Example: 4116If i check FET->Data->time constraint->activities->min days between 4117activities 4118the right information box is not detailed enough. i need to more 4119information if i want to decide if the activity should keep 100% or if i 4120can reduce it. 4121i need to know also the Duration. 4122So instead of for example: 4123Activity with id=9 (T:LAL, S:Ek, AT:16, St:5a) 4124Activity with id=10 (T:LAL, S:Ek, AT:16, St:5a) 4125 4126it should display: 4127Activity with id=9 (T:LAL, S:Ek, AT:16, St:5a, D:1) 4128Activity with id=10 (T:LAL, S:Ek, AT:16, St:5a, D:1) 4129 4130because in that case i will keep maybe reduce the weight of that 4131constraint down to 0%. 4132 4133but is it for example this: 4134Activity with id=9 (T:LAL, S:Ek, AT:16, St:5a, D:2) 4135Activity with id=10 (T:LAL, S:Ek, AT:16, St:5a, D:1) 4136 4137then i will never reduce it under 100%, because a 3 hour activity is to 4138long. 4139 4140239--------------------------------------------------------- 4141From Volker Dirr: 4142 4143Shorten the strings in conflicts.txt. They are much too long. Very 4144confusing if you read that. (Maybe use shortcuts, sort them by type and 4145call the type only at the beginning of the list, ... There are many 4146variants to write it more clear.) 4147 4148240--------------------------------------------------------- 4149From Davide Cottignoli (on forum): 4150 4151I have this simple suggestion that would, in my case, save a lot of time: 4152 4153I have some teachers that bind their worktime to an already built timetable, so they look at various activities and decide to work in those hours. 4154Often this happens when teachers are in co-presence in laboratory or when teachers have students with disabilities and need to support them when specific subject are in time. 4155So, it is the best to "double click" on the subactivity, on the interface with the generated timetable, to show the dialog that modify the subactivity and add the new teacher. 4156Then regenerate all the timetable to obtain the new HTML even for these teachers. 4157Whitout this simple "double click" I need to write down the number of the sub-activity, go to Data->Activities then looking for that number, click "modify" then add the teacher. 4158 4159Is it possible to do this and speed-up data enter? 4160 4161241--------------------------------------------------------- 4162From ant7 (on forum): 4163 4164I do some tricks to make pair of activities to be 4165scheduled the same time but in two neighbouring days. 4166Because of that I need the constraint: 4167Fixed number of days between activities (with default value equal to 1). 4168 4169To achive it I use: 4170Minimum number of days between activities (set to 1) 4171 and 4172Maximum number of days between activities (set to 1) 4173so 4174 4175t1-t2>=1day and t1-t2<= 1day give t1=t2 + 1day 4176 4177Could you add this constraint? 4178Fixed number of days between activities (with default value equal to 1). 4179 4180When I have to click hundreds of times Min and Max... constraints 4181I would save a lot of time if you add this constraint. 4182 4183Also from abautu, on forum: A constraint "Exact N days between activities" would imply "Min N days between activities" 4184AND "Max N days between activities". I use these two constraints simultaneously in order to force two activities to be 4185scheduled in same week days (in an odd/even timetable). 4186 4187242--------------------------------------------------------- 4188From Lizio (on forum): 4189 4190Lizio: 4191 4192What about adding a new value to activities that is difficulty (let say 0=very easy like PE, 1=easy like art, 2= medium, 3=difficult and 4=very difficult like calculus), then it would be possible to add a constraint on maxximum difficulties per day in order to avoid "impossible days" for students. 4193 4194Liviu: 4195 4196Maybe you could add activity tags to activities, and use the constraint students activity tag max hours per day? 4197 4198Lizio: 4199 4200Unfortunately it would not work. It is not a matter of a max number of hours per day of a subject or a group of subjects, but not to sum too many difficult subjects in a day and your suggestion would work only if you define subjects as difficult or not, but I think it is better to define them with more levels. 4201 4202For example, you can have physical education that is easy and history that is harder but not so hard, math that is the hardest, so 2 hours of history is like one of math and so on, if you define a maximum difficulty of, let's say 7, you can plan 2 hours of math (3+3) and then you must plan 2 of physical education (0+0) and one o art (1), then you can plan a day with 2 hours of literature (2+2), one of history (2) and one of art (1) and so on and you don't risk to plan 2 hours of math (3+3) than 2 of literature (2+2) and one of history (2) and a day with 2 hours of PE (0+0), 2 of art (1+1) and one of history (2). 4203 4204Probably to make this improvement is a matter of a lot of coding and the improvement is not worth the effort to do it, but I don't know. 4205 4206Liviu: 4207 4208I understand. Do you know that you can add more activity tags for an activity? Also, you could add more constraints students activity tag max hours daily for the same students. Maybe these can help. 4209 4210To consider a sum of weights might be too difficult to implement. 4211 4212243--------------------------------------------------------- 4213From Lizio (on forum): 4214 4215come posso fare a dire a FET che deve mettere due attività concomitanti, ma non fissate, bensì scelte da un insieme? 4216 4217Facciamo un esempio: 4218La palestra deve essere occupata per forza da due classi contemporaneamente e per farlo l'ho dichiarata come due aule distinte, ora vorrei che una prima fosse in palestra con un'altra prima e non, magari, con una quinta. 4219Le ore di ginnastica sono tutte attività separate e ho messo il vincolo di spazio sulle due palestre fittizie, FET mi alloca bene le cose, ma le classi sono mescolate, ora vorrei provare ad avere prime con prime, seconde con seconde, ecc. 4220 4221Qualche soluzione che non comporti il numero totale di classi al quadrato di vincoli da scrivere? (Ho 31 classi da piazzare e scrivere 900 e passa vincoli è proibitivo) 4222 4223--- 4224 4225I have 4 1st grade classes, 4 2nd grade, 6 3rd grade, 4 4th grade and 2 5th, I have 1 gymn and it must be used by 2 classes at the same time, so I created "palestra1" and "palestra2" and I have put the space constrain on each activity of physical education to be tought either in palestra1 or in palestra2. 4226 4227Now I want in the gymn 2 classes of the same grade and not 2 of different grades. 4228 4229The problem is that in my school we have 31 classes... 4230 4231I don't want to put toghether 2 classes of my choice as this would be a real hard constrain to be managed. 4232 4233244--------------------------------------------------------- 4234From Arsenio Stabile: 4235 4236He has a custom version, so that if he has minimum gaps between building changes = 1, 4237if a teacher name ends in " AB", if he changes buildings from hour 3 to 4 from 4238a building ending in " A" to a building ending in " B", the gap is no longer necessary. 4239 4240Liviu Lalescu: 4241 4242I am sorry, but this kind of constraint is too specialized. I cannot 4243think of a name and good implementation for everybody to use it. I 4244think I'll add your suggestion in the TODO list. 4245 4246About you choosing the hours - this can made on your custom version, 4247but again I am not sure about a good way to present it to the user. 4248 4249Arsenio: 4250 4251In Italy it often happens that a school is divided into two buildings 4252one hour away for which is required a gap for the exchange and this 4253creates a major constraint. Some time ago I saw a commercial program 4254that provides the opportunity to do so now the gap is not attributed 4255to a teacher if the change takes place in the building at a certain time. 4256 4257245--------------------------------------------------------- 4258From ant7 (on forum): 4259 4260After timetable generation 4261in timetable tab (teachers, students etc.) 4262I can see which activities are time or space locked ( I see LT or/and LS acronims) 4263and I can toggle these constraints for one or more activities whith mouse highlighting. 4264It would be very usefull If I can see the same signature in HTML files. 4265When I updates timetable many times on website 4266I would like to tell people that some their activities are already fixed time or place. 4267It should be some general option in FET allowing user to decide wether show this tags or not in HTML files. 4268When timetable is finished it should be easy switched off visibility of the two tags in all timetable in HTML files. 4269I don't want to insert these tags manually in activity dialog because it is some cumbersome. 4270 4271246--------------------------------------------------------- 4272From Nguyễn Hữu Duyệt (on forum): 4273 4274Activate/deactivate more activities at once. 4275 4276247--------------------------------------------------------- 4277From Volker Dirr: 4278 4279rethink about all used QList stuff in generate.cpp (in FET version 5.28.3) 4280 4281examples: 4282 4283Line 293: QList<int>& conflActivities 4284conflActivities is used only to check "contains". So isn't a QSet better/faster? 4285 4286Line 1990: 4287QList<int> occupiedRoomsList; 4288 4289it is only used for a foreach. So maybe a QStack or QQueue is better/faster? 4290 4291So maybe all should be rechecked. 4292 4293Liviu: You are right. The first part is more important, but I also need the 4294same order of the conflicting activities, as they are added. So I could 4295add a QSet and a QList together. But this will require more memory 4296allocation and operation. I am not sure. 4297 4298248--------------DONE since FET-5.41.0 on 2019-11-20-------- 4299 4300249--------------------------------------------------------- 4301From Handaya: 4302 4303DONE since FET-5.29.0 on 15 March 2016 --> 1) what if the html result be colorful also as in the program ? 4304(This point was also suggested by hudrea and by Udo Schütz). <-- DONE 43052) what if the colors be the same for the same teacher ? 43063) what if the program allows marking a weekly meeting for all teachers 4307without printing every name in the cell of timetable result ? 43084) what if the timetable result be printable or saveable in some diferent 4309formats like doc and pdf ? 4310 4311Liviu: 4312 4313DONE since FET-5.29.0 on 15 March 2016 --> (1) - The HTML results can be colored by using the CSS file. It is too 4314difficult for us, the programmers, to color them as in the FET 4315interface. <-- DONE 4316 4317(2) - In the interface, the colors are the same for the same 4318subject/subject+students set. This is what we came to after some 4319thinking. 4320 4321(3) - This would be possible, but I would need to keep in the .fet data 4322file an attribute which does not belong to timetabling, and I prefer 4323not to. 4324 4325(4) - .doc and .pdf - you could print the timetable to a pdf file, or 4326copy/paste the HTML code to a doc file. 4327 4328250--------------------------DONE--------------------------- 4329 4330251--------------------------------------------------------- 4331From Bobby Wise: 4332 4333I suggest that perhaps an additional printout be added that displays 4334all the teachers that are not occupied in a particular period. 4335 4336So it is basically a Free Teacher timetable printout, but it does not have 4337any comments like "Must come earlier" or "Single gap", it just displays the 4338names of all the teachers who are not working in that period. 4339 4340252--------------------------DONE--------------------------- 4341 4342253--------------------------------------------------------- 4343From Benahmed Abdelkrim (on forum): 4344 4345Par fois quand on entre les activité, en se rend compte ensuite qu'on a oublié d'utiliser les étiquettes. Et on se trouve dans obligation de mentioné les activités une par une, ce qui fait perdre un temps précieux . Peut on donc actuellement montioné d'un seul coup un ensemble d'activités choisi? 4346Sometimes when you enter the activity, then realizes we forgot to use the tags (labels). And we are in obligation to mentione the activities one by one, which wastes valuable time. Can we therefore now Montione suddenly a selected set of activities? 4347 4348Liviu: 4349 4350I am not sure I understand. You mean you want to modify more activities at once? I can add this in the TODO list, if you want, just let me know. But I don't think I will implement soon. 4351 4352Benahmed Abdelkrim: 4353 4354oui, absolument, vous pouvez l'ajouter dans le fichier TODO, car cette fonction à mon avis est très utile, vue le temps quelle permet de gagner. 4355 a maintes reprises et après production d'un tableau par FET, et après vérification de celui-ci, on se rends compte qu'on est obligé de faire appel a une étiquettes(tags) pour réaliser une séparation dans le temps d'un ensemble d'activités. 4356 donc cette nouvelle fonction si elle voit le jour, permet de modifier les étiquettes(tags) d'un seul coup, et non pas comme elle actuellement une par une. 4357 4358 yes, absolutely, you can add it to the TODO file because this feature in my opinion is very useful for any time saves. 4359 has repeatedly and on production of a table by FET, and after checking it, we realize that we are obliged to call a labels (tags) to make a separation in time of a set activities. 4360 So this new feature if it is created, we can change the labels (tags) at one time, and not as it is currently one by one. 4361 4362254--------------------------------------------------------- 4363From Benahmed Abdelkrim (on forum): 4364 4365 j'ai deux suggestions: 4366 la première: 4367 pourquoi ne ajouter dans le dossier fet-results, un fichier qui permet de savoir les horaires des salles vide? 4368 ce fichier va aider a mieux contrôler l'énergie électrique en éteignant la lumière le temps que ces salles soit vides. 4369 la deuxième: 4370 cette opération qui ce fait maintenant de façon manuelle. peut on la rendre automatique via un logicielle lié a FET? 4371 4372I have two suggestions: 4373 the first: 4374 why not add in the folder fet-results, file that lets you know the times of empty rooms? as the file: Teachers Free Periods 4375 This file will help better control the electric power by turning off the light as long as these rooms is empty. 4376 the second: 4377 this operation that now done manually. can we make it automatic via a software related to FET? 4378 4379Volker Dirr: 4380 4381about first suggestion: 4382Rooms Free Periods: In my opinion only needed if you want to swap a room. I think i can add it if Liviu agree. 4383On the other hand you can already do it today with TiTiTo (selecting empty rooms; swap rooms; ...) 4384Also: in my opinion your suggestion doesn't help saving electric power. Only if you are able to control electric from distance or if there is a guy that always run through all rooms. 4385We save electric power very easy: We simply print the room table and put it on the door. So every teacher ans students can see if nobody will use the room in the next hour(s) and so they can turn off the light. 4386 4387about second suggestion: 4388i am not sure about what exactly you are talking. about printing free rooms table? see previous answer. Or about swapping a room? see previous answer? Or do you talk about something different? 4389 4390255--------------------------------------------------------- 4391From math user (on forum): 4392 4393It would be great if "teachers", "subjects", ... would be customizable (settings). For universities "lecturers" and so on. 4394 4395256--------------------------------------------------------- 4396From ChicagoPianoTuner: 4397 4398I have a feature request for FET: in the timetables menu after a successful 4399generation, there is a button to "lock/unlock" all activities when I'm 4400looking at a particular subgroup or teacher or room. If I click it, all 4401activities lock, and clicking again unlocks. I would prefer two separate 4402buttons, one for lock and one for unlock. The reason is sometimes I have 4 4403subgroups where they share many activities (but not all activities), and I 4404want to lock all activities for that particular group (or year) but cannot 4405do it all at once. 4406 4407Liviu: 4408 4409Unfortunately, there is not enough space in that dialog. But you can use the 4410timetable view time horizontal views. 4411 4412257--------------------------------------------------------- 4413From MING-KIAN JONATHAN CEDRIC LEE KIM GNOK and Volker Dirr: 4414 4415All the users to start FET by double-clicking a .fet file (so that the FET executable won't complain: 4416"To start FET in interface mode, please do not give any command-line parameters to the FET executable."). 4417We could open in such a case the first file given as a command-line parameter to the FET executable. 4418 4419Liviu: 4420It is bad to mix the version accepting command-line parameters (fet-cl) with the one not accepting them (fet). 4421 4422258--------------------------------------------------------- 4423From Benahmed Abdelkrim (on forum): 4424 4425FET can really import and export almost all data. except constraints. if this function can be done with FET, it will help save a lot of valuable time, and also allow a FET to communicate with other software.. 4426 4427Liviu: It is a bit weird to export the constraints - what format to choose? 4428 4429Also suggested by sln_rj, on forum. 4430 4431259--------------------------------------------------------- 4432From Benahmed Abdelkrim (on forum): 4433 4434write directly into cells Activity planning, especially for the activities which are not divided(not split). 4435for the activities that are divided, we can momentarily kept the weight by fefaut (95%), and later change it if we want. 4436 4437260----------------------DONE------------------------------- 4438 4439261--------------------------------------------------------- 4440From Volker Dirr: 4441 4442a second rooms statistic: 4443 4444print all activities with the (maybe) used rooms. 4445but only an unordered list will be "bad" to read/check. 4446so there should be a not only a simple list. 4447there should be a filter to check faster. 4448so filter all activities by subject, teacher or students set. 4449 4450262--------------------------------------------------------- 4451From Volker Dirr: 4452 4453add a new column in "fet -> Statistics -> Teachers Statistics" 4454the column get the name "teachers qualification". 4455so the user can see the the data that he entered. 4456 4457and: 4458 4459add a new column in "fet -> Statistics -> Subjects Statistics" 4460the column get the name "teachers qualification". 4461so the user can see the the data that he entered (indirectly). 4462 4463263--------------------------------------------------------- 4464From math user (on forum): 4465 4466math user: It would be great if components / subactivities always get the same room (option). 4467 4468Liviu: You have the constraint activities occupy max 1 different rooms. 4469 4470math user: Yes, that is exactly how I have solved it. But I have to enter a condition for each activity 4471(lots of conditions). Therefore a (global) setting "same room for all components of an activity" would be nice. 4472 4473264--------------------------------------------------------- 4474From Volker Dirr: 4475 4476at the end of the generating algorithm, so after all activities are 4477placed (but before locking the activities?!) there should be a simple 4478algorithm that cares about rooms "bugs". this algorithm must not be 4479perfect, it should only fix "bad" stuff. 44801) check if there is an activity without a room, even if it is got a space 4481constraint with weight less then 100% 44822) if there is an activity with a room, it should check if it is 4483possible to place a smaller room to this activity 44843) maybe repeat step 2 a few times to get a better result. (the result 4485might not be perfect, but it is ok.) 4486 4487265--------------------------------------------------------- 4488From math user (on forum): 4489 4490It would be great if the user could change the default values for width and height (disabled and 8ex) in the settings: enable/disable and enter values (default: 8 and 8). 4491Like that, the user does not have to change the values manually after each generation. 4492 4493266--------------------------------------------------------- 4494From Volker Dirr: 4495 4496Generating a difficult timetable shows 28 h... . Should it show 1 d 4 h... ? 4497 4498267--------------------------------------------------------- 4499From daltinkurt (on forum): 4500 4501A constraint min days between activities, with force consecutive if same day = true. Can (should) two activities if on the same day span over a break? 4502 4503268--------------------------------------------------------- 4504From Volker Dirr: 4505 4506maybe we can add a check for this: 4507 4508teacher max hours per day is lower than activity duration. 4509 4510269-------DONE since FET-5.34.0-(26 October 2017)----------- 4511 4512270--------------------------------------------------------- 4513From auriolar (on forum): 4514 4515It would be nice to be able to limit the time a teacher is in the school. 4516 4517I mean, having, for instance, 5 days and 6 hours/day, I would like to have teachers no more than 25 hours each week in the school gaps included. 4518This asumes that the timetable is continuous each day, so if I have only class at the first hour and other at the last one, I've been 6 hours (not 2). 4519 4520I don't think max gaps per week will work (30-25=5), because some teachers have to be less than 25 hours, and those should have more than 5 gaps. 4521 4522Liviu Lalescu: It would be possible for the user to just consider the working hours for each teacher and add a corresponding max gaps per week 4523for each teacher (a solution which you partially imply). 4524 4525271--------------------------------------------------------- 4526From auriolar (on forum): 4527 4528I think it would be a good idea to have tags for teachers, this way we could add constraints to groups of teachers instead of doing one by one. 4529Maybe it could be done for rooms to. 4530 4531272--------------------------------------------------------- 4532From Bob Hairgrove (on forum): 4533 4534When I generate a timetable, I can successfully save it in CSV format. However, if I do not generate a timetable but open a .FET file from a previous session, it will export all of the data but without without any planned activities because "no timetable has been generated". So if I want to have CSV timetables, I have to remember to export them immediately after they have been generated. 4535 4536This would be a nice feature to have since there is the schedule contained in the "{Name}_activities.xml" file, and the export routine would only have to read it. 4537 4538Or is there a better way? 4539 4540Liviu Lalescu: Did you notice that there is a file name_data_and_timetable.fet in the results? You can open this file and generate on it - it will go very fast, and after that you can export the CSV results. 4541 4542273---------------------------DONE-------------------------- 4543 4544274--------------------------------------------------------- 4545From Benahmed Abdelkrim (on forum): 4546 4547Sometimes you need to see the "Activity tags" in tables produced by FET, but the tables are becoming so large; then the idea that surprises us right now is: why not allow the user to select only the "Activity tags" that wants to print ?. 4548 4549If this feature is created, the tables will be lightweight, and easy to read. 4550 4551275--------------------------------------------------------- 4552From Anton Anthofer (see also item #151): 4553 4554- remove the "modify subactivity" menu and move that feature into the "normal" activity menu. 4555- modify the id 4556- recalculate the ids 4557- a complex calculation of the number of students. 4558- generate very similar timetables 4559 4560276--------------------------------------------------------- 4561From Volker Dirr: 4562 4563a) Add also conflicting activities into 4564activitiesConflictingPercentage if there is a constraint with: 4565activities with min days between activities and weight 100% 4566two grouped activities with weight 100% 4567two consecutive activities with weight 100% 4568two ordered activities with weight 100% 4569min gaps between activities with weight 100% 4570 4571b) Check if it speedups if there is a QList/QSet timetable[hours_per_week] and 4572checking the activitiesConflictingPercentage at the very beginning. 4573because activitiesConflictingPercentage contains a lot of constraints. 4574 4575Liviu Lalescu: I think this is impossible/infeasible. 4576 4577277--------------------------------------------------------- 4578From mercurialuser (on forum) (and similar, from JBoss, also on forum): 4579 4580In a few minutes I will have to stop FET and switch off my computer. I need to change some activity so it is not a problem but is it 4581possible to "pause" a run and "restart" it later, surviving a pc reboot? 4582 4583From JBoss: 4584 4585I was wondering if it was possible to stop and resume (at a later time) the generation of a timetable, for example if one needs badly 4586to switch off the PC but doesn't want to loose the N-hours of elaboration done so far. 4587 4588(Related to item #196.) 4589 4590278--------------------------------------------------------- 4591From mercurialuser (on forum): 4592 4593If you can't change a value (usually a 100% setting, or allow empty days) please disable the widget... it is misleading... 4594 4595Rewording by mercurialuser: 4596 4597There are some constraints that must have the % field set to 100. Unfortunately the field is editable and it causes confusion, expecially for newcomers. 4598 4599I suggest to keep the field on screen but just disable it, make it not editable... 4600 4601279--------------------------------------------------------- 4602From mrtvillaret (on forum): 4603 4604In the add constraint teacher not available dialog mark with "b" the slots in which there is a global break. 4605 4606Liviu Lalescu: also in students set or room not available and activity(ies) preferred times? 4607 4608280--------------------------------------------------------- 4609From Lizio (on forum): 4610 4611It could be helpful to put disable and enable buttons in every windows about constraints, not only in the "All" ones. 4612 4613It could be helpful too to put those buttons also on windows about activities. 4614 4615281--------------------------------------------------------- 4616From Lizio (on forum): 4617 4618I think it could be very helpful to let multiple selection in every window about data and constraints. 4619 4620In this way you can select some of them to apply actions with buttons. 4621 4622282--------------------------------------------------------- 4623From Volker Dirr: 4624 4625Volker provided code for a faster generation if one uses constraints room not available times. But it is too risky for now. 4626Maybe in the future. 4627 4628Volker: Disalow timeslots of activities if a room is not available. 4629 4630Volker's code: 4631 4632... 4633Matrix2D<double> notAllowedTimesPercentages; 4634Matrix2D<double> notAllowedTimesPercentagesFromSpaceConstraints; 4635 4636//breaks are no gaps - I keep track of this 4637//bool breakTime[MAX_HOURS_PER_WEEK]; 4638... 4639 4640... 4641 t=computeActivitiesRoomsPreferences(parent); 4642 if(!t) 4643 return false; 4644 4645 //Before computeFixedActivities(...) 4646 t=computeNotAllowedTimesPercentagesFromSpaceConstraints(parent); 4647 if(!t) 4648 return false; 4649 ////////////////// 4650 4651 /////////buildings 4652 t=computeMaxBuildingChangesPerDayForStudents(parent); 4653 if(!t) 4654 return false; 4655... 4656 4657... 4658bool computeNotAllowedTimesPercentagesFromSpaceConstraints(QWidget* parent) 4659{ 4660 Q_UNUSED(parent); 4661 4662 //Speed improvement (start) by Volker Dirr 4663 notAllowedTimesPercentagesFromSpaceConstraints.resize(gt.rules.nInternalActivities, gt.rules.nHoursPerWeek); 4664 4665 //TODO: check if this is correct 4666 for(int i=0; i<gt.rules.nInternalActivities; i++){ 4667 for(int hour=0; hour<gt.rules.nHoursPerWeek; hour++){ 4668 notAllowedTimesPercentagesFromSpaceConstraints[i][hour]=-1; 4669 } 4670 } 4671 4672 for(int i=0; i<gt.rules.nInternalActivities; i++){ 4673 if(!unspecifiedPreferredRoom[i]){ 4674 bool roomsWithWeight100Found=false; 4675 QSet<int> allowedRoomsSet; 4676 for(int kk=0; kk<activitiesPreferredRoomsList[i].count(); kk++){ 4677 PreferredRoomsItem& it=activitiesPreferredRoomsList[i][kk]; 4678 if(it.percentage==100){ 4679 if(!roomsWithWeight100Found){ 4680 allowedRoomsSet=it.preferredRooms; 4681 roomsWithWeight100Found=true; 4682 } 4683 else{ 4684 allowedRoomsSet.intersect(it.preferredRooms); 4685 } 4686 } 4687 } 4688 if(roomsWithWeight100Found){ 4689 if(!allowedRoomsSet.isEmpty()){ 4690 for(int hour=0; hour<gt.rules.nHoursPerWeek; hour++){ 4691 bool noRoomAvailable=true; 4692 foreach(int room, allowedRoomsSet){ 4693 if(notAllowedRoomTimePercentages[room][hour]!=100){ 4694 noRoomAvailable=false; 4695 break; 4696 } 4697 } 4698 if(noRoomAvailable){ 4699 if(notAllowedTimesPercentagesFromSpaceConstraints[i][hour]!=100){ 4700 notAllowedTimesPercentagesFromSpaceConstraints[i][hour]=100; 4701 } 4702 } 4703 } 4704 } else { 4705 //TODO report a warning. There is no allowed slot at all 4706 } 4707 } 4708 } 4709 else{ 4710 if(!unspecifiedHomeRoom[i]){ 4711 if(activitiesHomeRoomsPercentage[i]==100){ 4712 for(int hour=0; hour<gt.rules.nHoursPerWeek; hour++){ 4713 bool noRoomAvailable=true; 4714 foreach(int room, activitiesHomeRoomsHomeRooms[i]){ 4715 if(notAllowedRoomTimePercentages[room][hour]!=100){ 4716 noRoomAvailable=false; 4717 break; 4718 } 4719 } 4720 if(noRoomAvailable){ 4721 if(notAllowedTimesPercentagesFromSpaceConstraints[i][hour]!=100){ 4722 notAllowedTimesPercentagesFromSpaceConstraints[i][hour]=100; 4723 } 4724 } 4725 } 4726 } 4727 } 4728 } 4729 } 4730 //Speed improvement (end) by Volker Dirr 4731 4732 return true; 4733} 4734 4735bool computeMinDays(QWidget* parent) 4736... 4737 4738... 4739bool computeFixedActivities(QWidget* parent) 4740{ 4741 bool ok=true; 4742 4743 for(int ai=0; ai<gt.rules.nInternalActivities; ai++){ 4744 int notAllowedSlots=0; 4745 for(int tim=0; tim<gt.rules.nHoursPerWeek; tim++) 4746 if(notAllowedTimesPercentages[ai][tim]==100 || notAllowedTimesPercentagesFromSpaceConstraints[ai][tim]==100) 4747 notAllowedSlots++; 4748 4749 if(notAllowedSlots==gt.rules.nHoursPerWeek){ 4750... 4751 4752... 4753 s+=GeneratePreTranslate::tr("End - the order of activities (id-s)"); 4754 s+="\n"; 4755 initialOrderOfActivities=s; 4756 4757 if(initialOrderStream!=nullptr){ 4758 (*initialOrderStream)<<s; 4759 (*initialOrderStream).flush(); 4760 } 4761 4762 //After computing the initial order, because it is already taken care of. 4763 //Speed improvement (start) by Volker Dirr 4764 for(int i=0; i<gt.rules.nInternalActivities; i++) 4765 for(int t=0; t<gt.rules.nHoursPerWeek; t++) 4766 if(notAllowedTimesPercentagesFromSpaceConstraints[i][t]==100) 4767 notAllowedTimesPercentages[i][t]=100; 4768 //Speed improvement (end) by Volker Dirr 4769} 4770... 4771 4772283--------------DONE since FET-5.41.0 (2019-11-16)--------- 4773 4774284--------------------------------------------------------- 4775From alienglow (on forum): 4776 4777Could you please add a setting to display the full file path of the data file in the title bar. 4778e.g. Instead of showing just "datafile.fet" if there can be a setting to display "D:\Data\FET\datafile.fet". 4779You can also think of doing this via a status bar, where if possible more info can be displayed. 4780For the statusbar you can have display options like - data file name, current output directory etc. 4781 4782285--------------------------------------------------------- 4783From mercurialuser (on forum): 4784 4785In order to avoid that 3rd grade classes with 10h subject (3 2 2 1 1 1 or variants as we spoke in other thread) have more than 3 hours in one day I add a tag MAX3 to all that activities. 4786 4787I then added a "TEACHER max hour per day with a tag" constraint set to 3. 4788 4789All the test run with (where I disable the most strict constraints) completed the timetable. 4790 4791When all the constraints were enabled, no way to go upper than a value, in all the runs. 4792 4793I finally traced the problem to a teacher that has 2 10h subjects, so 20 hours... in a 5 days timetable it means at least 4 hours per day.... 4794 4795I moved the constraint to Students.... 4796 4797I think that this condition can be found at pre-compute... sum of the hours of all the splits with the tags / number of working days should be <= max daily hour with tag 4798 4799286--------------------------------------------------------- 4800From noddy11: 4801 4802He asks if there is an easier way to activate/deactivate activities. It is to complicated since he needs do it many times. 4803A first solution might be that the "active" checkbox in activities will be related to all subactivities. Activating subactivities only by the modify subactivities form. 4804An other solution might be activating similar to the activating of constraints. 4805 4806287--------------------------------------------------------- 4807From Davide Cottignoli (on forum): 4808 4809Is it possible to add a lock/unlock menu for all activities placed in a specific building and a lock/unlock menu for all activities with a specific key? 4810This can speed up manual adjustment when a timetable is generated and, virtually, can speed up the locks for any activities aggregation. 4811 4812288--------------------------------------------------------- 4813From Devrim Altınkurt (on forum): 4814 4815 think, maybe you can think about only place AN ACTIVITY (not two acts / subacts) over a break. 4816i know it is diffucult problem. but i know there are another schools which want you do this in Turkey. 4817maybe you add an option ([ X ] can place over a break) for each activity (not subacts) 4818and the users can choice if the lesson place like this or not. 4819 4820289--------------------------------------------------------- 4821From Davide Cottignoli (on forum): 4822 4823He suggests that it is possible for the user to change from LT (locked time) to PLT (permanently locked time) and viceversa and from 4824LS (locked space) to PLS (permanently locked space) and viceversa, from the timetable view dialogs, by selecting cells. 4825 4826290--------------------------------------------------------- 4827From Devrim Altınkurt (on forum): 4828 4829i think there is a bug about "Activity tag preferred room(s)" constraint. 4830i attached a fet file. you can take a look at it. 4831 4832bug steps: 4833 4834 time table: 1 day and 12 hours 4835 added some lessons, student groups, ... 4836 added 13 activities with 1 hour to different subgroups and subjects 4837 added a tag to all activities 4838 added an "Activity tag preferred room(s)" with this tag and one room. 4839 there is not enough room but FET don't detect this. 4840 4841Liviu Lalescu: 4842 4843It is not a bug, it is more like a suggestion. 4844 4845291--------------------------------------------------------- 4846From thanhnambkhn (on forum): 4847 4848When investigating Fet command line source code, I see there are 2 types of return value: return 0 or 1 (fet.cpp), therein: 4849- Value "1" means error (can not generate time table) always. 4850- But value "0" somewhere mean success, but somewhere mean error (when time exceed or abort). (fet.cpp - line 1380) 4851 4852I think, "0" should mean "success" only. In order to do that, we should add "return 2;" when time exceed or abort. (fet.cpp - if/else - line 1239) 4853 4854Liviu: I consider that my way of treating this is better. 4855 4856292--------------------------------------------------------- 4857From Malamojka (on forum): 4858 4859Notebook: 4860 48611. Could you add something like "Notepad" where you could write down various comments for yourself for current version of a timetable. It could be opened all the time and saved when you save the timetable. 48622. I really like "comments" of each activity, but I miss a possibility to add a comment when you create an activity (you have to create it, then go to Data/Activities, find the activity and then add comment. 48633. As I said, I really like comments, so I'm also missing a shortcut to create a comment on Time/Space constraints: I would like to be able to add comment, when I add a constraint (now I have to filter/find a constraint in Time/All or Space/All and then add a comment). 4864 4865293--------------------------------------------------------- 4866From Malamojka (on forum): 4867 4868I was looking for a way to "hide" some of tags in the timetable (I want some to be visible, but not all). As far as I can see you can do this by changing a certain file in program data folders. I was wondering if the same could be done by, say, naming tag "not wanted tag" in form "(*not wanted tag*)" (so basically adding (* in front of a tag name and *) at the end of tag name). So a tag of that form wouldn't be seen in timetable html. If a solution like that already exists, then I apologize (it didn't exist the last time I checked). Please let me know. 4869 4870294--------------------------------------------------------- 4871From Malamojka (on forum): 4872 4873When you generate a timetable, you have to select output directory in Settings/Select output directory. Could there be a possibility you could check/choose, so "Output directory" would automatically be directory, where your *.fet file is saved. 4874 4875295--------------------------------------------------------- 4876From Malamojka (on forum): 4877 4878Four suggestions on constraints: 48791. Would it be possible to add: space -> Activities -> An activity has a preferred building. It would help me a lot. 48802. Could you add: time -> Activities -> An activity either starts or ends students day (for when they don't actually do the activity for the entire semester)? 48813. Is it possible to have variable weight on teachers not available time (for their ideal time, set at maybe 99%)? 48824. Could you add: space -> Activities -> A set of activities has a set of preferred rooms? (there are several subjects with a certain tag that I want in just a few rooms). 4883 4884Liviu: 4885 48861. You can add a new tag, then constraint activity tag preferred rooms, then add this tag to all implied activities. It should be easy. 48872. No. It is impossible to add in the algorithm. Maybe you could duplicate the students set and add all the activities which are taken the entire semester. This way, if the duplicated students set has max gaps 0, it will force what you want. 48883. Please use constraint activities preferred time slots. 48894. Activities preferred room(s) is not possible (the constraints are not correctly understood when you mix subject preferred room(s) with teacher preferred room(s)). But why don't you use subject+activity tag preferred room(s) or activity tag preferred room(s)? You can add more tags and constraints for an activity. 4890 4891For point 2. please see also item #364. 4892 4893296--------------------------------------------------------- 4894From Malamojka (on forum): 4895 4896My subjects have their own ID for the sake of our system (I'm talking about few activities with same subject and different teachers). Is it possible to import subject names and IDs? We sometime have two subjects with same name but different ID. Timetable for subjects puts those two in same timetable and adding an ID could solve that problem (subjects' timetable could be composed on the basis of subjects IDs and not name). 4897 4898297--------------------------------------------------------- 4899From thanhnambkhn (on forum): 4900 4901From my point, I see that FET-cl is very compact (minify) compare to FET-desktop. Most of people care about FET-desktop only, I do not. 4902I think you should consider design Fet in the future in this way: 4903- FET-cl is core 4904 + With many options, apis, 4905 + Allow to extend or customize but keep work with the official 4906 + With standard output (xml, json ...) 4907- FET desktop (or any other App) is only front-end, calls to these Fet-cl 's api. 4908By this way, FET will able to more useful, and able to use in many cases, many projects. They can use Fet GUI or not. (it is my case) 4909 4910298--------------------------------------------------------- 4911From canhathuongnhau and Volker Dirr (on forum): 4912 4913Volker: 4914 4915The dataset is impossible. 4916It is very easy to prove that. 4917Please check teacher T. 4918That teacher is teaching 24 hours. 4919Now check his activities. All activities should be in the morning. In the morning are only 5*5=25 free time slots. But you set also 2 breaks in 4920the morning. So there are only 25-2=23 slots left. 4921It is impossible to set 24 hours into 23 free slots. 4922 4923Could we add a test for this? 4924 4925Liviu: 4926 4927It is easy to add such a test for such a case, but there are many more other situations in which this test will not work. Like there are more "groups" of 4928activities, each one with its preferred time slots. 4929 4930299--------------------------------------------------------- 4931From Volker Dirr: 4932 4933don't always break/disallow generating if there is a warning at the 4934beginning. that is pretty bad. sometimes FET gives warnings, even if the 4935dataset is solveable. (For example if you add an activity tag, but no 4936activity is using that activity tag). i like that FET is reporting this 4937potential bug. But the FET behavior is bad, since 4938it shouldn't disallow generating. 4939 4940also maybe rethink about printing all warnings into a single 4941string/editor. since by this i can copy and paste those warnings and fix 4942them all at one. at the moment i always need to read and fix it always 4943step by step (because i can't remember always all reported bugs, especially 4944if i check datasets from other users and or if i can't even read the 4945characters (Arabic, Russian, ...) 4946 4947300--------------------------------------------------------- 4948From Jijo Jose: 4949 49501. Export the result to Excel format 49512. Add xml dtds for xml display 4952 4953301--------------------------------------------------------- 4954From Julio González Gil (on forum): 4955 4956Rephrased by Liviu Lalescu: 4957 4958We need more preliminary tests for the constraint teacher(s) min hours daily, to avoid 4959unnecessary work to discover the bugs. For instance, if we have teacher(s) min 2 hours daily 4960with allow empty days, and: 4961 4962- The teacher is only available one hour on a day, or 4963- The teacher has one activity divided into two components, 100% min 1 days between them, 4964each component having duration 1. 4965 4966302--------------------------------------------------------- 4967From Volker Dirr: 4968 4969generate multiple: instead of a fixed max time use a more flexible max 4970time. "Calculate max X minutes longer than the time the last max 4971activity was placed" or "Countdown x minutes if no new max placed 4972activity was found" 4973so for example thre is a countdown timelimit with 5 minutes. 4974as soon as a new max placed activity was found the counter restarts at 5 4975minutes. 4976 so the time limit is 5 minutes. 4977 4978303--------------------------------------------------------- 4979From Julio González Gil (on forum): 4980 4981If we are sure that nobody can teach less hours than the global constraint (for all teachers), another option is to mark as unavailable the days for the teacher(s) with problems. 4982 4983For example if we have "min hours per day = 2" for all teachers, and TeacherA has Wednesday with only one free hour (time slot), it is clear we can mark the whole Wednesday as not available (as it won't be used anyway). 4984 4985--- 4986 4987Liviu Lalescu: Maybe also for students? 4988 4989--- 4990 4991Volker Dirr: 4992 4993a) fet should show a "speed warning" only. so user can modify hisself 4994or 4995b) fet should automatically disallow those timeslots for related activities. but this is a bit critical. (i wrote similar stuff for rooms and same starting time constraints but we didn't added it yet, since there where small problems with other example file. i think they only happen since the free time slot check where done after the "set disallowed" even if it must be done before. but that mean we must split that in the source, since currently Liviu done both very close at the same time.) 4996 4997--- 4998 4999Julio González Gil: 5000 5001I would go with option A, with a warning for each problem found. In my opinion it's better to allow the user to fix it and least you are sending a warning to the user about the speed (I'd mention that in this case you can even have impossible timetables as it was in my case). 5002 5003--- 5004 5005Liviu Lalescu: 5006 5007The code could look like: 5008 5009 for(int d=0; d<gt.rules.nDaysPerWeek; d++){ 5010 int nFreeSlotsDay=0; 5011 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 5012 if(!teacherNotAvailableDayHour[tc][d][h]) 5013 nFreeSlotsDay++; 5014 } 5015 if(nFreeSlotsDay>0 && nFreeSlotsDay<teachersMinHoursDailyMinHours[tc]){ 5016 ok=false; 5017 5018 int t=GeneratePreIrreconcilableMessage::mediumConfirmation(parent, GeneratePreTranslate::tr("FET warning"), 5019 GeneratePreTranslate::tr("For teacher %1, the constraint min %2 hours daily is useless on day %3. Please make this " 5020 "teacher not available on this whole day, for performance and better correctness checking.") 5021 .arg(gt.rules.internalTeachersList[tc]->name) 5022 .arg(teachersMinHoursDailyMinHours[tc]) 5023 .arg(gt.rules.daysOfTheWeek[d]) 5024 , 5025 GeneratePreTranslate::tr("Skip rest"), GeneratePreTranslate::tr("See next"), QString(), 5026 1, 0 ); 5027 5028 if(t==0) 5029 return false; 5030 } 5031 } 5032 5033to be added at the end of the function "bool computeTeachersMinHoursDaily(QWidget* parent)" of file src/engine/generate_pre.cpp. 5034 5035304--------------------------------------------------------- 5036From jillali elghazoui: 5037 5038(Also suggested by bachiri401 and Benahmed Abdelkrim) 5039 5040In the Add activity dialog, add a check box near Selected (students) list widget. The check box may be called "Activities separately" 5041and, if selected, will add more activities, one for each selected students set. 5042 5043Liviu Lalescu: I am so sorry, but I think it is not a good thing to add in the official version. It will complicate unnecessarily the interface. 5044However, this feature was added in the customized versions for Algeria and Morocco. 5045 5046305-----------------------DONE------------------------------ 5047 5048306--------------------------------------------------------- 5049From Volker Dirr (on forum): 5050 5051Teacher(s) max gaps continuously (a constraint that limits the number of continuous gaps). 5052 5053Liviu Lalescu: seems difficult. But you may use a trick: add a dummy activity with duration 1 for each allowed gap for the teacher, 5054with activity tag "gaps", then make max gaps per week for that teacher 0, then use constraint teacher max hours continuously 5055with activity tag "gaps". 5056 5057Volker Dirr: 5058 5059The workaround is fine for the full time teachers at my school; but it is bad for part time teachers, since the workaround affects 5060also the min/max number of hours per day and also the number of days per week. 5061 5062307--------------------------------------------------------- 5063From math user (on forum): 5064 5065The links to each table (#table_12) are great. 5066The only problem is that the link for a certain teacher changes when another teacher is added or removed. 5067 5068--- 5069 5070Why not keep #table_12 and so on and just make them permanent (associated to a certain teacher, group, room, ...)? 5071Say #table_12 belongs to teacher Abc: The ID #table_12 is stored for this teacher. Suppose the last stored ID is #table_50. 5072Adding a new teacher will result in ID #table_51 being associated with that teacher, and so on. 5073Removing say teacher with ID #table_34 will make no changes, i.e. the next new teacher gets ID #table_52. 5074 5075There should be a setting to change between consecutive IDs (default - as in the current version) and permenent IDs (my suggestion). 5076When switching from permanent to consecutive, all IDs are reallocated when the timetable is generated. 5077 5078--- 5079 5080Liviu Lalescu: 5081 5082Unfortunately, I think this is (very?) complicated. 5083 5084--- 5085 5086Rodolfo Ribeiro Gomes: 5087 5088Maybe a hash of room name? 5089table_roomXXXX where XXXX is a hash? 5090 5091--- 5092 5093Liviu Lalescu: 5094 5095I thought of this, too. But there might appear conflicts, and solving them is not easy. Also, numbers are nicer than a hash value. 5096 5097--- 5098 5099Rodolfo Ribeiro Gomes: 5100 5101Another option is to convert room/subject/teacher/etc. name to URL encoding? Like http://doc.qt.io/qt-5/qurl.html#toPercentEncoding 5102 5103--- 5104 5105Volker Dirr: 5106 5107that will avoid duplicates. 5108advantage is the permanent link. 5109disadvantages are that Arabic (and other) users will have trouble to read it and the file size will grow. 5110 5111--- 5112 5113Liviu Lalescu: 5114 5115I think white spaces should also be encoded, which is not done by default? 5116 5117But I would not like to implement this in the official version. I prefer the numbers, they are much shorter and nicer. And maybe safer. 5118 5119I can add this in the TODO, and if more people ask, I will reconsider. 5120 5121308--------------------------------------------------------- 5122From math user (on forum): 5123 5124He refers to the all time/space constraints dialogs: 5125 5126What about CTRL+F to select Filter and CTRL+G to select Sorted? That would speed up usage (keyboard only - no mouse needed). 5127 5128309--------------------------------------------------------- 5129From Rodolfo Ribeiro Gomes (on forum): 5130 5131Constraint teacher(s) min continous gaps in window (for instance, the teachers should have 6 continuous gaps on a day, for lunch, when 5132the FET time slot corresponds in reality 10 minutes). 5133 5134310--------------------------------------------------------- 5135From Matsumoto (on forum): 5136 5137Is LibreOffice exportation planned? Quite a lot of people I present FET to have little to no knowledge about HTML / CSS editing, so being able 5138to export the timetables in LibreOffice would really help spread FET around my area. 5139 5140See also TODO item #18 5141 5142311--------------------------------------------------------- 5143From Matsumoto (on forum): 5144 5145To help see difficult days/times, FET could have a statistics that shows the amount of available teachers at every period of the timetable, 5146for example, if only teachers A, B, C and D are available at the first hour of every day, I imagine it should show something like: 5147 5148 Day 1 Day 2 Day 3 5149Hour 1 4 4 4 5150Hour 2 6 2 4 5151 5152I filled in random values for hour 2 just to have more detail 5153 5154This should allow the user to quickly spot times where more teachers could be needed before the generation starts. Maybe in addition to the 5155number of teachers also have the names? 5156 5157From Volker Dirr: 5158 5159we can skip this dialog, since it is still too much work to check; it 5160can be improved much more! 5161 5162add a new (locked) feature: 5163"check min teachers per slots (except breaks)" 5164Here a user can enter the number of classes (or: if smaller: the number 5165of courses). 5166 5167Than in generate_pre it is always checked by default if that minimum 5168number is fulfilled or not. 5169 5170Advantage: you don't always need to check manual 5171number_of_slots_per_week every time you added/modified a constraint. You 5172only need to add that number one time and it will always check 5173automatically. 5174 5175312--------------------------------------------------------- 5176From Vangelis Karafillidis: 5177 5178New constraints: 5179 5180Teacher(s) max span per week; 5181Teacher(s) min span per day; 5182Teacher(s) min span per week; 5183Teacher(s) min gaps per day; 5184Teacher(s) min gaps per week; 5185A set of activities has min common time slots with another set of activities ( https://lalescu.ro/liviu/fet/forum/index.php?topic=3101.msg16795#msg16795 ) 5186 5187DONE SINCE FET 5.41.0 on 2019-11-16: Min simultaneous activities from a set in selected time slots. 5188 5189DONE SINCE FET 5.41.0 on 2019-11-16: A set of activities occupies min time slots from a selection. 5190 5191Also suggested by auriolar, on forum: Teacher(s) max span per week. 5192 5193313--------------------------------------------------------- 5194From Silver (on forum): 5195 5196I suggest you add the split and duration in subject window, why we add the split and duration when we add activity for 1st teacher, and for 2nd teacher ... . 5197With this suggestion, we add the splits and duration 1 time for the subject. 5198Exmple: Physics1 have 2 split in the week, so why I add this info in every activity for Physics1?! 5199 5200314--------------------------------------------------------- 5201From Benahmed Abdelkrim and Volker Dirr (on forum): 5202 5203https://lalescu.ro/liviu/fet/forum/index.php?topic=3141.0 5204 52051. Volker Dirr suggests renaming the Algeria and Morocco version to other better names, since they can be used more generally in other countries/institutions. 5206 52072. They suggest to implement some new constraints in the official FET, so that the Algeria and Morocco versions can be simulated by the official FET. 5208 5209Volker Dirr: 5210 5211I think one (maybe) needed is following constraint: 5212constraint teacher is working only in one out of two set of times. 5213 5214So if teachers should work only in the morning or in the evening, you need to add as many constraint as you have got days: 5215the first constraint: 5216 1. set of times contains all morning hours on Monday. 5217 2. set of times contains all evening hours of Monday. 5218 5219the second constraint: 5220similar with Tuesday. 5221... 5222 5223 5224This constraint can be also used to avoid the problem of an other user. I remember a guy with 3 shifts (morning, evening, night). His request was, that a teacher is not allowed to teach the night shift and then the next morning shift. 5225That could be also solved with the constraint above: "constraint teacher is working only in one out of two set of times." 5226So this time he need to setup like this: 5227the first constraint: 5228 1. set of times contains all night hours on Monday. 5229 2. set of times contains all morning hours of Tuesday. 5230 5231the second constraint: 5232... 5233 5234So again as many constraint as you have days (or days-1 if you don't work over weekend). 5235 5236--- 5237 5238Volker Dirr: 5239 5240The other will be the gaps constraints. 5241So a constraint like: 5242"max gaps per day in an interval" and "max gaps per week in an interval" might be maybe enough. 5243 5244So you maybe need to add only 2 constraints: 52451. "max gaps per day in an interval" with the interval : "first hour of of morning" up to "last hour of morning" 52462. "max gaps per day in an interval" with the interval : "first hour of of evening" up to "last hour of evening" 5247 5248--- 5249 5250Benahmed Abdelkrim: 5251 5252I believe it's time to rethink the 2 variants of FET with the official version. 5253This work is feasible by the addition of new time constraints for teachers and students. I myself realized this fact through adding pseudo activities to teachers and student groups. These are considered gaps. I got acceptable timetables with all student groups. But for teachers there was one or two that I have to manually edit. 5254 5255It is while working on the official version that I recently discovered this bug that accelerated the release of version 5.31.5. 5256 5257There was a lot of work to be done, especially for teachers because they did not have the same number of hours per week, and I had to think of teachers one by one. 5258 5259The time was lengthened in this way (of the hours of waiting), which I have now abandoned this project. 5260 5261Now the idea has been raised again but in another way that has encouraged me to intervene here. 5262 5263I believe it is possible to use the official version to realize time tables in the Algerian or Moroccan way. 5264For this purpose it must consider the addition of the following time constraints: 5265 52661. Min hours in a time interval 5267Interval = first hour of morning(or afternoon) - last hour of morning(or afternoon) 52682. max gaps in the last(or first) hour of morning(or afternoon) for students (set) 52693. activity(ies) ends students interval. 5270 5271--- 5272 5273Benahmed Abdelkrim: 5274 5275...So it is possible -in my opinion - to integrate both versions in official FET, reasoning not by day, but by interval. 5276Can open a dialog with the user to define the number of intervals he wants. 5277 5278 for example: 5279Interval1 = first hour of morning - last hour of morning 5280interval2 = first hour of afternoon - last hour of afternoon 5281interval3 = first hour of evening - last hour of evening 5282...etc. 5283And can also define between each interval a constraint of break time. 5284 5285In this way can integrate the time constraints specific to 2 versions customized in official FET. 5286 5287315------------------DONE----------------------------------- 5288 5289316--------------------------------------------------------- 5290From math (on forum): 5291 5292I'm using FET for generating the timetable for the computer science departement of a mid-sized university. In this posting I would like to suggest something that 5293I call "collection of rooms". Since I'm not a native speaker, please feel free to change this term to whatever seems to be appropriate for you. 5294 5295We have a wide variety of rooms in our university, ranging from small meeting rooms or seminar rooms up to large lecture halls for hundreds of students. But it's 5296not only the size of the rooms that is important, it's also the equippment in these rooms. A very important differentiation is the question whether a room is 5297equipped with a chalk board or a white board. While most lecturers prefer white boards, lecturers of math related courses usually prefer chalk boards. 5298 5299At the moment I'm first adding all the activities, then usually selecting all appropriate rooms in "Space->Subjects->A Subject has a set of Preferred Rooms". 5300In case of activities with the same subject but different space requirements, I even have to specify them in "Space->Activities->An Activitiy has a set of 5301Preferred Rooms" for each of these activities. My problem is exactly the following process of assigning rooms. 5302 5303When adding such a constraint in "Add subject preferred rooms", I select the subject on the top of the dialog. Below the subject there are two lists. The list 5304of all available rooms on the left and the list of selected rooms on the right. Now I have to go through the (looooooooong) list of available rooms, selecting 5305all appropriate rooms. Since I can't remember each and every room, I coded relevant information to the name of a room, e.g. "N3-106-C-SPW-50P" for "room 106 5306on third floor of building N", "managed by the Computer science department", "Seminar room equipped with Projector and Whiteboard", "capacity for 50 students". 5307So if I need a mid-sized seminar room, I have to go all through the list, selecting all matching rooms. 5308 5309First, this manual selection of rooms is quite time consuming. Second, there's a good chance of missing an appropriate room. Second is much worse since we suffer 5310a general lack of rooms, so that generating a timetable usually fails due to a lack of rooms. So it would be highly helpful if FET could support me in not missing 5311appropriate rooms. 5312 5313And I would like to suggest a way that should be easy to implement, not demanding any changes to the timetabling algorithm at all. 5314 5315I would like to be able to specify collections, e.g. "Data->Space->Collections". When adding a collection, I would like to specify a name of the collection on 5316the top of the dialog. Below this edit field there could be two list fields (just like in the constraints dialog mentioned above). In the left list there are 5317all the available room, in the right list field there are all the rooms that are part of the collection. This way I would be abe to generate a collection 5318"mid-sized seminar room" with all appropriate rooms. 5319 5320Coming back to the "Space->Subjects->A Subject has a set of Preferred Rooms" dialog. Here, in the left list there are all the available rooms. I beside this 5321list of rooms, I would like to see all collections at the top of the list. This way I could assign a collection to a subject instead of assigning room by room. 5322As a matter of fact, I could also select multiple collections or other rooms. 5323 5324When generating a timetable, these collections could be dissolved by a pre-problem, as Volker called it. A collection is just replaced with the rooms it 5325contains. If multiple collections were selected and a specific room was listed in more than one of these collections, all duplicates are removed from the list. 5326This way the algorithm gets the very same input as before, not requiring any changes here. 5327 5328I would be more than happy if you could add this collection feature to FET. 5329 5330317--------------------------------------------------------- 5331From math (on forum): 5332 5333When preparing a timetable generation I specify a bunch of rooms that are appropriate for a given subject and/or activity. Based in this information FET assigns 5334one of the specified rooms at timetable generation time. However, even though I specify the rooms as appropriate, some of the given rooms are more appropriate 5335than others. 5336 5337For instance lecture halls. Some of them are brand new, some of them not. Since both kinds of lecture halls are ok for a lecture, I specify both of them as space 5338constraint. At generation time FET assigns for room types to the activities since there is no difference from FET's point of view. But when I'm looking to the 5339generated schedule and see that the lecture is assigned to an old lecture hall while a new lecture hall is available at the same time, I would like to be able to 5340manually move the activity from the old lecture hall to the new. 5341 5342I would highly appreciate if such "manual optimization" of rooms would be possible in FET. In fact, this is something that all commercial tools are able to do and 5343the feature that I miss most in FET. 5344 5345In my naive way of looking to FET I don't expect this feature to be difficult in implementation. FET knows which rooms are appropriate for an activity and it 5346knows which of these rooms are already allocated (since the timetable has just been generated). So when right-clicking on an activity in the timetable, a menu 5347option "change room to..." could appear with a sub menu holding all the available alternative rooms. 5348 5349I'd be really happy if you could integrate such functionality and I'm a bit afraid that you say something like "sorry dude, this is out of scope since FET does 5350not focus on post-generation optimization at all". 5351 5352318-------------------DONE since FET-6.0.0------------------ 5353 5354319--------------------------------------------------------- 5355From Vangelis Karafillidis: 5356 5357Two activities are not consecutive. For example A1 and A2 are not consecutive means that FET forces the A2 activity not to be placed immediately after A1. 5358(But A1 may be placed immediately after A2). 5359 5360Vangelis suggested that this can be solved by using a trick: It can be achieved indirectly with pseudo-activities. let's say A1 real activity, 5361P1 pseudo-activity, and A2 real activity. If you want A1 and A2 not to be consecutive, you can demand A1 and P1 to be consecutive and A2 not to overlap with P1. 5362 5363320--------------------------------------------------------- 5364From Volker Dirr: 5365 5366get rid of max_days_per_week and max_hours_per_day. 5367one needed step for that is redisigning the interface, since the 5368interface use it. 5369it won't be too difficult to fix that. 5370just add hours per day and days per week as a QStringList (like teacher 5371names, subject names, ...) 5372this dialog should get buttons like in teachers, rooms, subjects, ... 5373so add a button with "up" and "down" to move the name. 5374"rename" 5375"clear all" 5376"delete" 5377"add" 5378 5379the hours per day dialog should maybe also get a button with a spinbox 5380to add X names at once. 5381Like name "1", "2", ... 5382or "1.", "2.", ... 5383or ... 5384 5385the days per week dialog should get 3 buttons like: 5386"add Monday to Friday" (so it add those 5 days. if you press that button 5387again, it should add once again. so there will be 10 days added (maybe 5388with an attached small string). 5389"add Monday to Saturday" 5390"add Monday to Sunday" 5391"add From a date To a date" So you can select 2 calender dates and it 5392just add all that dates. 5393 5394321--------------------------------------------------------- 5395From Vangelis Karafillidis: 5396 5397These new views of FET (teachers/students time horizontal) for modifying an existing timetable seem to work very well. Some more suggestions mainly for facilitating 5398the modifications of an existing timetable... The code actually exists! Just to be "connected" to these windows (views). 5399Teachers view: 54001) When right-clicking on the name of a teacher (left column), a menu opens. The options are the constraints (time, room, etc) for the specific teacher. For example, 5401teacher available times, max days per week, home room etc. 54022) When right-clicking on an activity (in the timetable), a menu with two sub-menus opens. The first sub-menu has the options of modifying the specific activity. 5403The second sub-menu is actually all the of the time constraints for the specific activity (for example an activity has a preferred starting time, etc). 5404Students view:The corresponding options for the students, as mentioned above. 5405 5406I think that the above are necessary. Of course ALL the existing options for the teachers, students etc might be displayed in these menus, when right-clicking. 5407For example, modifying the data (teacher name, etc). THIS WOULD BE MUCH BETTER, SO ONE COULD MAKE MODIFICATIONS ON ALL FET FIELDS WITHOUT EXISTING THESE WINDOWS. 5408But, I don't know how complicated this part is. I have no C++ programming skills, but it seems easy. 5409The above suggested options focus on MODIFYING AN EXISTING TIMETABLE WHICH IS A COMMON PRACTICE IN REAL LIFE SITUATIONS AT SCHOOLS. I KNOW AND I ACCEPT THAT 5410MATHEMATICALLY AND COMPUTATIONALLY MODIFYING AN EXISTING TIMETABLE IT'S NOT THE BEST APPROACH. 5411 5412Liviu Lalescu: 5413 5414Your suggestions are not so easy to implement. 5415 5416322--------------------------------------------------------- 5417From Vangelis Karafillidis: 5418 5419After testing the new display (mainly teachers time horizontal) for partially modifying an existing timetable, I thought of a suggestion. Most likely, it's 5420similar to "remove redundant constraints". The suggestion is to add a (percentage) multiplication factor for each one of the "groups" or time constraints. 5421This means that the user should be able to add a different multiplication factor for each one of the following groups of constraints: Teachers' time constraints 5422(for example 98%) Students' time constraints (for example 90%) Activities time constraints (for example 20%) This would affect ONLY the constraints that can have 5423weight (percentage) less than 100%. For example, teachers not available times can have ONLY 100% as a percentage. These constraints are not going to be affected. 5424But, all the other constraints (for example: teachers max gaps per day, max hours continuously) are going to be affected since they are going to be multiplied 5425by this factor. For example if there is a constraint for the TEACHER_1 such as max hours continuously = 3, weight = 100%, it is going to be now 98%. 5426If there is a constraint teacher max gaps per day = 1, weight = 98%, the new weight would become 96,04% (98%x98%). This should (more or less) relax these 5427constraints, so a temporary timetable is going to be solvable, with roughly similar (to identical) characteristics to the initial one. I don't know if the 5428above can be easily coded... It might be difficult.... But this was what I thought for facilitating the generation of a temporary timetable by slightly 5429modifying the existing one. 5430 5431Liviu Lalescu: 5432 5433I do not agree with this idea. But I added it in the TODO. 5434 5435Please note that max gaps per week/day for students/teachers constraints can only have 100% weight. 5436 5437323--------------------------------------------------------- 5438From Vangelis Karafillidis: 5439 5440He suggests that all the constraints teacher not available could be presented in a teachers time horizontal manner (teacher as row, day+hour as column). 5441 5442Further suggestions: 5443 5444Generally speaking, the interaction with the GUI is crucial. Most users need easiness in entering and modifying data and of course a good monitoring of them. 5445Under this perspective, I'm suggesting the following enhancements regarding the GUI of FET, which -in no case- have any connection with drag-and-drop-like features. 5446Teacher's not available times: The teachers time horizontal view would be much more flexible 5447a) The user could monitor at once all teachers 5448b) The user could easily modify this constraint for more than one teachers at once. For example, if a group of teachers (the mathematicians) should finish their 5449lessons the latest on the 4th hour on Monday, the user could easily select these "cells" (time slots) and enter his/her data. In the same way, when all teachers 5450are not available (for example) for the last hour of Monday (this happens at the beginning of the school year at Greek schools, because many teachers are "missing", 5451and therefore schools don't "expand" their timetables until the last hour of each day), the user could easily select the entire column at once and make all teachers 5452not available for this specific hour. 5453Student's not available times:For similar reasons the time horizontal view is by far more flexible. 5454Please bear in mind that with the existing FET GUI the user needs severely more time in order to complete these tasks. Also, it's really hard for the user to monitor 5455his/her data efficiently (with the existing GUI). 5456 5457Interaction of the above "dialogues" with statistics: An example for the teachers: Let's suppose that a teacher teachers for 20 hours per week (this is the most 5458typical situation at Greek schools). The user might accidentally make this teacher available for a very small number of hours, and therefore the timetable generation 5459might become impossible. I suggest to add two columns (in this time horizontal view) right to the teachers' names. The first column should take the number of activities 5460(from the statistics) and the second column should display the number of available hour of this teacher. This (second column) should be "interactive", i.e. when the user 5461adds or removes an hour, this number should change. 5462An example for the students: The same for the students... 5463 5464Similar interactions might be useful for the space constraints, but since I've never had such constraints in my timetables, I can't judge and suggest what would work 5465better than the existing displays of FET. Most likely, the room's not available times works better in the time horizontal view, so the user will have complete control 5466on his/her data. 5467 5468For rooms not available times constraints, since a room may have weight <100%, Vangelis proposes this: By default, the cell should take the weight 100%, and if one 5469needs something different, right click and a dialogue with the new weight and instead of "X" for rooms you might display the percentage itself in red color. 5470 5471324--------------------------------------------------------- 5472From Rodolfo Ribeiro Gomes (on forum): 5473 5474Add short names for teachers (and maybe students, subjects, activity tags, rooms). 5475 5476See also item #199. 5477 5478325--------------------------------------------------------- 5479From Darren McDonald (on forum): 5480 5481I thought I'd make a few feature feature requests that may be useful (at least they would be useful to me! :) ). This one is the more difficult of the two. 5482 5483I've often got a group of activities that need to have the same starting time, for example 5484 5485Mathematical Studies 1 (1+1+1) 5486Mathematical Studies 2 (1+1+1) 5487Mathematics SL 1 (1+1+1) 5488Mathematics SL 2 (1+1+1) 5489Mathematics HL (1+1+1+1) 5490 5491I can use Time>Activities>A set of activities has same starting time (day+hour), but this requires three separate entries (one for the first subactivity of 5492each subject, one for the second subactivity, and one for the third, with the final Mathematics HL subactivity left free), where each constraint involves 5493a list of 5 subactivities (which increases the possibility of error). 5494 5495Is it possible to introduce a new time constraint that would allow me to constrain, for example, the first n activities of a group of activities? Essentially, 5496I'd like to be able to specify the time constraint(s) above in a single step: providing FET with the relevant activity sets, and then specify that (in this case) 5497the first 3 subactivities should have the same start time (day+hour). 5498 5499326--------------------------------------------------------- 5500From Darren McDonald (on forum): 5501 5502When creating timetables for students in the final two years of high school, I typically use student names as Groups. Within the first couple of months 5503(particularly in International Baccalaureate Diploma Programme schools), there are often a number of changes as students change subject choices. 5504 5505It would be easier to find student names (to remove them from one activity group, then add them to another) if there were a button that would allow me to sort 5506the selected groups from the Modify Activity screen (perhaps below the Clear button?). 5507 5508327--------------------------------------------------------- 5509From Zsolt Udvari (on forum): 5510 5511Add a subject tag for each subject (like: "easy" or "hard") and add time constraints for these subject tags. 5512 5513328--------------------------------------------------------- 5514From Valdo (on forum): 5515 5516Export the resulted timetables in time horizontal form. 5517 5518329-----------------------DONE------------------------------ 5519 5520330--------------------------------------------------------- 5521From Volker Dirr: 5522 5523Maybe this is a good time to restart coding csv stuff. 5524my old csv stuff was very "powerful" and "compressed", but sadly also 5525very bad "expandable"/(coded). 5526also other guys asked for exporting other time constraints. nearly 5527impossible to add that into the old code. 5528 5529so i suggest this: 5530- we keep the old csv stuff, so everyone can still use this "powerful" 5531feature. it will be also stable (never change the file format anymore). 5532- we add a new csv export (and also import). maybe call it "version 2" 5533or "beta" or "experimental" or ... 5534- the new code will NOT be able to select the order of the fields (and 5535also not be able to select headers, textquotes and field separator; even 5536i will do that maybe in the source) 5537- the first version will be similar to the current default export. so 5538just code simplification. 5539- then i will have got the chance to add new features into that code 5540(like exporting other constraints) 5541 5542331--------------------------------------------------------- 5543From Zsolt Udvari (on forum): 5544 5545My days originally have had 7 hours. The school said a thing and I thought I should include a plus hour, before the original 7 hours. 5546I added it (0. hour) and I saw the hour of all time constraints updated: increased by 1. 5547I know many times it's a good feature but in my case (I've record all activities, time constraints) hasn't increase. My 0. hour is like a virtual hour. 5548 5549Now I can manually rewrite the .fet file but I think it would be nice when user can disable this feature - maybe FET ask about it the user when add later 5550(means there are time constraints) a new hour. 5551 5552332--------------------------------------------------------- 5553From Zsolt Udvari (on forum): 5554 5555Maybe a user error (PEBKAC) but I think I share it. 5556 5557So I've a little complicated FET-file and it seems the "An activity has a preferred starting time" doesn't work. 5558 5559I attached the file and try to generate and check: 5560 5561 Nr. 895 and 896 activities (without any teacher and student) 5562 They have preferred starting time: "Szerda 1." (Wednesday) and "Hétfő 3." (Monday) with 100% 5563 They have same starting time (day+hour) with 7 other activites (for example 647 and 648) 5564 Generate (without success) 5565 Check the student's timetable, go to "11A" and the 647 is on "Péntek" (Friday)! 5566 5567333--------------------------------------------------------- 5568From Valdo (on forum): 5569 5570A new addition to Spreading activities uniformly in the week for activities split in to 2 components: 5571 5572Constraints max days between activities (2 components) with the possibility to select max days and weight. 5573 5574334--------------------------------------------------------- 5575From Zsolt Udvari (on forum): 5576 5577I try to find the impossible constraint(s) in my FET-file and I think it's uncomfortable that only on "Time/All" dialog can activate/deactivate the constraints. 5578I think it would be nice when can activate/deactivate for example on "An activity has a preferred starting time" dialog (and on the others too). 5579 5580335--------------------------------------------------------- 5581From Volker Dirr: 5582 5583There are not many variables to mutex in the generation.cpp. So it will 5584be faster to use std::atomic or QAtomic command instead of using mutex. 5585(The atomic commands will do a mutex if the cpu doesn't support atomic 5586operations. so cpus without atomic support won't generate faster, but 5587other cpus will.) 5588 5589336--------------------------------------------------------- 5590From Benahmed Abdelkrim (on forum): 5591 5592Constraint min working hours in an interval. 5593 5594This constraint is very useful in many situations such as, for example, not bringing a teacher (or all teachers) for a single hour in a given interval. 5595 5596337--------------------------------------------------------- 5597From Fernando A F Lordão (on forum): 5598 5599After testing the new feature (showing the number of assigned hours for teachers and students in the HTML statistics of the timetables) I figured out about 5600another situation that occurs in my institution. 5601Here we have a rule that recommends coordinators not to assign more than three different subjects to one teacher. Sometimes it occurs, but it's not the ideal scenario. 5602So, I thought about including two more columns in the statistics file: 5603* "Total of Activities" 5604* "Different Subjects" (counting different string description of the subjects assigned to the teacher) 5605 5606338--------------------------------------------------------- 5607From mercurialuser (on forum): 5608 5609I'd like to have fet-cl write the highest timetable without stopping the program. I'm getting 63x out of 639 activity placed and so I'd like to see what it is 5610happening, which activity is blocked by which constraint, etc etc.. 5611 5612It would be nice to be able to load the saved partial timetable and restart the search from that point... of course, I'd modify the constraints to be able to 5613place the remaining activities... 5614 5615Liviu Lalescu: 5616 5617For part 1) It is difficult, because I cannot rely on more signals. I already use SIGTERM. 5618 5619But I think you can safely interrupt the generation with SIGTERM and get the highest stage timetable. It would not be useful to continue the generation. 5620If you change a constraints, the whole procedure changes (see your second request and my answer, below). You can see the initial activities order in the 5621logs, and the maximum placed activities. The next one after the maximum placed is problematic. 5622 5623For part 2) This would not be possible. If you modify the constraints, the whole thing is changed. 5624 5625339--------------------------------------------------------- 5626From Roberto Bergonzini: 5627 5628Manual timetabling - drag and drop. 5629 5630Just make a timetable view teachers, keeping only the free days and the not available constraints for the teachers. 5631 5632Also suggested by mercurialuser. 5633 5634Forum link: https://lalescu.ro/liviu/fet/forum/index.php?topic=3461.0 5635 5636340--------------------------------------------------------- 5637From Emiliano Llano Díaz: 5638 5639Improvement suggestion: Is a nag that each time you open FET it does not "remember" the file it was working on (I know it is just 2 clicks away on 5640file->open recent, but... you know humans are lazy ) 5641 5642341--------------------------------------------------------- 5643From mohammed (on forum): 5644 5645Nous voulons ajouter la fonction de sauvegarde automatique du programme, en cas de travail, l'alimentation s'éteint 5646 5647(We would like to add the function of automatic save of the program, in case of work, the power goes off). 5648 5649342--------------------------------------------------------- 5650From Vangelis Karafillidis: 5651 5652All students must respect the maximum number of span (in hours) per day -> better write: 5653 5654All students must respect the maximum span (in number of hours) per day. 5655 5656Circular -> better write: Circularly. 5657 5658343--------------------------------------------------------- 5659From Rodolfo Ribeiro Gomes: 5660 5661What do you think about leaving the version number and date out of 5662HelpAboutForm_template.ui ? 5663Maybe leaving a placeholder there, and making use of FET_VERSION and a 5664l10n version of date. 5665 5666That will reduce .ts diff a lot and reduces translator efforts ;) 5667 5668344--------------------------------------------------------- 5669From V Paul C Charlesraj (on forum): 5670 5671Minimum number of days in a week for all students. 5672 5673Liviu: 5674 5675Or for a students set. This is very difficult to implement perfectly (to take care of combinations with the other constraints). 5676 5677345--------------------------------------------------------- 5678From Rodolfo Ribeiro Gomes: 5679 5680(referring to translation of plural forms) 5681 5682I also saw this in daysform.cpp : 5683 5684 if(cnt_rem>0){ 5685 s+=tr("%1 constraints will be removed.", "%1 is the number 5686of constraints").arg(cnt_rem); 5687 s+=" "; 5688 } 5689 if(cnt_mod>0){ 5690 s+=tr("%1 constraints will be modified.", "%1 is the 5691number of constraints").arg(cnt_mod); 5692 s+=" "; 5693 } 5694 s+=tr("Do you want to continue?"); 5695 5696Maybe this part could use %n too? 5697 5698Liviu Lalescu: 5699 5700Yes, it should, also in hoursform.cpp and also in 5701alltime/spaceconstraintsform.cpp. 5702 5703But I think there are plenty of places to modify and it is really too 5704much. But I'll think of it. 5705 5706Problem: see for instance alltimeconstraintsform.cpp: 5707 5708 constraintsTextLabel->setText(tr("%1 / %2 time constraints", 5709 "%1 represents the number of visible active time constraints, %2 represents the total number of visible time constraints") 5710 .arg(n_active).arg(visibleTimeConstraintsList.count())); 5711 5712Which is %n? %1 or %2? 5713 5714Also advancedlockunlockform.cpp: 5715 5716 QMessageBox::information(&lastConfirmationDialog, tr("FET information"), tr("There were removed %1 locking time constraints and" 5717 " %2 locking space constraints. There were not removed %3 locking time constraints and %4 locking space constraints, because" 5718 " these activities were permanently locked").arg(removedTime).arg(removedSpace).arg(notRemovedTime).arg(notRemovedSpace)); 5719 5720It is very difficult. 5721 5722I am sorry, but the code is full of such mistakes. It is too late now 5723to correct. 5724 5725Rodolfo Ribeiro Gomes: 5726 5727Difficult indeed. 5728 5729The only way out I can see would be replace: 5730 5731"There were removed %1 locking time constraints and %2 locking space 5732constraints. There were not removed %3 locking time constraints and %4 5733locking space constraints, because these activities were permanently 5734locked" 5735 5736by: 5737 5738"There were removed %1 and %2. There were not removed %3 and %4, 5739because these activities were permanently locked" 5740where %1 would be "%n locking time constraint(s)", etc. 5741 5742346--------------------------------------------------------- 5743From Taro Tada: 5744 5745Either allow two or more users to work concurrently on a unique FET file, or allow the merging of two or more .fet files. 5746 5747347--------------------------------------------------------- 5748From bachiri401 (on forum): 5749 5750For all students sets subject Sport cannot be followed immediately by a hard subject like Math. 5751 5752Liviu and Rodolfo Ribeiro Gomes: 5753 5754Constraint two activities not consecutive (to say that the situation A1, then immediately A2 is forbidden, any 5755other situation is acceptable). 5756 5757348--------------------------------------------------------- 5758From Fernando A F Lordão (on forum): 5759 5760I would suggest the use of the current filter values as default values when the user presses the "Add" button for constraints. 5761 5762For instance, I noticed the importance of this when I was inserting teachers time constraints (SCREEN "Constraints teacher not available times"). Let me explain... 5763 5764As I had many constraints already set inherited from the previous semester, I was firstly filtering by name and modifying the preferences previously saved. 5765At this moment, when I was filtering by a given name and that name had NO constraints yet, I was forced to "Add" a new constraint to that teacher and several 5766times I included the constraint with the first name on the list, having so to step back and remove the wrong constraint. 5767 5768I think this mistake happens because our brain thinks: "I have already chosen the name", but it does NOT take into account that it was on the previous screen. 5769So, how about we give a hand to the brain and inherit the values from filters to the next "Add" screen. 5770 5771349--------------------------------------------------------- 5772From Benahmed Abdelkrim (on forum): 5773 5774He complains that if a constraint min days between activities has consecutive if same day unselected, there can be 3 activities on the same day 5775(or real day, for the custom Morocco and Algeria versions). 5776 5777Volker Dirr suggests to add a Boolean setting for the min days between activities constraints, so that only 2 activities are allowed on the same day 5778if this value is true. 5779 5780350--------------------------------------------------------- 5781From aisse (on forum): 5782 5783I think the program can be improved better if the restrictions are in the form of buttons .. For example, the Algerian version of the middle schools we 5784need some restrictions only .. I think the format of the program in its Algerian version will be better and easier by buttons pre-programmed .. Where all 5785buttons are in one interface as long Their number will be small in the Algerian version 5786 5787For example, we say the Algerian version.. but in reality there are many types of schools and every type what needs. There are middle schools, secondary 5788schools, primary schools, private schools ..and institutes of very different types. The constraints in the Algerian version are general to all. But when we 5789come to the privacy of each school, each one needs constraints and it does not need another .. I work in a middle school, I only need some constraints which 5790can all be put in one interface .. 5791 5792Liviu Lalescu: So you need a customisable interface (where you can add/remove buttons from the interface)? 5793 5794aisse: Not exactly .. I suggested reducing the version .. to become " FET for Algerian middle schools...The buttons are fixed. 5795 5796351--------------------------------------------------------- 5797From Benahmed Abdelkrim (on forum): 5798 5799in the list of conflicts why not specify the names of hours with the days 5800ex: ... activity (A1) is in conflict with activity (A2) in Tuesday (2) and Tuesday (4) ... 5801 5802the numbers (2) and (4) are the names given by the user at the hours. 5803 5804one of the advantages of this suggestion is to know if the activities are consecutive or not. 5805 5806Volker Dirr: You also need to see the duration, because you can only know then if they are 5807consecutive or not. 5808 5809352--------------------------------------------------------- 5810From Volker Dirr (on forum): 5811 5812There are constraints like max hours daily or interval max days per week which allow their data to be redundant (they allow n_hours_per_day or 5813n_days_per_week), and other constraints, like min days between activities, which don't allow their data to be redundant (they allow only 5814n_days_per_week-1). 5815 5816Volker suggests to allow only non-redundant data (like min days between activities constraints). 5817 5818353--------------------------------------------------------- 5819From Volker Dirr: 5820 5821add a warning before generating (generate_pre.cpp): 5822check min days between activities constraints: 5823if ((number_of_activities.count() > 2*days_per_week) && 5824forceConsecutive.isEnabled()) => IMPOSSIBLE 5825 5826354--------------------------------------------------------- 5827From Volker Dirr: 5828 5829If there are activities in a constraint activities same starting 5830time and an activity is forbidden a time slot, then all the others are 5831also forbidden this time slot. 5832 5833Liviu: It might not be critical, as activities with same starting time constraints are placed one near the other in the initial order 5834(problems might arise only if the user uses the advanced option "Group activities in the initial order"). 5835 5836355--------------------------------------------------------- 5837From Volker Dirr: 5838 5839If an activity A has preferred room R and R is not available 5840on some time slots, make A not available on these time slots. 5841 5842(See also item #356.) 5843 5844356--------------------------------------------------------- 5845From Volker Dirr: 5846 5847Take care of this potential problem: If an activity 5848A with duration >=2 has preferred two rooms, and in 5849the first hour R1 is available but R2 not, then in the second hour R2 is 5850available but R1 not, A is impossible to place. 5851 5852(See also item #355.) 5853 5854357--------------------------------------------------------- 5855From Volker Dirr: 5856 5857The order of the activities are not always good. activities with a 5858very low number of available slots might be much too late in the order. 5859(for example pseudo activities "lunch".) 5860 5861358--------------------------------------------------------- 5862From Volker Dirr: 5863 5864Care about not available times if activities are consecutive. 5865 5866Volker: the code might look like the attached (be careful: not tested much 5867yet; so it might contain still bugs) 5868//NEW Variant (start) 5869 foundImprovement=0; //TODO:delete 5870 bool addImprovement=true; 5871 //care about consecutive by Volker Dirr 5872 //TODO: same starting time and consecutive might effect each other. so 5873repeat both as long as something changed?! 5874 //DO THIS AS LAST 5875 while(addImprovement){ 5876 addImprovement=false; 5877 for(int i=0; i<gt.rules.nInternalTimeConstraints; i++){ 5878 if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_2_ACTIVITIES_CONSECUTIVE){ 5879 Constraint2ActivitiesConsecutive* 5880c2=(Constraint2ActivitiesConsecutive*)gt.rules.internalTimeConstraintsList[i]; 5881 if(gt.rules.internalTimeConstraintsList[i]->weightPercentage==100.0){ 5882 //if firstActivity or secondActivity has a same starting time, then 5883it must be recheeckt?! 5884 int firstActivity=c2->firstActivityIndex; 5885 int secondActivity=c2->secondActivityIndex; 5886 for(int d=0; d<gt.rules.nDaysPerWeek; d++){ 5887 //get times 5888 int firstPeriodOfFirstActivity=-1; 5889 int lastPeriodOfFirstActivity=gt.rules.nHoursPerDay-1; 5890 int firstPeriodOfSecondActivity=-1; 5891 int lastPeriodOfSecondActivity=gt.rules.nHoursPerDay-1; 5892 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 5893 int currentTime=d+h*gt.rules.nDaysPerWeek; 5894 if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){ 5895 if(firstPeriodOfFirstActivity==-1) 5896 firstPeriodOfFirstActivity=h; 5897 lastPeriodOfFirstActivity=h; 5898 } 5899 if(notAllowedTimesPercentages[secondActivity][currentTime]!=100){ 5900 if(firstPeriodOfSecondActivity==-1) 5901 firstPeriodOfSecondActivity=h; 5902 lastPeriodOfSecondActivity=h; 5903 } 5904 } 5905 assert(lastPeriodOfFirstActivity<gt.rules.nHoursPerDay); 5906 assert(lastPeriodOfSecondActivity<gt.rules.nHoursPerDay); 5907 assert(lastPeriodOfFirstActivity>=firstPeriodOfFirstActivity); 5908 assert(lastPeriodOfSecondActivity>=firstPeriodOfSecondActivity); 5909 5910 int durationFirstActivity = 5911gt.rules.internalActivitiesList[firstActivity].duration; 5912 5913 if((firstPeriodOfFirstActivity>=0) && 5914(firstPeriodOfSecondActivity>=0)){ 5915 if(lastPeriodOfFirstActivity==lastPeriodOfSecondActivity){ 5916 lastPeriodOfFirstActivity--; 5917 } else 5918 if(lastPeriodOfFirstActivity>lastPeriodOfSecondActivity){ 5919 lastPeriodOfFirstActivity=lastPeriodOfSecondActivity-1; 5920 } 5921 else { 5922 int numberOfFollowingBreaks=0; 5923 for(int i=lastPeriodOfFirstActivity+1; 5924i<=lastPeriodOfSecondActivity; i++){ 5925 if(!breakDayHour[d][i]){ 5926 break; 5927 } 5928 numberOfFollowingBreaks++; 5929 } 5930 if(firstPeriodOfFirstActivity+durationFirstActivity+numberOfFollowingBreaks>lastPeriodOfSecondActivity){ 5931 firstPeriodOfFirstActivity=-1; 5932 firstPeriodOfSecondActivity=-1; 5933 } else { 5934 if(lastPeriodOfSecondActivity>lastPeriodOfFirstActivity+durationFirstActivity+numberOfFollowingBreaks){ 5935 lastPeriodOfSecondActivity=lastPeriodOfFirstActivity+durationFirstActivity+numberOfFollowingBreaks; 5936 assert(!breakDayHour[d][lastPeriodOfSecondActivity]); 5937 } 5938 } 5939 } 5940 5941 /*if(lastPeriodOfFirstActivity<firstPeriodOfFirstActivity 5942 || lastPeriodOfSecondActivity<firstPeriodOfSecondActivity 5943 || firstPeriodOfFirstActivity>firstPeriodOfSecondActivity 5944 || lastPeriodOfFirstActivity>lastPeriodOfSecondActivity){ 5945 QMessageBox::warning(nullptr, QObject::tr("FET warning"), 5946QObject::tr("F1=%1 L1=%2 F2=%3 5947L2=%4").arg(firstPeriodOfFirstActivity).arg(lastPeriodOfFirstActivity).arg(firstPeriodOfSecondActivity).arg(lastPeriodOfSecondActivity)); 5948 }*/ 5949 5950 assert(lastPeriodOfFirstActivity<gt.rules.nHoursPerDay); 5951 assert(lastPeriodOfSecondActivity<gt.rules.nHoursPerDay); 5952 //assert(firstPeriodOfFirstActivity<=firstPeriodOfSecondActivity); 5953// not correct that this position, correction is following now 5954 assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity); 5955 5956 if((firstPeriodOfFirstActivity>=0) && 5957(firstPeriodOfSecondActivity>=0)){ 5958 if(firstPeriodOfFirstActivity==firstPeriodOfSecondActivity){ 5959 firstPeriodOfSecondActivity+=durationFirstActivity; 5960 assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity); 5961 } else 5962 if(firstPeriodOfFirstActivity>firstPeriodOfSecondActivity){ 5963 firstPeriodOfSecondActivity=firstPeriodOfFirstActivity+durationFirstActivity; 5964 assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity); 5965 } 5966 else { 5967 int numberOfFollowingBreaks=0; 5968 for(int i=firstPeriodOfSecondActivity-1; 5969i>=firstPeriodOfFirstActivity; i--){ 5970 if(!breakDayHour[d][i]){ 5971 break; 5972 } 5973 numberOfFollowingBreaks++; 5974 } 5975 assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity); 5976 if(lastPeriodOfSecondActivity-durationFirstActivity-numberOfFollowingBreaks<firstPeriodOfFirstActivity){ 5977 firstPeriodOfFirstActivity=-1; 5978 firstPeriodOfSecondActivity=-1; 5979 } else { 5980 if(firstPeriodOfFirstActivity<firstPeriodOfSecondActivity-durationFirstActivity-numberOfFollowingBreaks){ 5981 firstPeriodOfFirstActivity=firstPeriodOfSecondActivity-durationFirstActivity-numberOfFollowingBreaks; 5982 assert(!breakDayHour[d][firstPeriodOfFirstActivity]); 5983 } 5984 } 5985 } 5986 } 5987 assert(lastPeriodOfFirstActivity<gt.rules.nHoursPerDay); 5988 assert(lastPeriodOfSecondActivity<gt.rules.nHoursPerDay); 5989 assert(firstPeriodOfFirstActivity<=firstPeriodOfSecondActivity); 5990 assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity); 5991 if( lastPeriodOfFirstActivity<firstPeriodOfFirstActivity 5992 || lastPeriodOfSecondActivity<firstPeriodOfSecondActivity 5993 || firstPeriodOfFirstActivity>=lastPeriodOfSecondActivity 5994 || 5995firstPeriodOfFirstActivity+durationFirstActivity>lastPeriodOfSecondActivity 5996 || 5997lastPeriodOfSecondActivity-durationFirstActivity<firstPeriodOfFirstActivity){ 5998 firstPeriodOfFirstActivity=-1; 5999 firstPeriodOfSecondActivity=-1; 6000 } 6001 } 6002 6003 /*if(lastPeriodOfFirstActivity<firstPeriodOfFirstActivity 6004 || lastPeriodOfSecondActivity<firstPeriodOfSecondActivity 6005 || firstPeriodOfFirstActivity>firstPeriodOfSecondActivity 6006 || lastPeriodOfFirstActivity>lastPeriodOfSecondActivity){ 6007 QMessageBox::warning(nullptr, QObject::tr("FET warning"), 6008QObject::tr("F1=%1 L1=%2 F2=%3 6009L2=%4").arg(firstPeriodOfFirstActivity).arg(lastPeriodOfFirstActivity).arg(firstPeriodOfSecondActivity).arg(lastPeriodOfSecondActivity)); 6010 }*/ 6011 6012//lastPeriodOfFirstActivity>firstPeriodOfSecondActivity 6013 6014 if((firstPeriodOfFirstActivity<0) || 6015(firstPeriodOfSecondActivity<0)){ 6016 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 6017 int currentTime=d+h*gt.rules.nDaysPerWeek; 6018 if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){ 6019 notAllowedTimesPercentages[firstActivity][currentTime]=100; 6020 addImprovement=true; 6021 foundImprovement++; //TODO delete this 6022 } 6023 if(notAllowedTimesPercentages[secondActivity][currentTime]!=100){ 6024 notAllowedTimesPercentages[secondActivity][currentTime]=100; 6025 addImprovement=true; 6026 foundImprovement++; //TODO delete this 6027 } 6028 } 6029 continue; 6030 } 6031 6032 //TODO: only if this happen each day!!! 6033 /*if(lastPeriodOfFirstActivity + durationFirstActivity < 6034firstPeriodOfSecondActivity){ 6035 QMessageBox::warning(nullptr, QObject::tr("FET warning"), 6036QObject::tr("Activity %1 and Activity %2 can't be 6037consecutive.").arg(gt.rules.internalActivitiesList[firstActivity].id).arg(gt.rules.internalActivitiesList[secondActivity].id)); 6038 } 6039 6040 6041 if(firstPeriodOfSecondActivity - durationFirstActivity < 0){ 6042 QMessageBox::warning(nullptr, QObject::tr("FET warning"), 6043QObject::tr("*Activity %1 and Activity %2 can't be 6044consecutive.").arg(gt.rules.internalActivitiesList[firstActivity].id).arg(gt.rules.internalActivitiesList[secondActivity].id)); 6045 QMessageBox::warning(nullptr, QObject::tr("FET warning"), 6046QObject::tr("%1 - %2 < 60470").arg(firstPossiblePeriodForSecondActivity).arg(durationFirstActivity)); 6048 }*/ 6049 6050 //lock times of first activity 6051 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 6052 int currentTime=d+h*gt.rules.nDaysPerWeek; 6053 if(h<firstPeriodOfFirstActivity){ 6054 if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){ 6055 notAllowedTimesPercentages[firstActivity][currentTime]=100; 6056 addImprovement=true; 6057 foundImprovement++; //TODO delete this 6058 //QMessageBox::warning(nullptr, QObject::tr("FET warning"), 6059QObject::tr("* Lock day %1 and hour %2 of activity 6060%3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[firstActivity].id)); 6061 } 6062 } else if(h>lastPeriodOfFirstActivity){ 6063 if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){ 6064 notAllowedTimesPercentages[firstActivity][currentTime]=100; 6065 addImprovement=true; 6066 foundImprovement++; //TODO delete this 6067 //QMessageBox::warning(nullptr, QObject::tr("FET warning"), 6068QObject::tr("* Lock day %1 and hour %2 of activity 6069%3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[firstActivity].id)); 6070 } 6071 } else 6072 if(notAllowedTimesPercentages[firstActivity][currentTime]==100 6073&& !breakDayHour[d][h]){ 6074 if(h+1<gt.rules.nHoursPerDay){ 6075 if(notAllowedTimesPercentages[secondActivity][d+(h+1)*gt.rules.nDaysPerWeek]!=100){ 6076 notAllowedTimesPercentages[secondActivity][d+(h+1)*gt.rules.nDaysPerWeek]=100; 6077 addImprovement=true; 6078 foundImprovement++; //TODO delete this 6079 //QMessageBox::warning(nullptr, QObject::tr("FET warning"), 6080QObject::tr("*second* Lock day %1 and hour %2 of activity 6081%3.").arg(d).arg(h-durationFirstActivity).arg(gt.rules.internalActivitiesList[firstActivity].id)); 6082 } 6083 } 6084 } 6085 } 6086 6087 //lock times of second activity 6088 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 6089 int currentTime=d+h*gt.rules.nDaysPerWeek; 6090 if(h<firstPeriodOfSecondActivity){ 6091 if(notAllowedTimesPercentages[secondActivity][currentTime]!=100 6092&& !breakDayHour[d][h-1]){ 6093 notAllowedTimesPercentages[secondActivity][currentTime]=100; 6094 //QMessageBox::warning(nullptr, QObject::tr("FET warning"), 6095QObject::tr("** Lock day %1 and hour %2 of activity 6096%3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[secondActivity].id)); 6097 addImprovement=true; 6098 foundImprovement++; //TODO delete this 6099 } 6100 } else if(h>lastPeriodOfSecondActivity){ 6101 if(notAllowedTimesPercentages[secondActivity][currentTime]!=100){ 6102 notAllowedTimesPercentages[secondActivity][currentTime]=100; 6103 //QMessageBox::warning(nullptr, QObject::tr("FET warning"), 6104QObject::tr("*** Lock day %1 and hour %2 of activity 6105%3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[secondActivity].id)); 6106 addImprovement=true; 6107 foundImprovement++; //TODO delete this 6108 } 6109 } else 6110 if(notAllowedTimesPercentages[secondActivity][currentTime]==100 6111&& !breakDayHour[d][h]){ 6112 if(h-durationFirstActivity>=0){ 6113 if(notAllowedTimesPercentages[firstActivity][d+(h-durationFirstActivity)*gt.rules.nDaysPerWeek]!=100){ 6114 notAllowedTimesPercentages[firstActivity][d+(h-durationFirstActivity)*gt.rules.nDaysPerWeek]=100; 6115 addImprovement=true; 6116 foundImprovement++; //TODO delete this 6117 //QMessageBox::warning(nullptr, QObject::tr("FET warning"), 6118QObject::tr("*first* Lock day %1 and hour %2 of activity 6119%3.").arg(d).arg(h+durationFirstActivity).arg(gt.rules.internalActivitiesList[secondActivity].id)); 6120 } 6121 } 6122 } 6123 } 6124 } 6125 } 6126 } 6127 } 6128 } 6129 //end Volker 6130 6131359--------------------------------------------------------- 6132From Volker Dirr: 6133 6134Care about not available times if activities are grouped (2 or 3). 6135 6136360--------------------------------------------------------- 6137From Volker Dirr: 6138 6139Care about not available times if students early, no gaps and max hours per day. 6140 6141361--------------------------------------------------------- 6142From Volker Dirr: 6143 6144The following code should be nearly perfect for CONSTRAINT_ACTIVITIES_SAME_STARTING_DAY and CONSTRAINT_ACTIVITIES_SAME_STARTING_HOUR. 6145(For example 2 activities with CONSTRAINT_ACTIVITIES_SAME_STARTING_DAY. 6146A1 only available at one day in the first hour and A2 is also available 6147at the same day also not the same hour and A1 is conflicting with A2, 6148then my code won't see that it is possible to disallow that hour also. 6149 6150but I think that these are very very unlikely and special cases. I don't know 6151if something like that is in a real dataset and if it is useful to 6152search for such improvements, since those are more critical to detect. 6153This can be also improved if you care about duration.) 6154 6155The code also includes simplified speedups for CONSTRAINT_TWO_ACTIVITIES_GROUPED, CONSTRAINT_TWO_ACTIVITIES_CONSECUTIVE and CONSTRAINT_THREE_ACTIVITIES_GROUPED. 6156These constraints can still be improved. 6157 6158Before computeFixedActivities in generate_pre it is useful to disallow days and hours that can't be available: 6159 6160QList<QSet<int>> activitiesListWithDayNotAvailableSet; 6161QList<QSet<int>> activitiesListWithHourNotAvailableSet; 6162for(int ai=0; ai<gt.rules.nInternalActivities; ai++){ 6163 QSet<int> dayNotAvailable; 6164 activitiesListWithDayNotAvailableSet<<dayNotAvailable; 6165} 6166for(int ai=0; ai<gt.rules.nInternalActivities; ai++){ 6167 QSet<int> hourNotAvailable; 6168 activitiesListWithHourNotAvailableSet<<hourNotAvailable; 6169} 6170bool notAvailableFound=computeDayOrHourNotAvailable(&activitiesListWithDayNotAvailableSet, &activitiesListWithHourNotAvailableSet); 6171 6172while(notAvailableFound){ 6173 setNotAvailable(&activitiesListWithDayNotAvailableSet, &activitiesListWithHourNotAvailableSet); 6174 notAvailableFound=computeDayOrHourNotAvailable(&activitiesListWithDayNotAvailableSet, &activitiesListWithHourNotAvailableSet); 6175} 6176 6177 6178bool computeDayOrHourNotAvailable(QList<QSet<int>> *activitiesListWithDayNotAvailableSet, QList<QSet<int>> *activitiesListWithHourNotAvailableSet){ 6179 bool newImprovementFound=false; 6180 for(int ai=0; ai<gt.rules.nInternalActivities; ai++){ 6181 for(int d=0; d<gt.rules.nDaysPerWeek; d++){ 6182 bool wholeDayNotAvailable=true; 6183 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 6184 if(notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]!=100){ 6185 wholeDayNotAvailable=false; 6186 break; 6187 } 6188 } 6189 if(wholeDayNotAvailable){ 6190 if(!(*activitiesListWithDayNotAvailableSet).at(ai).contains(d)){ 6191 (*activitiesListWithDayNotAvailableSet)[ai]<<d; 6192 newImprovementFound=true; 6193 } 6194 } 6195 } 6196 } 6197 for(int ai=0; ai<gt.rules.nInternalActivities; ai++){ 6198 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 6199 bool wholeHourNotAvailable=true; 6200 for(int d=0; d<gt.rules.nDaysPerWeek; d++){ 6201 if(notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]!=100){ 6202 wholeHourNotAvailable=false; 6203 break; 6204 } 6205 } 6206 if(wholeHourNotAvailable){ 6207 if(!(*activitiesListWithHourNotAvailableSet).at(ai).contains(h)){ 6208 (*activitiesListWithHourNotAvailableSet)[ai]<<h; 6209 newImprovementFound=true; 6210 } 6211 } 6212 } 6213 } 6214 return newImprovementFound; 6215 6216} 6217 6218void setNotAvailable(QList<QSet<int>> *activitiesListWithDayNotAvailableSet, QList<QSet<int>> *activitiesListWithHourNotAvailableSet){ 6219 for(int i=0; i<gt.rules.nInternalTimeConstraints; i++){ 6220 if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_ACTIVITIES_SAME_STARTING_DAY){ 6221 ConstraintActivitiesSameStartingDay* sst=(ConstraintActivitiesSameStartingDay*)gt.rules.internalTimeConstraintsList[i]; 6222 if(sst->weightPercentage==100){ 6223 for(int j=0; j<sst->_n_activities; j++){ 6224 foreach(int d, (*activitiesListWithDayNotAvailableSet).at(j)){ 6225 for(int ai=0; ai<sst->_n_activities; ai++){ 6226 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 6227 notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]=100; 6228 } 6229 } 6230 } 6231 } 6232 } 6233 } 6234 if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_TWO_ACTIVITIES_GROUPED){ 6235 ConstraintTwoActivitiesGrouped* c2=(ConstraintTwoActivitiesGrouped*)gt.rules.internalTimeConstraintsList[i]; 6236 if(c2->weightPercentage==100){ 6237 foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->firstActivityIndex)){ 6238 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 6239 notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100; 6240 } 6241 } 6242 foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->secondActivityIndex)){ 6243 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 6244 notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100; 6245 } 6246 } 6247 } 6248 } 6249 if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_TWO_ACTIVITIES_CONSECUTIVE){ 6250 ConstraintTwoActivitiesConsecutive* c2=(ConstraintTwoActivitiesConsecutive*)gt.rules.internalTimeConstraintsList[i]; 6251 if(c2->weightPercentage==100){ 6252 foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->firstActivityIndex)){ 6253 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 6254 notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100; 6255 } 6256 } 6257 foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->secondActivityIndex)){ 6258 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 6259 notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100; 6260 } 6261 } 6262 } 6263 } 6264 if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_THREE_ACTIVITIES_GROUPED){ 6265 ConstraintThreeActivitiesGrouped* c2=(ConstraintThreeActivitiesGrouped*)gt.rules.internalTimeConstraintsList[i]; 6266 if(c2->weightPercentage==100){ 6267 foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->firstActivityIndex)){ 6268 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 6269 notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100; 6270 notAllowedTimesPercentages[c2->thirdActivityIndex][d+h*gt.rules.nDaysPerWeek]=100; 6271 } 6272 } 6273 foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->secondActivityIndex)){ 6274 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 6275 notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100; 6276 notAllowedTimesPercentages[c2->thirdActivityIndex][d+h*gt.rules.nDaysPerWeek]=100; 6277 } 6278 } 6279 foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->thirdActivityIndex)){ 6280 for(int h=0; h<gt.rules.nHoursPerDay; h++){ 6281 notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100; 6282 notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100; 6283 } 6284 } 6285 } 6286 } 6287 if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_ACTIVITIES_SAME_STARTING_HOUR){ 6288 ConstraintActivitiesSameStartingHour* sst=(ConstraintActivitiesSameStartingHour*)gt.rules.internalTimeConstraintsList[i]; 6289 if(sst->weightPercentage==100){ 6290 for(int j=0; j<sst->_n_activities; j++){ 6291 foreach(int h, (*activitiesListWithHourNotAvailableSet).at(j)){ 6292 for(int ai=0; ai<sst->_n_activities; ai++){ 6293 for(int d=0; d<gt.rules.nDaysPerWeek; d++){ 6294 notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]=100; 6295 } 6296 } 6297 } 6298 } 6299 } 6300 } 6301 } 6302} 6303 6304362-------------------------------------------------------- 6305From math (on forum): 6306 6307When I start preparing a new timetable for the next semester, I do not start from scratch but from some kind of base configuration file. This file 6308contains general information about rooms, times of blocks, teachers, lecture titles, etc. So I can directly start with creating activities etc. 6309 6310The list of teachers is quite long and encompasses both internal and external teachers. Internal teachers have a full contract with our university 6311while external teachers are external experts that are hired only for one specific lecture, project or seminar in that particular semester. 6312If somebody new is giving a lecture for the first time, I add him or her to this base configuration file, no matter if he/she will ever give a course 6313in one of the following semesters. Hence, only a small subset of configured teachers is actually teaching within that semester. When printing timetables 6314for teachers, I either have to create lots of empty timetables or I have to carefully select all the "active" teachers from the list. To be honest, 6315I usually take the easier way. 6316 6317So here's my suggestion: wouldn't it be possible to add another option to the settings dialog? (e.g. Settings -> Timetables -> Hide teachers without activities) 6318When this option is disabled (standard behaviour), FET acts like it currently does. 6319When this option is enabled, the list of teachers in the timetabling dialogs (Timetable -> Teachers -> ...) is filtered, so that it only contains teachers 6320that actually have activities in their timetables. Also the teacher list in the printing dialog (Timetable -> Print -> Teachers) is filtered in this way. 6321 6322--- 6323 6324Additional suggestion from math on this subject: 6325 6326When selecting "Timetable -> Print" a dialog opens that has a dropdown list with potential printing types (e.g. rooms, teachers, subjects, ...). When selecting an 6327item from that dropdown list, the listbox on the left hand side is filled with all items of that type, e.g. all rooms. Below that listbox there are two buttons "All" 6328and "None". By pressing these buttons I can select/deselect all items of that list. 6329 6330I thought of adding a third button (e.g. "used") here. When pressing that button only those items are selected that are actually used in the recently generated 6331timetable. For example: 6332- if pressing the "used" button in "teacher" mode, only the teachers from the list are selected that have at least one activity planned (i.e. omitting all teachers 6333with empty timetables) 6334- if pressing the "used" button in "room" mode, only rooms from the list are selected that are used for at least one activity 6335- if pressing the "used" button in "subgroup" mode, only student subgroups are selected where at least one activity is assigned (i.e. omitting all subgroups without 6336activities, e.g. due to internship semesters) 6337 6338363--------------------------------------------------------- 6339From pg788 (on forum): 6340 6341I understand this might be restrictive, but a teacher doesn't want to begin in 3rd or 4th, since there is traffic. 6342 6343364--------------------------------------------------------- 6344From Dietmar Deuster and Volker Dirr: 6345 6346Constraints: 6347- activity must start a students day 6348- activity must start or end a students day 6349 6350Liviu: start may be possible, but start or end seems very difficult, maybe impossible. Please see also item #295, point 2. 6351 6352365--------------------------------------------------------- 6353From Volker Dirr and Liviu Lalescu: 6354 6355Volker has a private file which sometimes is solvable, but sometimes may cycle. We tried to improve the code, but it runs much slower on other files. 6356 6357366---------------DONE since FET-5.40.1 2019-11-14---------- 6358 6359367--------------------------------------------------------- 6360From Anthony Siaudeau: 6361 6362Is there a possibility to have tags to constraints (for example to activate/inactivate a group of constraints with one click) ? 6363 6364Is there a possibility to activate/inactivate activities with one click in the activities windows ? 6365 6366Volker Dirr: 6367 6368I fear a bit that adding such a constraint into official version might mislead several FET users to do hasty action. So I guess such a feature will make 6369it only much more complicated to users with low skills since they won't understand their bugs anymore if the enable/disable several constraint at once. 6370 6371Anthony Siaudeau: 6372 6373I understand the risks for soft users. Is it possible to add in advanced settings an unlock button for active check boxes ? 6374 6375368--------------------------------------------------------- 6376(see also items #58, #149, and #396) 6377From Anthony Siaudeau: 6378 6379I know an undo button isn't possible but is it possible to have a change 6380history ? 6381When I work hard to optimize a timetable the generation time could be 6382high. And few times, when I break the generation or when the generation 6383is succesfull, I forget my last modification. With a change history it 6384could be easier. 6385Maybe such history needs discusssion about the level of details 6386integrated for each actions. For example said "activity n° 1234 had been 6387changed" had a lack of information while "teacher alpha had available 6388time changed monday hour1, monday hour 2, .... friday hour 7" will 6389probably be too much detail. 6390 6391369--------------------------------------------------------- 6392From George Milliotis (Corfiot) - on forum: 6393 6394I would like to be able to group activities (maybe via tags) and be able to save html only for one or more of those groups. 6395 6396I generate schedules for undergrads, postgrads and some special course sets and I have to generate them together so the rooms/teachers work out. 6397Then I need to copy FET output to separate tables manually to distribute. I would like to have the ability to just output different schedules. 6398 6399It would possibly be easier to be able to export a new FET file with only the rules and activities relevant to this group/tag. I could then 6400generate schedule html from those files. Although that would require some extra steps. 6401 6402370--------------------------------------------------------- 6403From George Milliotis (Corfiot) - on forum: 6404 6405I would like to have activities that do not count towards time or space rules. I have breaks that have to be within a specific time range so that 6406students can eat while the restaurant is open. 6407 6408If I put an activity for that FET finds places for me, which is a great help but then rules like students max hours continuously trigger and my 6409schedule breaks. 6410 6411What I'm after are "soft" breaks. 6412 6413371--------------------------------------------------------- 6414From George Milliotis (Corfiot) - on forum: 6415 6416I make schedules and then save them locked in a new FET file. This leaves the general constraints in the file alongside the newly added specific 6417locking rules. If I later make a change to the placement of an activity (time or space) FET only says that it can't be placed. 6418 6419I would like FET to list me all the rules conflicting with the two locked time/space rules for the activity so I can pinpoint which "general" 6420constraint is the problem. This would save me A LOT of time. 6421 6422Eg: 6423Activity #111: Blah blah, teacher blah, students blah 6424 TIME LOCK (day X - time Y) PLACEMENT FAILED BECAUSE: 6425 this rule 6426 that rule 6427 SPACE LOCK (room Z) PLACEMENT FAILED BECAUSE: 6428 this rule 6429 that rule 6430 6431For example, it should be obvious that a rule max students hours daily that blocks a set of locked activities on the same day for that student set 6432is easily detectable as the culprit. 6433 6434Or, a max teachers gaps per week rule when all other relevant activities to a teacher are placed, would also be easy to identify if we're placing 6435a time-locked activity. 6436 6437372--------------------------------------------------------- 6438From satellite2 - on forum: 6439 6440FET has the option for selecting buildings of the rooms and assigning very useful constraints for the teachers/students such as min gaps 6441between building changes and max building changes per day/week. Our university has 3 different campuses in the city and they are really 6442far away from each other. Sometimes teachers and students need to visit more than one campus a week for different courses. So with the 6443current options, I am considering to use each campus name as a building and assign the max building changes per day to ZERO since it is 6444not that easy for teachers/students to change their campus in a day. However, this time I will not be able to use the actual building names 6445inside each campus. I will not be able to assign min gaps between building changes since building names are used for the campus names. Actual 6446buildings are also needed since some of the buildings also have some distance between them on foot and at least 1 period gap is needed. 6447 6448What I want to ask is that is it difficult to add an additional hierarchical level above building variable to the current code and call it 6449"campus" or something else? Also similar space constraint for the campus variable such as max campus changes a day? 6450 6451Liviu and satellite2: maybe add each building in its own campus. 6452 6453373--------------------------------------------------------- 6454From Jude G: 6455 6456 * Importing comments to activities / students / teachers. 6457 * Option for having full names and codes. 6458(so teachers, students, ..., will have two names: a long name and a short name). 6459 6460374--------------------------------------------------------- 6461From bharatstank (on forum): (https://lalescu.ro/liviu/fet/forum/index.php?topic=3989.0) 6462 6463Room not available constraint - wherein (X) crossing the specific slot means No activity is placed in that (X) slot. 6464 6465Please suggest - if there is any option, wherein I can Define multiple type of Room not available constraints, so that Instead of (X) slot - we have better meaningful 6466Message to display. 6467 6468There are few Activities, which are not time tabled and are communicated back to the concern department by simply (X) the Class rooms slot. 6469 6470375--------------------------------------------------------- 6471From satellite2 (on forum): (https://lalescu.ro/liviu/fet/forum/index.php?topic=3996.0) 6472 6473The other constraint is "max hours per day for a teacher (or all teachers)". Is there a way to add another constraint like "max activities per day for a 6474teacher (or all teachers)" ? The hours of the activities change from 1 to 4 but teachers see them as an activity and let's say some of them don't want more 6475than two activities a day etc. 6476 6477376--------------------------------------------------------- 6478From Volker Dirr: 6479 6480Disable energy saving mode, because FET won't calculate anymore if 6481the computer falls into save mode after x minutes. 6482 6483377--------------------------------------------------------- 6484From Nagendra (on forum): 6485 6486https://lalescu.ro/liviu/fet/forum/index.php?topic=4050.msg21599#msg21599 6487 6488I request you to enable multi-selection (using 'ctrl' key) and range selection (using 'Shift' key) in time and space constraints also. So that 6489anyone can enable/disable/delete many constraints at once. 6490 6491Also from ChicagoPianoTuner, he suggests selecting and removing more constraints or activities at once. 6492 6493378--------------------------------------------------------- 6494From CarolStott and Volker Dirr (on forum): 6495 6496- A teacher-subject matrix to enter teacher qualified subjects (so you 6497only need to enable/disable a cell in a table) 6498 6499379--------------------------------------------------------- 6500From Volker Dirr: 6501 6502In the "Add activity" dialog: 6503Under the word "duration" (so left from the "active" checkbox) there is still 6504enough place to add some useful information. 6505I suggest to add the currently computed "Total duration". 6506 6507380--------------------------------------------------------- 6508From Christoph Voelker and math (on forum): 6509 6510https://lalescu.ro/liviu/fet/forum/index.php?topic=4068.0 6511 6512They refer to the selection mark and the colors in the constraints activity(ies) preferred times and activities occupy max time slots from selection. 6513 6514381--------------------------------------------------------- 6515From Nagendra (on forum): 6516 6517https://lalescu.ro/liviu/fet/forum/index.php?topic=4085.0 6518 6519Let us say a time table is generated with some constraints and locked. Now, If a faculty wants to re-schedule an activity, then if an interface as explained below 6520will be much more appealing. 6521 6522Stage-1 6523Say, Teacher-1 wants his lecture scheduled on Monday Morning 8:30 to be shifted to any other possible day&timing of his own timetable. So, we go to the particular 6524teacher's timetable and click on the box. If by some means, all the possible positions (satisfying all the constraints) where this lecture could be relocated gets 6525highlighted, then it would be great. Just like we play chess on a computer, and all possible moves of a chesspiece gets highlighted upon selection. Then a simple 6526drag and drop kind of thing. 6527 6528Stage-2 6529Teacher-1 wants his lecture scheduled on Monday Morning 8:30 (say Group A) to be swapped with some teacher-2 who is teaching the same student group (A), but 6530different subject. By showing both teachers timetable side-by-side and highlighting the boxes of teacher-2 upon clicking the lecture of Teacher-1. 6531 6532This is just a suggestion, definitely not very important. But, it will be very easy this way to modify timetable without breaking constraints, if we get some 6533swap requests. 6534 6535382-----------------------DONE------------------------------ 6536 6537383--------------------------------------------------------- 6538From Nagendra (on forum): 6539 6540https://lalescu.ro/liviu/fet/forum/index.php?topic=4104.0 6541 6542Add a constraint to limit the maximum number of subgroups (or number of students?) in any given time slot. 6543 6544384--------------------------------------------------------- 6545From Diego Froner (on forum): 6546 6547https://lalescu.ro/liviu/fet/forum/index.php?topic=4128.0 6548 6549I use the import of CSV files too often because all my planning is made in Excel. One step of this planning is to choose a home room for some classes. 6550So, after all the imports, i have to set a home room for about 350~400 classes manually. 6551 6552My suggestion is to add a "column" in CSV for import "years, groups and subgroups" named "home room" which would be optional. It would automatically 6553add the respective "A set of students has a home room" constraint. 6554 6555Example: 6556 6557Year ; Number of Students ; Home Room 6558ClassA ; 10 ; Room 01 6559 6560This example will set "Room 01" as the home room for "classA" which has 10 students. 6561 6562Volker Dirr: 6563 6564a) we need to stay at the old csv file format, since several other projects already use it. So changes might be very critical in that file format 6565b) we should add all constraints in that files (not only home rooms). Similar to teachers and rooms. 6566c) Because a) and b) conflict each other we should add a second csv file format. 6567 6568385--------------------------------------------------------- 6569From Volker Dirr: 6570 6571Split year dialog: It should be possible to sort the group names. I think manual sort (by using "up" and "down" buttons) 6572will be better than only alphabetic sort. 6573 6574386--------------------------------------------------------- 6575From Ireri Venture: 6576 6577I would suggest you to add the constraint minimum continuous hours for a teacher. 6578 6579Advantages of min continuous would help a school like ours where there is sessions we do have where daily a teacher has minimum of 3 sessions 6580and we would wish one to have the capability of teaching 3 sessions continually and then rest or go home since the total sessions are 5. 6581 6582387--------------------------------------------------------- 6583From Volker Dirr: 6584 6585there is a warning at the beginning if you generate about how to speed up by 6586deleting subgroups. 6587in my opinion that is very useful, since guys that work with such a file 6588can use it. 6589 6590first of all i thought it is a nice idea if i just do that improvement 6591in my source myself; so just not exporting those duplicated. but that 6592idea is bad, because there is a disadvantage: it won't be possible 6593to output a subgroup for every student. (only if you tell him: Mr. X, 6594please use the table of Ms. Y, it is the same table.) 6595So what do you think about the following idea: 6596there should be a feature to disable those duplicates. 6597so FET can generate the table fast. 6598as soon as you get the results you just open the saved data from the 6599results folder, enable the subgroups again and regenerate. By that they 6600will look fine. 6601 6602Liviu: It is a bit complicated, and also the constraints for these subgroups 6603should be the same (yes, in practice they will probably be the same). 6604 6605388--------------------------------------------------------- 6606 6607Partially DONE in FET-5.40.0 (2019-09-25): the constraints of type teacher(s) max span per day allow one day exception. 6608 6609From Luca (on forum): 6610 6611https://lalescu.ro/liviu/fet/forum/index.php?topic=4177.0 6612 6613Allow a one day exception for the constraints of type teacher(s) max hours daily and teacher(s) max span per day, in which day the teacher(s) 6614can have +1 more hours/span. 6615 6616Additional suggestions by bachiri401: Allow a number of n days of exception for the constraints of type teacher(s)/students (set) max/min hours daily. 6617 6618Also suggested previously by totera: 6619 6620https://lalescu.ro/liviu/fet/forum/index.php?topic=3915.0 6621 6622Several teachers can work max 5 hours daily, but only once a week; in the other days the maximum is 4. 6623At the moment if in the generated timetable there is a teacher with two 5-hour days I add the constraint that all his activities occupy max 9 hours 6624in those days, but the problem presents again in other days or other teachers and it would be very laborious to add the constraints for all the 6625possible pairs of days. Is there any alternative solution? 6626 6627Also suggested by astigol on forum: 6628 6629https://lalescu.ro/liviu/fet/forum/index.php?topic=4284.0 6630 6631389--------------------------------------------------------- 6632From Ireri Venture: 6633 6634Writing a custom text (like "Break") in the timetable instead of "-X-". 6635 6636There might be more break periods in the timetable. The HTML output should have a whole row/column with the name of the corresponding break 6637(possibly more names in the same timetable, like: "Lunch", "Supper"), written only once, and if on a column, written vertically. 6638 6639390--------------------------------------------------------- 6640From Ireri Venture: 6641 6642The hours' names may be numbered starting with 1, 2, ..., and next to them, smaller, their time. 6643 6644391--------------------------------------------------------- 6645From Aisse (on forum): 6646 6647https://lalescu.ro/liviu/fet/forum/index.php?topic=4283.0 6648 6649Hello .. I have a suggestion and I hope that you will try to achieve it .. Some data in the tables would be better to arrange in descending order 6650so that we do not have to go down every time .. For example when I click on the constraints of time: "All" appear the latest constraints in the 6651bottom .. I think it would be better to arrange it in descending order, the last constraint appears first directly under the constraint Primary. 6652I am sorry again because my English is not strong .. I hope you understand my idea .. Thank you for all your efforts . 6653 6654392--------------------------------------------------------- 6655From Zafar Allah Askar (on forum): 6656 6657https://lalescu.ro/liviu/fet/forum/index.php?topic=4313.0 6658 6659Add an option like in the custom FET for Morocco, in the Add activity dialog, a check box "Separately" for the selected students, 6660so that FET will add multiple activities, one for each selected students set. 6661 6662393-------DONE since FET-5.41.0 - 2019-11-18---------------- 6663 6664394--------------------------------------------------------- 6665From math (on forum): 6666 6667https://lalescu.ro/liviu/fet/forum/index.php?topic=4343.0 6668 6669I was wondering if it may be possible to introduce an active flag to teacher configuration (i.e. Data -> Teachers). 6670 6671Background: beside a core team of permanent teachers we have a large team of external teachers and contracted students. If somebody participates 6672in teaching for the first time, I'm adding him/her to the fet configuration as teacher. For the sake of laziness I'm only adding, but never removing, 6673because it happens quite often that external teachers return in later semesters. Even permanent staff is inactive from time to time, e.g. during 6674sabbaticals or visiting reasearch at other universities. And in fact, I do not only have to enter the name to the FET configuration but also the 6675internal ID from our SAP system. So I just want to omit the overhead of adding this information each and every semester again. 6676 6677But the downside of this approach is that my teacher listboxes grow in size quite fast. When defining activities or setting filters, I have to search 6678in a large list of teachers that might be significantly smaller, if only I would remove inactive teachers. 6679 6680Having an active flag would allow me to quickly toggle the status of all teachers at the beginning of the semester. If a teacher is toggled inactive, 6681he/she would not be added to listboxes. He/she would be also omitted in the schedule generation, i.e. no schedule is generated for this person. 6682 6683The only difficuly I see is how to handle this situation: what happens if a teachers gets toggled inactive while there are activities on his name? 6684I would suggest the following: 6685- When a teacher gets toggled inactive, FET checks whether there are activities for him/her. If yes, a warning dialog is displayed saying "There are 6686activities for this teacher. Are you sure?" If "no" is pressed, the teacher remains active. If "yes" is pressed, the teacher gets toggled inactive. 6687- If FET discoveres an inactive teacher at schedule generation time, it displays a warning ("Activity 1234 has been assigned to an inactive teachers), 6688but ignores the inactive teacher. (i.e. it schedules the activity as if the inactive teacher wouldn't have been assigned to the activiy). 6689 6690This behaviour would be beneficial for community activities, e.g. jour fixe meetings. I simply add all relevant teachers to the activity, not caring 6691if they are actually teaching this semester or not. By analyzing the active flag, FET would only schedule active teachers to these activities. 6692 6693The other option to handle this situation would be to reject toggling a teacher as inactive while he/she has activities. 6694 6695395--------------------------------------------------------- 6696From Nagendra (on forum): 6697 6698https://lalescu.ro/liviu/fet/forum/index.php?topic=4365.0 6699 6700Say, activities are created with students and subjects (without teachers). 6701 6702Currently, FET assigns these activities to rooms (subjected to the constraints). 6703 6704Similarly, you can include an option to assign teachers automatically, if a user wants FET to do so. User may be given option to toggle/untoggle 6705the feature of assigning teachers automatically. 6706 6707This way the official FET can be used for both regular as well as exam timetables. 6708 6709396--------------------------------------------------------- 6710(see also items #58, #149, and #368) 6711From uni_instructor (on forum): 6712 6713https://lalescu.ro/liviu/fet/forum/index.php?topic=4367.0 6714 6715You wrote to another request concerning this topic: 6716"Unfortunately, there is no Undo button, because it is too difficult to implement one now" 6717 6718As I see there a a few requests related to the missing UNDO function. (my own request included). 6719Some users made suggestions concerning possible solutions by using powerful CVS approaches like GIT or Mercurial. 6720 6721I know implementing a reasonable CVS in FET would be a tough job. So why not keeping it simple? 6722I remember there was a suggestion that I should do a manual versioning by saving my project data into new FET-files. That is what I am currently doing. Additionally I keep manual (paper) records and comments of my changes. 6723But it is always a hassle and error-prone to keep all my manual recordings up to date. 6724 6725So I would like to suggest a simpler approach: 6726 6727FET uses internal data structures to store all basic data and planing constraints and FET can save these data structures into a .FET file. 6728 6729How much programming effort does it cost to create dynamic duplicates in memory of these data structures? I know it will cost additional system-memory and a little bit of time for storing the data-duplicates, but modern computers are fast and provide Gigabytes of memory, so why should we care about a few hundred Megabytes of additional memory consumption? Actually the real additional memory consumption should be rather low, as I found from my own tests an measurements, since FET has a rather small memory footprint. 6730 6731I conceive that it should be possible to implement a mechanism for creating/duplicating and switching dynamically between these data structures. In that way it will be possible to keep a history of all (or the last #n) changes and to step back to an earlier planning stage if necessary. A step back would also delete all succeeding planning stages / sets of planning/constraint data. 6732Additionally it is possible to store in parallel some short (UNDO-) information that gives the user a hint about the last change steps. Furthermore the whole super-data structure (containing the current set of planning/constraint data and its predecessors ) could be saved into an extended .FET file, so that we can revert to previous planning stages even after a program restart. 6733 6734Below I added some figures illustrating my idea. 6735 6736 Dynamic pointer array/ buffer of max n stages 6737 \ 6738 \ 6739 \ 6740 O \ 6741 | \ 6742 | +--+ 6743 +---->|#1|------|EOL 6744 +--+ 6745 | +-------+ 6746 o--XInfo #1| 6747 | +-------+ 6748 | 6749 | 6750 |Step 1 6751 +---X-----+ 6752 |Data #1 | 6753 |+---++--+| 6754 || A || || 6755 |+---+|T || 6756 |+---+|C || 6757 || R || || 6758 |+---++--+| 6759 +---------+ 6760 A Current stage 6761 | 6762 +----Data set containing 6763 room/activities/time 6764 constraints etc. 6765====================================================================== 6766 Data structure after #n change steps 6767 6768 Dynamic pointer array/ buffer of max n stages 6769 \ 6770 \ UNDO/Revert back to step #2 6771 \ +---------------------------------+ 6772 O \ | | 6773 | \ V | 6774 | +--+ +--+ +--+ +--+ 6775 +---->|#1|--------->|#2|--------->|#3|--------------->|#n|------|EOL 6776 +--+ +--+ +--+ +--+ 6777 | +-------+ | +-------+ | +-------+ | +-------+ 6778 o--XInfo #1| o--XInfo #2| o--XInfo #3| o--XInfo #n| 6779 | +-------+ | +-------+ | +-------+ | +-------+ 6780 | | | | 6781 | | | | 6782 |Step 1 |Step 2 |Step 3 |Step n 6783 +---X-----+ +---X-----+ +---X-----+ +---X-----+ 6784 |Data #1 | |Data #2 | |Data #3 | |Data #n | 6785 |+---++--+| |+---++--+| |+---++--+| |+---++--+| 6786 || A || || || A || || || A || || || A || || 6787 |+---+|T || |+---+|T || |+---+|T || * * * |+---+|T || 6788 |+---+|C || |+---+|C || |+---+|C || |+---+|C || 6789 || R || || || R || || || R || || || R || || 6790 |+---++--+| |+---++--+| |+---++--+| |+---++--+| 6791 +---------+ +---------+ +---------+ +---------+ 6792 Current stage 6793 6794====================================================================== 6795 Data structure after UNDO and revert to change step #2 6796 6797 Dynamic pointer array/ buffer of max n stages 6798 \ 6799 \ 6800 \ 6801 O \ 6802 | \ 6803 | +--+ +--+ 6804 +---->|#1|--------->|#2| -----|EOL 6805 +--+ +--+ 6806 | +-------+ | +-------+ 6807 o--XInfo #1| o--XInfo #2| 6808 | +-------+ | +-------+ 6809 | | 6810 | | 6811 |Step 1 |Step 2 6812 +---X-----+ +---X-----+ 6813 |Data #1 | |Data #2 | 6814 |+---++--+| |+---++--+| 6815 || A || || || A || || 6816 |+---+|T || |+---+|T || 6817 |+---+|C || |+---+|C || 6818 || R || || || R || || 6819 |+---++--+| |+---++--+| 6820 +---------+ +---------+ 6821 Current stage 6822 6823---------- 6824 6825Liviu Lalescu: 6826 Your ideas are interesting. I added your complete post in the TODO file. Thank you! 6827uni_instructor: 6828 Nice to read! :) 6829 At least it would be a possibility to implement an UNDO feature without a complete rewrite of FET. 6830 6831Liviu Lalescu: 6832 To make a complete and perfect and memory efficient undo function would be a titanic task now, after all the code was written without undo in mind. And I admit I have no good knowledge of how to implement an undo function. 6833uni_instructor: 6834 I know, my suggested approach is not memory efficient and sophisticated, nevertheless it is a feasible approach. 6835 6836Liviu Lalescu: 6837 To implement what you are suggesting is also complicated. But I do not quite like it because of the memory waste. And saving a file with say 1000 undo versions might lead to a 1 GB file if the file has 1 MB (the internal memory consumption is lower than the .fet XML file). 6838uni_instructor: 6839 I don't think that all FET users will need an UNDO with 1000 levels. Even MS-Office does not offer an infinite UNDO. But as I wrote, modern computers have a lot of memory - so who cares. 6840 The number of UNDO-levels can be restricted, maybe an a user-defined setting. I think max. 10-25 UNDO-levels by default should be sufficient and this would not be such a significant memory waste. 6841 6842397--------------------------------------------------------- 6843From Corfiot (on forum): 6844 6845https://lalescu.ro/liviu/fet/forum/index.php?topic=4368.0 6846 6847Corfiot: 6848 6849Would it be possible to add rule groups that one could enable/disable? This would be a ui-side thing and groups could be stored in the XML file separately from rules, so the rule storage schema is not affected. 6850 6851This would help a lot with creation of difficult timetables, you could group "easy"/"important" rules together, fiddle to get a schedule, then add more rules, fiddle, and repeat, adding more optional/nice to have restrictions. 6852 6853The UI would be about creating a group (name it) and then in the filter dialog of any rule display dialog add an option to add these rules to a group. Finally, a small dialog to display/delete rules from a group. 6854 6855How feasible is this? 6856 6857Liviu Lalescu: 6858 6859It is an interesting idea. The problem is that constraints do not have an ID, so you cannot specify exactly the constraints in a group. 6860 6861But Anthony Siaudeau and I have better ideas (there is an older custom version created for Anthony Siaudeau based on his suggestion). He suggested that a constraint can have a weight or a weight name. Weight names have modifiable values. You can create more weight names and assign them to the constraints. Then with only a click you can change the value of a weight name and thus modify the weights of more constraints at once. My idea is to do this also to enable/disable constraints (add some Boolean variables to be attached as the "enabled" state of some constraints). This is because many constraints can have only 100% weight, and they need to be disabled if you want this - their weight cannot simply be made 0. 6862 6863398------This will be DONE by Qt 6-------------------------- 6864 6865In Qt 6 the classes QVector and QList will be united into QList, bringing the best performance of QList 6866(there will be no reason/need to convert QList to QVector). 6867 6868399--------------------------------------------------------- 6869From math (on forum): 6870 6871https://lalescu.ro/liviu/fet/forum/index.php?topic=4370.0 6872 6873Meaning of colors: 6874 6875When enabling "Settings -> Interface -> Use colors", activities in time table dialogs (e.g. Timetable -> Students -> Days horizontal) are colored. 6876Do these colors have any meaning or are they selected randomly? 6877 6878Liviu Lalescu: 6879 6880The coloring code for the timetables was contributed by Marco Vassura, and I think he said it was a classical routine. The colors for the students' 6881timetables compute the color from the subject, while for the teachers'/rooms' timetable compute the color from the subject+students' names. The color 6882is random, but the same for the same string (same subject or same subject+students names). 6883 6884The HTML timetables with level 7 are similar, I think. 6885 6886math: 6887 6888Ah, ok, that's what I guessed. 6889 6890The reason I was asking was because I would wish for a different coloring scheme. We have multiple activities for one course. Beside a lecture and 6891an exercise, we also have tutorials, lab hours or central exercises. Hence there are multiple subjects for one course with very similar names, e.g. 6892"Programming 1 VL" (lecture), "Programming 1 UE" (exercise), "Programming 1 LAB", etc. I would like to see that activities with similar subject names 6893would get similar colors, so that it is clear on the first sight how the different activities of the courses are distributed over the schedule. 6894For instance, one could use the Levenshtein distance for determining the level of similarity between two subjects. 6895 6896Volker Dirr: 6897 6898Sadly "Programming 1 VL" and "Programming 1 UE" are different names, so the colours will be different. You might set "VL" and "UE" as a tag name, 6899so the names will be the same. 6900You might also check TiTiTo. Just import the dataset and export the table again, since you can select different colours with that tool. 6901 6902A second variant is that you colour yourself by the css file with html level 6. 6903 6904Liviu Lalescu: 6905 6906Yes, unfortunately the colors are based on a 24-bit hash, so they are (or should be) very different for even small changes. Unfortunately I cannot 6907do like you suggest. Maybe you can follow what Volker said. 6908 6909400--------------------------------------------------------- 6910From Cyrus (on forum): 6911(see also entry #403) 6912 6913https://lalescu.ro/liviu/fet/forum/index.php?topic=4373.0 6914 6915Avoiding 4 sessions consecutive for teachers even when there is a break: 6916 6917How can one configure get to ensure teachers can never have 4 sessions consecutive with a break between (2-2) such that whenever a teacher teaches 69182 sessions followed by a break, one can only have one more and not two. 6919 6920Liviu Lalescu: 6921 6922I think of this: for each teacher, add n_days constraints activities occupy max time slots from selection, selected the 4 slots, max occupied = 3. 6923A lot of constraints to add, unfortunately. 6924 6925Cyrus: 6926 6927It's quite tedious to give the constraint to all teachers on daily basis. Wish there was a way of having like max time slots from selection for 6928all teachers. That would be better. 6929 6930Also suggested by Vangelis Karafillidis: 6931 6932For the max hours continuously constraints, add the possibility to except the breaks. 6933 6934401--------------------------------------------------------- 6935From Volker Dirr: 6936 6937(inspired by this paper: https://www.herrmann-online.info/documents/bachelorarbeit.pdf) 6938 6939Write the rooms' free periods timetables in the HTML results. The rooms should be grouped by buildings. 6940 6941402--------------------------------------------------------- 6942From Eric de Quartel: 6943 6944Is it possible to get the numbers of the activities in the HTML timetable. It makes it easier to communicate when changes have to be made. 6945 6946(Eric refers to writing the id-s of the activities in the HTML timetables, and maybe adding a check box for this.) 6947 6948Volker Dirr: 6949 6950print it in the first line or the last line? 6951 6952Eric de Quartel: 6953 6954Second line I think. Is very helpful. 6955 6956Volker Dirr: 6957 6958hmmm... 6959that id's might help the timetablemaker who use the fet gui. but i guess 6960it will only do trouble for students and "normal" teachers. those guys 6961can always say "in table x, day y and hour z" (of course that are 3 6962numbers/names, but it 100% clear. no wasting space on sheet, no swapping 6963id number with room number or students year, no explaining need why 6964there is that strange number, ...) 6965so shouldn't it be in the GUI only, but not in html table?! 6966 6967403--------------------------------------------------------- 6968From Cyrus (on forum): 6969(see also entry #400) 6970 6971https://lalescu.ro/liviu/fet/forum/index.php?topic=4391.0 6972 6973I have used the constrain on 'a set of activities occupies max/min slots from selection' and its amazing though tedious more so when you 6974have putting all teachers and classes. Is it possible we have a general constrain for all teachers and students such that it will be easier 6975to put constrains revolving around all teachers and students? If it can be there, it can really help alot 6976 6977404--------------------------------------------------------- 6978From Volker Dirr: 6979 6980(since i am currently doing again a very difficult timetable and i think it will be useful for those very difficult tables): 6981 6982optional enable in the settings "write highest stage solution if running out of generation time". 6983 6984405--------------------------------------------------------- 6985From Liviu Lalescu and Zsolt Udvari (on forum): 6986 6987https://lalescu.ro/liviu/fet/forum/index.php?topic=4399.0 6988 6989Maybe "fet-cl --version" should not create a new directory and a log file in it in which to write the FET version, but should output this information only 6990on the screen. Maybe this should also be the behavior when the generation of the timetable does not begin because of incorrect command-line arguments. 6991FET command-line creates the "logs" and possibly the "timetables" directories in the output directory (which is the current working directory if none given 6992as an argument) and some logs files in these directories. 6993 6994406--------------------------------------------------------- 6995From Vangelis Karafillidis: 6996 6997About our discussion for this feature. In real life timetabling problems, schools need to change their timetable from time to time. 6998It's crucial to change the timetable as little as possible. So, when the timetable needs to be changed (for example a new teacher is hired), 6999it would be really useful to preserve the day(s) of the activities. As you can understand, this is useful for already generated timetables. 7000So, in the same way that one locks/unlocks activities, he could additionally have the option to preserve the day(s) of selected activities. 7001The locking/unlocking activities, should be independent from the preserve day(s) option. In the already existing views of the generated timetable 7002for locking/unlocking activities, the user could be able to select the activities for which the day(s) should be preserved. 7003This could be done by adding already existing constraints, such as preferred time for activities (I don't remember the exact title of the constraint). 7004At the same time, the user should be able to remove specifically these constraints, without affecting the ones that he has added "manually". 7005As you told me, this might be done by adding a comment for these constraints. It might be implemented in another way... I don't know. 7006So, in the locking/unlocking activities views, the preserve day(s) could be added. Also, an option for removing "automatically" all these constraints 7007should be added. What do you think? 7008 7009Liviu Lalescu: 7010 7011The constraint you refer to is "activity preferred starting time". It 7012has a special attribute, "permanently locked" (true or false). True is 7013for manually added, and cannot be removed/unlocked automatically. False 7014is for automatically added, and will be removed/unlocked automatically. 7015 7016It is possible to add a new attribute like this to the constraints of 7017type "activity preferred starting times/time slots". But it is a bit 7018complicated and will complicate also the structure of the data. 7019 7020407--------------------------------------------------------- 7021From Vangelis Karafillidis: 7022 7023In the Timetable view dialogs: add a button, so the user can add an activity tag + a comment for the selected activities 7024and maybe add the option to modify a selected activity. 7025 7026408--------------------------------------------------------- 7027From Darren McDonald (on forum): 7028 7029https://lalescu.ro/liviu/fet/forum/index.php?topic=4151.msg24155#msg24155 7030 7031Darren proposes different icons for the custom versions, and other things: 7032 7033I've had some thoughts about the FET app icon (both the standard and custom versions). 7034 7035What do you all think about a text-free icon? (So, perhaps just the box, with a different coloured box for the custom versions.) 7036In any event, it would be useful to have higher resolution icons (even if the icon design goes unchanged), so this might also be 7037an opportunity to refresh the icon design itself. 7038 7039409--------------------------------------------------------- 7040From Francesco Rizzo: 7041 7042He proposes a filter teacher combo box in the all time constraints dialog (as opposed to writing the name of the teacher in the 7043advanced filter there). 7044 7045410--------------------------------------------------------- 7046From bachiri401: 7047 7048The students should keep the same room for a selectable 1, 2, 3, or 4 hours in a row (he is using FET for Algeria, but suggests that 7049this might be useful also for the official FET and for other FET custom versions). 7050 7051411--------------------------------------------------------- 7052From Peter Johnson (on forum): 7053 7054https://lalescu.ro/liviu/fet/forum/index.php?topic=4463.0 (Posted on 22 May 2020) 7055 7056When I was using an old version of FET, I could have a "student home room", "teacher home room" and for those activities that its 7057teacher and student has "home room" constraint, I could define an "activity preferred room'. In this way, FET was ignoring the student 7058and teacher's home room constraints and just consider the "activity preferred room". But now that I have switched to the new version, 7059it says "Cannot generate timetable, because for activity with id==1 you have no allowed home room (from constraints students set home 7060room(s) and teacher home room(s))". 7061 7062What I need is that a teacher T1 has many classes, and they should be in his home room by default. The same holds for a student set S1, 7063but the teacher T1 has just one specific class with S1, and it can be in another room (maybe in T1's home room, or S1's home room or any 7064other room). Is there any solution to use the new version of FET and apply this, or I have to use the old version? 7065 7066Liviu Lalescu: 7067 7068I assume you have problems with a file like the attached one (teacher home room 100% to R1, students set home room 100% to R2, and preferred 7069rooms 100% for that subject to R1 and R2). But I tried with FET-5.27.3, release about 5 years ago, and it behaves like the current 7070FET-5.44.7, refusing to start the generation because of conflicting home rooms constraints. (FET-5.44.7 was released on 20 May 2020 7071and FET-5.27.3 was released on 9 June 2015.) 7072 7073Yes, I admit, you are right. I don't remember exactly the reasons for this behavior, but I think there was a reason. I will think about 7074it, but for the moment I think it should remain like it is. It is risky to change old code. 7075 7076412--------------------------------------------------------- 7077From bachiri401: 7078 7079The constraint type teacher room not available times - this constraint is available in the custom FET-MA version, but not in the official FET. 7080 7081413--------------------------------------------------------- 7082From math (on forum): 7083 7084https://lalescu.ro/liviu/fet/forum/index.php?topic=4524.0 7085 7086In Time->Students it's possible to specify "Max gaps per day/week", but this applies to ALL activities. Since I do not care for gaps 7087between e-learning activities, I cannot use that constraint. 7088 7089I'm thinking about something like Time->Tags->"Max gaps per day/week". This way I could tag all on-campus activities and define a 7090maximum of gaps (=0) between them. 7091 7092Or maybe Time->Activities->"Max gaps per day/week for a set of activities". Here I would define the set of on-campus activities and 7093define a maximum of gaps (=0) between them. 7094 7095414--------------------------------------------------------- 7096From Volker Dirr (on forum): 7097 7098https://lalescu.ro/liviu/fet/forum/index.php?topic=4552.0 7099 7100i think we can see it also with algorithm, but it is a bit work. we need to run through all activities of an teacher. if all his activities are 7101not available in the same slot, then also the teacher is not available in that slot. 7102 7103(Liviu: Volker refers to subsequently detecting that the teacher has too little free slots for all his activities, when the user added 7104a lot of constraints students set not available.) 7105 7106415--------------------------------------------------------- 7107From henriquebelo (on forum): 7108 7109https://lalescu.ro/liviu/fet/forum/index.php?topic=4568.0 7110 7111We have to change the teaching time and make sure that the class breaks are not met. 7112I divided the teaching time into 4, blocks of 15 min, and a class starts at 8:45 am and another at 9:00 am, so it is possible to find the breaks, 7113but I cannot use the Breakes constraint, because it is common for all students. 7114 7115I used the constraint A Student’s set not available times, for each class, where I marked the desired breakes. 7116 7117This constraint does not allow me to use the other constraint that I used a lot, two activities are consecutive, so that I can have one activity 7118before the break and another after the break. 7119 7120Is it possible to create a new condition in Breakes to choose classes? 7121 7122416--------------------------------------------------------- 7123From samantha.goddard (on forum): 7124 7125https://lalescu.ro/liviu/fet/forum/index.php?topic=4571.0 7126 7127When viewing the group timetables in the 'View timetables / View student timetables / day horizontal' tab, is it possible to hide the long list 7128of subgroups that appear in each time slot so that the timetable is easier to view? 7129 7130I am spending a lot of time adjusting the size of the boxes to be able to check for distribution of activities. 7131 7132417--------------------------------------------------------- 7133From Benahmed Abdelkrim (on forum): 7134 7135https://lalescu.ro/liviu/fet/forum/index.php?topic=4601.0 7136 7137Can be added this functionality: allow in dialog boxes to select multiple elements once and drag them to the adjacent field. It could save precious time. 7138 7139418--------------------------------------------------------- 7140From Marcus (on forum): 7141 7142https://lalescu.ro/liviu/fet/forum/index.php?topic=4636.0 7143 7144I don't know if I am outdated or overlooked. If there is no such constraints mentioned below , may I suggest it. 7145 7146Some time we may not want the students to move so far away even when the rooms are in the same building. I limited the choices of rooms of activities by manually .ark a set of suitable rooms in the space constraints. The choices are highly based on the distance between rooms but it may be difficult for the users to mention the distance in many ways in the program. 7147What if we introduce a coordinate system for the rooms so that the program can calculate the horizontal and vertical distance between rooms? And thus set the space constraints based on the calculated distances? 7148 7149I don't know if this is a practical idea. 7150 7151Liviu: Marcus also attached a picture to his suggestion, see the forum link. 7152 7153419--------------------------------------------------------- 7154From nguyenhuuduyet (on forum): 7155 7156https://lalescu.ro/liviu/fet/forum/index.php?topic=4501.msg25772#msg25772 7157 7158About the FET-MA custom version: 7159 7160I want when entering the teacher's name will be displayed immediately like the official version. 7161Example: 1. Enter the teacher's name 71622. Add 71633. OK 7164Then the teacher's name will appear in item 4 7165 7166(meaning the teacher will appear immediately in the list of all the teachers). 7167 7168--- 7169 7170About the official FET version: 7171 7172I recommend adding functionality when importing activities in both official and custom versions. 7173I want the window on import to behave the same as the image I attached (combine the active dialog with the add activity) 7174For example: 71751. Enter teacher, subject, class ... click Add 71762. Click OK 71773. The activity will appear immediately item 3 7178If you do this, it will be very easy for the user to observe. 7179 7180420--------------------------------------------------------- 7181From Fiorellino (on forum): 7182 7183https://lalescu.ro/liviu/fet/forum/index.php?topic=4653.0 7184 7185Excel/Open Office/Libre Office export of the timetable after it was generated. 7186 7187See also TODO items #18, #124, #152, #170, #300, #310. 7188 7189421--------------------------------------------------------- 7190From daviodan: 7191 7192After you generate, you get a message box: "Timetable generated successfully", with a button "OK". Add another button, "See soft conflicts". 7193 7194Liviu: 7195 7196I do not like the idea, but I will write it down in the TODO. 7197 7198422--------------------------------------------------------- 7199From Nando (on forum): 7200 7201https://lalescu.ro/liviu/fet/forum/index.php?topic=4748.0 7202 7203In Italian: 7204 7205Al terzo anno di utilizzo riesco a gestire con una certa facilità le problematiche della mia scuola. L'unico problema sono i tempi lunghi di elaborazione che però credo dipendano dai tanti vincoli presenti, tre plessi, prescuola, docenti in comune con altre scuole, richieste giorni liberi concentrati al sabato e lunedì ecc. L'ultimo orario ha impiegato circa 70 ore ma l'importante è che sia stato fatto. 7206 7207Nel chiedere se sono normali questi tempi di elaborazione, faccio notare delle cose che spererei fossero migliorate: 7208 72091) Perchè e possibile mettere delle eccezioni più restrittive e non estensive? Esempio num max ore buche per tutti i docenti (3), si può impostare un numero inferiore (2) ma non maggiore (4). Idem per numero giorni a settimana per tutti i docenti, si può mettere l'eccezione in meno ma non in più. 72102) A mio parere alcune criticità del programma dipendono dal fatto di non avere sufficienti ore disponibili da collocare in alcune classi in determinati giorni (esemio il sabato con tanti docenti col giorno libero mi sono trovato a non avere la disponibilità oraria necessaria per coprire tutte le classi. 12 classi su tre plessi necessitavano di 12x5= 60 ore mentre i docenti disponibili me ne potevano garantire 58) in questo caso il software non segnala niente, semplicemente non porta a termine l'elaborazione. Sarebbe opportuno avere un report che indichi il num. max di ore disponibile nei vari giorni in modo da evidenziare eventuali criticità prima dell'elaborazione. 72113) La stampa per "classi", "tempo verticale per giorno" dell'orario ha sempre la prima colonna molto stretta, c'e modo di modificarla? 7212 7213423--------------------------------------------------------- 7214From Adele and Volker Dirr (on forum): 7215 7216https://lalescu.ro/liviu/fet/forum/index.php?topic=4751.0 7217 7218Enable/Disable activities in FET->Data->Activities and FET->Data->subactivities similar to enable/disable constraints in FET->Data->Constraints 7219 7220424--------------------------------------------------------- 7221From Vangelis Karafillidis: 7222 7223Import not available constraints for teachers and students from CSV files. 7224Overall matrix view of not available times in the FET interface. 7225 7226Also from Fritzlang, on the forum (https://lalescu.ro/liviu/fet/forum/index.php?topic=5010.0): 7227 7228FET importa alcuni file con le impostazioni principali in formato CSV 7229E' possibile in qualche modo importare anche le ore di assenza degli insegnanti ossia le ore non disponibili per ogni singolo insegnante 7230 7231425--------------------------------------------------------- 7232From Vangelis Karafillidis: 7233 72341) Define custom sets of teachers and students, and apply constraints for them. 7235 72362) Output an HTML-like view of all the constraints. Vangelis also suggests the teachers not available to be displayed in a time horizontal view. 7237 72383) it might be useful.. to add a "locked" button.. in the generated timetables view... 7239for... "unlocking" advanced manipulations... 7240"manipulations"... I mean automated but controlled modifications... 7241and not manual adjustments.... 7242 7243after generating a timetable.. 7244one can open the generated timetable view... 7245for locking/unlocking activities... 7246 7247in this dialog... it might be useful to add a button... 7248(with a "locked" icon) 7249so the user can open an advanced manipulations dialog... 7250for example... 7251it would be useful for the user... 7252to be able to select a teacher... 7253and modify the "not available times" from this dialog... 7254and work with the generated timetable... 7255the same if selecting for example two activities... which are consecutive, without this being acceptable... in order to add a constraint... and make them not consecutive... 7256etc... 7257so.... if the user selects teachers... he should be able to modify the constraints concerning these specific teachers... 7258if the users selects students... 7259he should be able to... blabla... 7260if the user selects SETS OF TEACHERS (the new feature I mentioned)... he should be able to add constraints for the entire selected set... 7261and the same for activities... 7262complicated.. 7263but... 7264I think it would be much more functional for modifying EXISTING (generated) timetables 7265 7266426--------------------------------------------------------- 7267From bachiri401: 7268 7269The possibility of choosing the colors in the timetables, instead of arbitrarily assigning random ones. 7270 7271427--------------------------------------------------------- 7272From Volker Dirr: 7273 7274Add the possibility of generating multiple with multi-threading for fet-cl (FET command-line). 7275 7276428--------------------------------------------------------- 7277From Vangelis Karafillidis (on forum): 7278 7279https://lalescu.ro/liviu/fet/forum/index.php?topic=4795.msg26561#msg26561 7280 72814) I think that FET works very well for solving timetables which do not need to be changed/modified during the school year. In my country (Greece), 7282most of the time teachers are hired "incrementally". So, most Greek schools need to change/modify their timetables around 10-15 times even up until April! 7283This means that one needs to be able to easily change/modify an already existing timetable. Under this perspective, a new feature of adding/removing/modifying 7284constraints on a existing timetable (in addition to locking/unlocking activities) would be highly useful. What about other countries? Do you need to modify 7285existing (FET generated) timetables during the school/academic year or not? 7286 72875) Sometimes, I needed to add identical constraints for the vast majority of teachers (for example max hours continuously = 4), while at the same time 7288a couple of teachers were an exception. I think that a new feature for adding constraints for (predefined) groups of teachers/students/rooms would be highly useful. 7289 72906) The constraints teachers/students/rooms not available times sometimes cause problems. I think that adding a button for displaying a report for 7291all teachers / all students / all rooms not available times would simplify the monitoring of these constraints. Especially, I think that for 7292rooms not available times with a weight <100, displaying the weight percentage in each time slot would be very useful. 7293 7294Another topic by Vangelis Karafillidis: 7295 7296https://lalescu.ro/liviu/fet/forum/index.php?topic=4797.0 7297 7298In my country (Greece), schools need to modify their timetables quite many times during the school year. The reason is that not all teachers are hired 7299at the beginning of the school year. Actually, teachers are hired "incrementally". So, up until February (or even March/April) schools need to change 7300their timetables, each time new teachers are hired. The problem is that there is a practical necessity of modifying the previous (existing) timetable 7301in such a way that each day "preserves" its activity content as much as possible. 7302 7303My suggestion is to add a button at the generated timetable view, so the user could select the activities he/she wants and add a constraint, 7304so that the selected activities would be placed in the new timetable in selected time slots. In this way, the timetable will change of course, 7305but it would not affect the test planning of the school, etc. 7306 7307What do other users think? Would this feature be useful for their schools? Greece might be an exception... Who knows? 7308 7309Alex Chernous: 7310 7311Fully agree. Lock time mean the one time slot, but in this case, it is necessary range of slots, usually one particular day, for all activities 7312in this range. For some teachers and some groups, I add special constraint for this, but not all of them. 7313 7314Greece not an exception. I live in Crimea, and I changed timetable 8 times in this year. 7315 7316429--------------------------------------------------------- 7317From bachiri401: 7318 7319The idea of threads = many instances of fet on the same file 7320 7321We used to run two (for example) instances of fet with the same file but this file is copied and renamed with a new name so as not to be confused 7322We run them to generate multiple timetables 7323One of them may generate 5 timtables whreas the second will genarate only 2 ………. 7324 7325This new idea of threads is so useful but it should as the previous one: 7326Each thread is given the number of timtables to generate (should be optional to the user) 7327Each generated timtable will be given the name (thread number+timtable number) eg 1.1 73281.2 7329 73302.1 2.2 ……………… 7331 7332430--------------------------------------------------------- 7333From bachiri401: 7334 7335He suggests that the constraints of type max room changes per week to consider the week as a whole. For instance, if the max room changes per week is 0, 7336we need to have the same room all over the week. Now the behavior is that on day 1 we can use room R1, on day 2 room R2, on day 3 again R1, and so on. 7337 7338Liviu Lalescu: I think this is impossible to change now, and incorrect. You could use the constraint activities occupy max different rooms. 7339 7340431--------------------------------------------------------- 7341From ghani1990 (on forum): 7342 7343https://lalescu.ro/liviu/fet/forum/index.php?topic=4795.msg26796#msg26796 7344 73451) I have a suggestion in the case of multiple timetables why I should delete the output folder every time, why the files are not output in new folders with 7346the same name with a number's suffix , 1,2,3 etc. 7347 73482) I suggest adding settings to choose the default mode of operation. 7349 7350Meaning instead of choosing the The mode of operation every time through the menu New, just I go once to settings and i set my default option. 7351 7352Why should this preferance exist? Because the Custom FET versions are basically each one belonging to a specific country or group, so I think it is better for 7353me to choose the mode once in the settings instead of choosing every time I create a new file! 7354 7355Thus, your work is wonderful in the endeavor to collect all copies in one copy, and at the same time it is easy to use the program as if it is directed to a 7356specific mode. 7357 7358Of course, these settings are optional, they can be edited by the user, or they can be left as they are now. 7359 7360432--------------------------------------------------------- 7361From Volker Dirr: 7362 7363In src/engine/generate.cpp and src/interface/timetablegenerateform.cpp and src/interface/timetablegeneratemultipleform.cpp, use std::atomic instead of 7364std::mutex on the Boolean variable testing if the generation was stopped, bool Generate::abortOptimization. And maybe use std::atomic instead of std::mutex 7365in other places. 7366 7367433--------------------------------------------------------- 7368From Khelifi Fouad Mohssen: 7369 7370If I (Liviu) understood correctly, he suggests to make the overall timetable, but to see it separately for each department. 7371 7372434--------------------------------------------------------- 7373From Darren McDonald and samantha.goddard (on forum): 7374 7375https://lalescu.ro/liviu/fet/forum/index.php?topic=4839.0 7376 7377For block planning mode: 7378 73791) Activities occupy max hours (blocks). For instance, if there are 3 sets of simultaneous activities, the user would like that they occupy at most 2 hours: 7380FET day 1 FET hours 2 and 3 and FET day 3 hour 3 (suggested by Darren McDonald and Samantha Goddard). 7381 73822) Activities not same hour (block) if in different days (suggested by Samantha Goddard). 7383 7384I do have another suggestion that would help with block planning (that may also be useful more generally). When selecting a set of activities 7385(for time constraints, etc.) it would be very helpful if there were a way to select all activities that do not have a specific activity tag, 7386teacher, etc. Would it be possible to add something like a "not" checkbox, or equivalent, to use when filtering activities? Very often with block planning 7387I have restrictions that should apply to all courses except one, so this would be very useful. 7388 7389435--------------------------------------------------------- 7390From djm (on forum): 7391 7392https://lalescu.ro/liviu/fet/forum/index.php?topic=4874.0 7393 7394He suggests the possibility to change the duration of all the activities multiplied/divided by a factor. For instance, if in reality the activities 7395have duration 50 minutes and they would like an activity to have 5 x 10 minutes duration. So all activities can be easily edited with a single click. 7396 7397Liviu Lalescu: This would be unfortunately a probably very seldom used facility. The user could use find+replace on the .fet XML file instead. 7398 7399436--------------------------------------------------------- 7400From Henrique Belo (on forum): 7401 7402https://lalescu.ro/liviu/fet/forum/index.php?topic=4938.0 7403 7404A lot of times we need to disable some activities, and to do that we need to enter the activity and unselect Active check box. 7405 7406In the list of time and space constraints there is a button that can enable and disable the constraint, I think this is very useful to us in the activities list. 7407 7408437--------------------------------------------------------- 7409From Mohamed Ait Ichou (on forum): 7410 7411https://lalescu.ro/liviu/fet/forum/index.php?topic=4940.0 7412 7413As for the relative weight, which is mandatory to be 100%, it is suggested to hide it from the user because it is not originally allowed to reduce it 7414to a lower percentage. 7415 7416438--------------------------------------------------------- 7417From Henrique Belo (on forum): 7418 7419https://lalescu.ro/liviu/fet/forum/index.php?topic=4942.0 7420 7421He suggests to add in the timetable view dialogs, in the details for the activity in the current selected slot, also the constraints which are related 7422to this activity. 7423 7424439--------------------------------------------------------- 7425From uni_instructor (on forum): 7426 7427https://lalescu.ro/liviu/fet/forum/index.php?topic=4830.0 7428 7429The most recent version of FET 6.0.2 does not support ALT-hotkeys for the menu bar. 7430I have attached two screenshots of version 6.0.2 and 5.49.1 7431 7432As you can see, FET 5.49.1 supports ALT-hotkeys whereas FET 6.0.2 does not. 7433Applying ALT+F should open the file menu but there is no reaction. 7434 7435Liviu: This is done by me. The reason is that on at least one platform, GNU/Linux with XFCE, my computer, the fields with accelerators appear shortened 7436in a bad way, like "&Institu ... mation" or something like that, when using the new Qt 6. So I decided to remove the Alt accelerators in FET version 6, 7437considering that they are not used by anybody, since anyway the mouse is much more important in the constraints, where there are no accelerators, and 7438the mouse is needed almost everywhere. 7439 7440Also suggested by rjmillett (by email to Liviu Lalescu): 7441 7442please consider keyboard shortcuts 7443Like 7444alt+f for file or similar 7445alt+d for data or similar 7446 7447currently we use alt + down arrow, etc to navigate by the keyboard 7448 7449it helps whenever the mouse gives trouble 7450 7451440--------------------------------------------------------- 7452From aroby (on forum and by email): 7453 7454https://lalescu.ro/liviu/fet/forum/index.php?topic=4960.0 7455 7456Between each two uses of a room from two activities with at least one students set attached to them, leave a pause of 1 hour (or a selectable integer 7457number of hours). This is done to ensure room sanitation due to Covid-19. 7458 7459441--------------------------------------------------------- 7460From Khineche Kaddour (on forum): 7461 7462https://lalescu.ro/liviu/fet/forum/index.php?topic=4977.0 7463 7464sometimes we need to change the weight of "constraint min days between a set of activities" for one teacher or one Subject in one time 7465so can you please add it in filter ? 7466 7467(in the filter of changing multiple constraints min days between activities with a single click.) 7468 7469Liviu: it would complicate the dialog. Instead, you could go to the all time constraints and apply a filter, then you can manually modify 7470the necessary constraints (I doubt there are too many for a single teacher - hmm, but for a subject there might be many). 7471 7472442--------------------------------------------------------- 7473From sasbland (on forum): 7474 7475https://lalescu.ro/liviu/fet/forum/index.php?topic=4988.0 7476 7477I wonder if there is a way to set the colours so that for the same subject, it shows the same colour in both student's and teacher's timetable. 7478At the moment, we often view the student's and teacher's timetable at the same time when we need to move classes around. It would help very much 7479if the same subject is in the same colour. 7480 7481Liviu: 7482 7483Now the colors are based on subject for students and on subject+students for teachers. We did it like this because usually the teacher teaches the same subject. 7484I will add this in the TODO list (for the official FET): A selectable FET setting "Color the teachers' activities by subject versus by subject+students". 7485 7486443--------------------------------------------------------- 7487From ben bacha sami: 7488 74891- J'ai plus que 50 enseignants : si je mets limite vide par 7490semaine (par exemple) pour tous les enseignants =2h 7491et si je veux qu’un enseignant X a limit vide par semaine =1h , je 7492dois préciser à chaque enseignant apart (limite vide par semaine=2h) 7493solution : les contraintes pour un enseignant doit être prioritaires 7494en face des contraintes pour tous les enseignants. 7495 7496Même chose pour un groupe et tous les groupes 7497 74982- Je suggère -pour les salles d’ajouter : 7499 limite heure / semaine- / jour 7500 limites vide/jours -/semaine 7501 75023- Problème d’optimisation : 7503une école qui possède 12 classes dans un seul niveau 7504chaque classe possède 3 matières de base –M1-M2-M3 7505 7506Pour M1 en a 6 enseignants 7507 M2 en a 4 enseignants 7508 M3 en a 3 enseignants 7509peut-on ajouter a fet une fonction qui peut optimiser l’affectation 7510des enseignants au classes pour un emploi idéal. 7511 7512Liviu: 7513 75141. If you have max gaps for all teachers = 2 and for a teacher max gaps 7515= 1, it will work correctly. Yes, you are right for min hours daily, 7516for instance; in this case you need to add individual constraints. It 7517is difficult to change now. 7518 75192. and 3. are unfortunately too difficult/impossible. 7520 7521444--------------------------------------------------------- 7522From fartoto_dz2004 (on forum): 7523 7524https://lalescu.ro/liviu/fet/forum/index.php?topic=5003.0 7525 7526i want to suggest a constraint for M-A mode that might be useful for me and others; i hope you can add a constraint that let two different teachers 7527start at same time (seance) or end at same time. 7528