1 #ifdef _WIN32 2 # include <malloc.h> 3 #else 4 #include <stdlib.h> 5 #endif 6 #include <assert.h> 7 8 #include "repair.h" 9 repair(struct rcps_problem * problem,struct rcps_genome * genome)10int repair(struct rcps_problem *problem, struct rcps_genome *genome) { 11 int i, j, k; 12 struct rcps_mode *cmode; 13 struct rcps_alternative *calternative; 14 struct rcps_alternative *palternative; 15 int icalternative; 16 int ipalternative; 17 // XXX perhasp only allocate this once in solver 18 int *load; 19 20 load = (int*)malloc(sizeof(int)*problem->resource_count); 21 22 for (i = 0; i < problem->job_count; i++) { 23 if (problem->jobs[i]->genome_position == -1) { 24 continue; 25 } 26 cmode = problem->jobs[i]->modes[genome->modes[ 27 problem->jobs[i]->genome_position]]; 28 /* check this job */ 29 for (j = 0; j < problem->resource_count; j++) { 30 load[j] = 0; 31 } 32 for (j = 0; j < cmode->request_count; j++) { 33 // XXX genome_index stuff 34 if (cmode->requests[j]->genome_position == -1) { 35 icalternative = 0; 36 } 37 else { 38 icalternative = genome->alternatives[ 39 cmode->requests[j]->genome_position]; 40 } 41 calternative = cmode->requests[j]->alternatives[icalternative]; 42 load[icalternative] += calternative->amount; 43 if (load[calternative->resource->index] > 44 calternative->resource->avail) { 45 /* this one needs repairs */ 46 for (k = 0; k < cmode->requests[j]->alternative_count; k++) { 47 if (cmode->requests[j]->alternatives[k] == calternative) { 48 continue; 49 } 50 palternative = cmode->requests[j]->alternatives[k]; 51 ipalternative = k; 52 load[icalternative] -= calternative->amount; 53 if ((load[ipalternative] + palternative->amount) 54 <= palternative->resource->avail) { 55 load[ipalternative] += palternative->amount; 56 genome->alternatives[j] = k; 57 break; 58 } 59 load[icalternative] += calternative->amount; 60 } 61 if (k == cmode->requests[j]->alternative_count) { 62 free(load); 63 return 0; 64 } 65 } 66 } 67 } 68 free(load); 69 return 1; 70 } 71