colles now prioritize creneaux with restrictions + added configs for MPI/*.

This commit is contained in:
Alexandre 2024-09-07 18:22:37 +02:00
parent 4597723d70
commit bbcdfe259c
8 changed files with 242 additions and 36 deletions

3
.gitignore vendored
View File

@ -56,4 +56,5 @@ obj/
bin/ bin/
output.csv output.csv
*.log *.log
output-S3.csv output-S3.csv
output-MPI.csv

72
MPI-colleurs.txt Normal file
View File

@ -0,0 +1,72 @@
Bouverot
MATH
18 16 9 2024
8 18 9 2024
+
Sabban
MATH
14 18 9 2024
+
Giral-Martinez
MATH
17 18 9 2024
18 18 9 2024
+
Pelletier
MATH
17 17 9 2024
18 17 9 2024
+
Riveline
MATH
17 17 9 2024
18 17 9 2024
+
Dailly
MATH
17 17 9 2024
18 17 9 2024
+
Thiébaud
PHYSICS
16 20 9 2024
+
Pignard
PHYSICS
17 18 9 2024
18 18 9 2024
+
Creuset
PHYSICS
14 19 9 2024
15 19 9 2024
+
Chevalier
PHYSICS
17 17 9 2024
+
Robin
PHYSICS
17 18 9 2024
+
Montarou
ENGLISH
16 18 9 2024
17 18 9 2024
18 18 9 2024
+
Graff
ENGLISH
16 18 9 2024
17 18 9 2024
18 18 9 2024
+
LeLouarne
ENGLISH
18 18 9 2024
+
Halfon
INFO
14 19 9 2024
+
$

27
MPI-creneaux.txt Normal file
View File

@ -0,0 +1,27 @@
18 16 9 2024
17 17 9 2024
17 17 9 2024
17 17 9 2024
17 17 9 2024
18 17 9 2024
18 17 9 2024
18 17 9 2024
8 18 9 2024
14 18 9 2024
16 18 9 2024
16 18 9 2024
17 18 9 2024
17 18 9 2024
17 18 9 2024
17 18 9 2024
17 18 9 2024
18 18 9 2024
18 18 9 2024
18 18 9 2024
18 18 9 2024
18 18 9 2024
14 19 9 2024
14 19 9 2024+
15 19 9 2024
16 20 9 2024
$

View File

@ -6,10 +6,13 @@ LFLAGS=
all: bin/colloscope all: bin/colloscope
test: bin/colloscope test: bin/colloscope
bin/colloscope -v S3-creneaux.txt 31 S3-colleurs.txt 16 7 15 1000 output-S3.csv 3 6 bin/colloscope -v S3-creneaux.txt 31 S3-colleurs.txt 16 7 15 3000 output-S3.csv 3 6
mpi-all: bin/colloscope
bin/colloscope -v MPI-creneaux.txt 26 MPI-colleurs.txt 15 12 14 10000 output-MPI.csv 3 999999
mem: bin/ mem: bin/
valgrind --leak-check=full ./bin/colloscope -v S3-creneaux.txt 31 S3-colleurs.txt 16 7 15 100 output-S3.csv 3 6 valgrind --leak-check=full ./bin/colloscope -v S3-creneaux.txt 21 S3-colleurs.txt 16 7 15 100 output-S3.csv 3 6
OBJECTS = obj/structure.o obj/algorithm.o obj/display.o obj/logger.o obj/main.o OBJECTS = obj/structure.o obj/algorithm.o obj/display.o obj/logger.o obj/main.o
bin/colloscope: $(OBJECTS) bin/colloscope: $(OBJECTS)

View File

@ -1,29 +1,101 @@
14 23 4 2024 14 18 9 2024
T-3-1 T-2-2
1 1
9
10
13
2 2
3
+ +
12 22 4 2024 14 18 9 2024
T-1-1 T-4-3
1
2
3 3
5
7
8
11
+ +
14 24 4 2024 14 18 9 2024
T-1-1 T-4-1
1 4
2 6
3 12
14
+ +
13 22 4 2024 14 19 9 2024
T-1-1 T-2-1
1
9
10
13
2
+
14 19 9 2024
T-4-2
3
5
7
8
11
+
14 19 9 2024
T-4-4
4
6
12
14
+
15 19 9 2024
T-2-1
1
9
10
13
2
+
15 19 9 2024
T-4-2
3
5
7
8
11
+
15 19 9 2024
T-4-4
4
6
12
14
+
14 18 9 2024
T-2-2
8
9
10
11
12
13
14
+
14 18 9 2024
T-2-1
1 1
2 2
3 3
4
5
6
7
+ +
$ $

View File

@ -192,6 +192,9 @@ int free_math_space(creneau* edt, int len_edt, int id) {
return howmany; return howmany;
} }
static int* perm0 ;
static int perm0len ;
void add_colles_for_group_MP2I(int* weeks_len, creneau* edt, int len_edt, colleur* chads, int len_chads, int n_weeks, int grp, topic start_rotation, int mth, int inf, int* skip_count, int mat_halt, int info_app) { void add_colles_for_group_MP2I(int* weeks_len, creneau* edt, int len_edt, colleur* chads, int len_chads, int n_weeks, int grp, topic start_rotation, int mth, int inf, int* skip_count, int mat_halt, int info_app) {
topic rotation = start_rotation; // physics/english rotation topic rotation = start_rotation; // physics/english rotation
int math = mth; // math (3/4) int math = mth; // math (3/4)
@ -215,6 +218,8 @@ void add_colles_for_group_MP2I(int* weeks_len, creneau* edt, int len_edt, colleu
int math_dude = 0; // length of colleur* int math_dude = 0; // length of colleur*
int weeklen; int weeklen;
bool is_searching_in_blacklisted = true ;
bool normal_skip = true; bool normal_skip = true;
for(int week = 0; week < n_weeks; week++) { for(int week = 0; week < n_weeks; week++) {
@ -242,9 +247,10 @@ void add_colles_for_group_MP2I(int* weeks_len, creneau* edt, int len_edt, colleu
normal_skip = true; normal_skip = true;
info++; info++;
is_searching_in_blacklisted = true ;
// info colle // info colle
while(info >= info_app) { while(info >= info_app) {
if(edt[k+r%weeklen].mat == NOTHING && edt[k+r%weeklen].length == 2) { if(edt[k+r%weeklen].mat == NOTHING && edt[k+r%weeklen].length == 2 && (!is_searching_in_blacklisted || edt[k+r%weeklen].blacklisted == true)) {
// if creneau is empty // if creneau is empty
// import all colleurs available // import all colleurs available
colleur* dudes = get_colleurs(chads, len_chads, edt[k+r%weeklen].date, &len_dudes); colleur* dudes = get_colleurs(chads, len_chads, edt[k+r%weeklen].date, &len_dudes);
@ -273,9 +279,12 @@ void add_colles_for_group_MP2I(int* weeks_len, creneau* edt, int len_edt, colleu
} }
free(dudes); free(dudes);
} }
if(!found && halt > weeklen) { if(!found && halt > 2*weeklen) {
info = 0; info = 0;
*skip_count += (1-normal_skip); *skip_count += (1-normal_skip);
warn("skipping info colle for group %d (week %d)", grp, week);
} else if(halt > weeklen) {
is_searching_in_blacklisted = false ;
} }
r++; r++;
halt++; halt++;
@ -285,11 +294,12 @@ void add_colles_for_group_MP2I(int* weeks_len, creneau* edt, int len_edt, colleu
found = false; found = false;
halt = 0; halt = 0;
normal_skip = true; normal_skip = true;
is_searching_in_blacklisted = true ;
// if there is a math colle to add, enter this loop // if there is a math colle to add, enter this loop
while(remaining_to_add == 2) { while(remaining_to_add == 2) {
if(edt[k+r%weeklen].mat == NOTHING && edt[k+r%weeklen].length == 1) { if(edt[k+r%weeklen].mat == NOTHING && edt[k+r%weeklen].length == 1 && (!is_searching_in_blacklisted || edt[k+r%weeklen].blacklisted == true)) {
// if creneau is empty // if creneau is empty
// import all colleurs available // import all colleurs available
colleur* dudes = get_colleurs(chads, len_chads, edt[k+r%weeklen].date, &len_dudes); colleur* dudes = get_colleurs(chads, len_chads, edt[k+r%weeklen].date, &len_dudes);
@ -318,12 +328,17 @@ void add_colles_for_group_MP2I(int* weeks_len, creneau* edt, int len_edt, colleu
} }
} }
free(perm); free(perm);
} else {
error("No colleurs available at (%d %d %d %d)", edt[k+r%weeklen].date.hour, edt[k+r%weeklen].date.day, edt[k+r%weeklen].date.month, edt[k+r%weeklen].date.year);
} }
free(dudes); free(dudes);
} }
if(!found && halt > weeklen) { if(!found && halt > 2*weeklen) {
remaining_to_add--; remaining_to_add--;
*skip_count += 1; *skip_count += 1;
warn("skipping math colle for group %d (week %d)", grp, week);
} else if(halt > weeklen) {
is_searching_in_blacklisted = false ;
} }
r++; r++;
halt++; halt++;
@ -332,10 +347,12 @@ void add_colles_for_group_MP2I(int* weeks_len, creneau* edt, int len_edt, colleu
r = rand()%weeklen; r = rand()%weeklen;
found = false; found = false;
halt = 0; halt = 0;
is_searching_in_blacklisted = true ;
// do it again for physics/english colles // do it again for physics/english colles
while(remaining_to_add == 1) { while(remaining_to_add == 1) {
if(edt[k+r%weeklen].mat == NOTHING && edt[k+r%weeklen].length == 1) { normal_skip = true;
if(edt[k+r%weeklen].mat == NOTHING && edt[k+r%weeklen].length == 1 && (!is_searching_in_blacklisted || edt[k+r%weeklen].blacklisted == true)) {
colleur* dudes = get_colleurs(chads, len_chads, edt[k+r%weeklen].date, &len_dudes); colleur* dudes = get_colleurs(chads, len_chads, edt[k+r%weeklen].date, &len_dudes);
len_perm = len_dudes; len_perm = len_dudes;
if(len_dudes != 0) { if(len_dudes != 0) {
@ -356,15 +373,22 @@ void add_colles_for_group_MP2I(int* weeks_len, creneau* edt, int len_edt, colleu
found = true; found = true;
remaining_to_add--; remaining_to_add--;
} }
} else if(edt[k+r%weeklen].allow_grps[grp-1] == true) {
normal_skip = false;
} }
} }
free(perm); free(perm);
} else {
error("No colleurs available at (%d %d %d %d)", edt[k+r%weeklen].date.hour, edt[k+r%weeklen].date.day, edt[k+r%weeklen].date.month, edt[k+r%weeklen].date.year);
} }
free(dudes); free(dudes);
} }
if(!found && halt > weeks_len[week]) { if(!found && halt > 2*weeklen) {
remaining_to_add--; remaining_to_add--;
*skip_count += 1; *skip_count += 1;
warn("skipping L2 colle for group %d (week %d)", grp, week);
} else if(halt > weeklen) {
is_searching_in_blacklisted = false ;
} }
r++; r++;
halt++; halt++;
@ -415,7 +439,7 @@ int max(int x, int y) {
} }
int score(creneau* edt, int len_edt, int grp, int n_weeks) { int score(creneau* edt, int len_edt, int grp, int n_weeks) {
int score = 100; int score = n_weeks*300;
int dist = 0; int dist = 0;
for(int i = 0; i < len_edt; i++) { for(int i = 0; i < len_edt; i++) {
@ -425,9 +449,6 @@ int score(creneau* edt, int len_edt, int grp, int n_weeks) {
if(dist == 0) { if(dist == 0) {
score -= 4; score -= 4;
} }
/*if(str_equal(edt[i].name, edt[j].name)) {
score -= max(0, 28-dist);
}*/
if(dist == 7 && edt[i].date.hour == edt[j].date.hour) { if(dist == 7 && edt[i].date.hour == edt[j].date.hour) {
score -= 5; score -= 5;
} }
@ -659,7 +680,7 @@ void aux_2(creneau* edt, int len_edt, colleur* chads, int len_chads, int n_group
} }
current++; current++;
} }
//printf("----------------------------\n"); debug("---------------------- %d ----------------------", n_groups);
int* group_stats = malloc(sizeof(int)*n_groups); int* group_stats = malloc(sizeof(int)*n_groups);
int* group_temp = malloc(sizeof(int)*n_groups); int* group_temp = malloc(sizeof(int)*n_groups);
@ -677,15 +698,16 @@ void aux_2(creneau* edt, int len_edt, colleur* chads, int len_chads, int n_group
int** occ_data = generate_matrix(n_groups, len_chads, 0);; int** occ_data = generate_matrix(n_groups, len_chads, 0);;
info("Testing %d combinations...", n_sim); info("Testing %d combinations...", n_sim);
printf("\n"); printf("\n");
perm0 = malloc(sizeof(int)*20) ;
for(int k = 0; k < n_sim*(1 - (max_score == n_groups*100)); k++) { for(int k = 0; k < n_sim*(1 - (max_score == n_groups*100)); k++) {
if(k >= a) { if(k >= a) {
printf("\x1b[1F"); printf("\x1b[1F");
printf("\x1b[2K"); printf("\x1b[2K");
info("%d%% Completed (current max is %d/%d)", 100*a/n_sim, max_score, 100*n_groups); info("%d%% Completed (current max is %d/%d)", 100*a/n_sim, max_score, n_weeks*300*n_groups);
a += n_sim/100; a += n_sim/100;
} }
local_score = 0; local_score = 0;
local_min = 100; local_min = 909090909;
skipped = 0; skipped = 0;
for(int i = 0; i < n_groups; i++) { for(int i = 0; i < n_groups; i++) {
add_colles_for_group_MP2I(weeks_len, edt, len_edt, chads, len_chads, n_weeks, i+1, (topic)(2+i%2), i%math_halt, i%info_app, &skipped, math_halt, info_app); add_colles_for_group_MP2I(weeks_len, edt, len_edt, chads, len_chads, n_weeks, i+1, (topic)(2+i%2), i%math_halt, i%info_app, &skipped, math_halt, info_app);
@ -700,7 +722,7 @@ void aux_2(creneau* edt, int len_edt, colleur* chads, int len_chads, int n_group
local_group = i+1; local_group = i+1;
} }
} }
local_score -= skipped*30; local_score -= skipped*200;
if(local_score > max_score) { if(local_score > max_score) {
max_score = local_score; max_score = local_score;
screwed_group = local_group; screwed_group = local_group;
@ -720,14 +742,14 @@ void aux_2(creneau* edt, int len_edt, colleur* chads, int len_chads, int n_group
printf("\x1b[1F"); printf("\x1b[1F");
printf("\x1b[2K"); printf("\x1b[2K");
if(max_score == 100*n_groups) { if(max_score == n_weeks*300*n_groups) {
info("Interrupting early due to a perfect score achieved"); info("Interrupting early due to a perfect score achieved");
} else { } else {
info("100%% Completed, best score is %d/%d (without skip penalty) with %d skipped colle(s)", max_score+global_skipped*30, 100*n_groups, global_skipped); info("100%% Completed, best score is %d/%d (without skip penalty) with %d skipped colle(s)", max_score+global_skipped*30, n_groups*n_weeks*300, global_skipped);
info("Most screwed group is %d with a score of %d/100", screwed_group, global_min); info("Most screwed group is %d with a score of %d/%d", screwed_group, global_min, n_weeks*300);
debug("Stats for all groups are :"); debug("Stats for all groups are :");
for(int i = 0; i < n_groups; i++) { for(int i = 0; i < n_groups; i++) {
debug("Group %d : %d/100", i+1, group_stats[i]); debug("Group %d : %d/%d (or %lf %%)", i+1, group_stats[i], n_weeks*300, ((double)group_stats[i]/(n_weeks*3.0)));
} }
} }
int end = time(NULL); int end = time(NULL);
@ -738,6 +760,7 @@ void aux_2(creneau* edt, int len_edt, colleur* chads, int len_chads, int n_group
print_arr(occ_data[k], len_chads); print_arr(occ_data[k], len_chads);
} }
info("Took %ds to find", end-start); info("Took %ds to find", end-start);
free(perm0);
free(group_stats); free(group_stats);
free(group_temp); free(group_temp);
free(weeks_len); free(weeks_len);

View File

@ -309,6 +309,7 @@ creneau* import_creneaux_oneweek(char* filename, int len_file, int n_weeks, int
edt[i].salle.building = 'N'; edt[i].salle.building = 'N';
edt[i].salle.id = 0; edt[i].salle.id = 0;
edt[i].length = 1; edt[i].length = 1;
edt[i].blacklisted = false ;
edt[i].allow_grps = malloc(sizeof(bool)*n_groups); edt[i].allow_grps = malloc(sizeof(bool)*n_groups);
for(int ii = 0; ii < n_groups; ii++) { for(int ii = 0; ii < n_groups; ii++) {
edt[i].allow_grps[ii] = true; edt[i].allow_grps[ii] = true;
@ -349,6 +350,7 @@ creneau* import_creneaux_oneweek(char* filename, int len_file, int n_weeks, int
edt[k*len_file+i].salle.id = 0; edt[k*len_file+i].salle.id = 0;
edt[k*len_file+i].length = edt[i].length; edt[k*len_file+i].length = edt[i].length;
edt[k*len_file+i].allow_grps = malloc(sizeof(bool)*n_groups); edt[k*len_file+i].allow_grps = malloc(sizeof(bool)*n_groups);
edt[k*len_file+i].blacklisted = false ;
for(int ii = 0; ii < n_groups; ii++) { for(int ii = 0; ii < n_groups; ii++) {
edt[k*len_file+i].allow_grps[ii] = true; edt[k*len_file+i].allow_grps[ii] = true;
} }
@ -547,9 +549,11 @@ void import_tds(creneau* edt, int len_edt, int len_oneweek, char* filename) {
//info("[%d, %d]", buffer, edtptr + k*len_oneweek); //info("[%d, %d]", buffer, edtptr + k*len_oneweek);
//usleep(1000000); //usleep(1000000);
edt[edtptr + k*len_oneweek].allow_grps[buffer-1] = false; edt[edtptr + k*len_oneweek].allow_grps[buffer-1] = false;
edt[edtptr + k*len_oneweek].blacklisted = true;
while(equal_d(edt[edtptr + k*len_oneweek].date, edt[edtptr + k*len_oneweek + os].date)) { while(equal_d(edt[edtptr + k*len_oneweek].date, edt[edtptr + k*len_oneweek + os].date)) {
//info("[%d, %d]", buffer, edtptr + k*len_oneweek + os); //info("[%d, %d]", buffer, edtptr + k*len_oneweek + os);
edt[edtptr + k*len_oneweek + os].allow_grps[buffer-1] = false; edt[edtptr + k*len_oneweek + os].allow_grps[buffer-1] = false;
edt[edtptr + k*len_oneweek + os].blacklisted = true ;
os++; os++;
} }
k++; k++;
@ -563,11 +567,15 @@ void import_tds(creneau* edt, int len_edt, int len_oneweek, char* filename) {
//usleep(1000000); //usleep(1000000);
if((k+ban_init)%ban_cooldown == 0) { if((k+ban_init)%ban_cooldown == 0) {
edt[edtptr + k*len_oneweek].allow_grps[buffer-1] = false; edt[edtptr + k*len_oneweek].allow_grps[buffer-1] = false;
edt[edtptr + k*len_oneweek].blacklisted = true;
//info("banning at week %d for group %d", k, buffer);
} }
while(equal_d(edt[edtptr + k*len_oneweek].date, edt[edtptr + k*len_oneweek + os].date)) { while(equal_d(edt[edtptr + k*len_oneweek].date, edt[edtptr + k*len_oneweek + os].date)) {
//info("[%d, %d]", buffer, edtptr + k*len_oneweek + os); //info("[%d, %d]", buffer, edtptr + k*len_oneweek + os);
if((k+ban_init)%ban_cooldown == 0) { if((k+ban_init)%ban_cooldown == 0) {
edt[edtptr + k*len_oneweek + os].allow_grps[buffer-1] = false; edt[edtptr + k*len_oneweek + os].allow_grps[buffer-1] = false;
edt[edtptr + k*len_oneweek + os].blacklisted = true ;
//info("banning at week %d for group %d", k, buffer);
} }
os++; os++;
} }

View File

@ -40,7 +40,7 @@ typedef struct room {char building; int id;} room;
// rooms // rooms
// building can be C, M, R or V // building can be C, M, R or V
typedef struct creneau {int length; date date; int group; char* name; int namelen; topic mat; room salle; bool* allow_grps;} creneau; typedef struct creneau {int length; date date; int group; char* name; int namelen; topic mat; room salle; bool* allow_grps; bool blacklisted;} creneau;
// one créneau de colle // one créneau de colle
// /!\ creneau has to be sorted by ascending dates // /!\ creneau has to be sorted by ascending dates
// with edt being a creneau*, it is required to have edt[0] be a Monday and edt[len(edt)-1] has to be a Friday // with edt being a creneau*, it is required to have edt[0] be a Monday and edt[len(edt)-1] has to be a Friday