#include #include #include #include #include "subset.h" #include "input.h" #include "output.h" //Declaration of all functions bool borrelIterate(Output* out); bool obligationoverlap(int t, Subset* whenObligation,int n,Obligation* obligations,bool* borrelAtTime); bool borrelSubsetCanAttend(Output* out,Subset* borrelSubset,Subset* whenObligation,int i); Output borrel(Input* in); double calcValue(Subset* borrelSubs,double** matrix,int n,int m); Output test(Input* in); int updateAttendance(Output* out); void main(){ Input in = parser(); if(!isFeasible(&in)){ printf("The given input is infeasible\n"); return; } Output out = borrel(&in); printOutput(&in,&out); freeOutput(&out); } Output test(Input* in){ Output r = initOutput(in); r.s[0] = 1; r.s[1] = 2; updateAttendance(&r); return r; } bool obligationoverlap(int t, Subset* whenObligation,int n,Obligation* obligations,bool* borrelAtTime){ bool obligationAtTime[t]; for(int i=0;iin; bool borrelAtTime[in->t]; for(int j=0;jt;j++)borrelAtTime[j]=false; for(int h=0;hn;h++) if(borrelSubset->elem[h]) for(int j=out->s[h];jb[h]+out->s[h];j++) if(borrelAtTime[j])return false; else borrelAtTime[j] = true; for(int j=0;jnI[i];j++){ int leftover=0; for(int k=in->I[i][j].r;k<=in->I[i][j].d;k++) leftover+=!borrelAtTime[k]; if(leftoverI[i][j].p)return false; } for(int j=0;jnI[i];j++){ subsetInit(whenObligation+j,in->I[i][j].d-in->I[i][j].r+1); subsetInitSize(whenObligation+j,in->I[i][j].p,in->I[i][j].d-in->I[i][j].r+1); } while(obligationoverlap(in->t,whenObligation,in->nI[i],in->I[i],borrelAtTime)){ bool endOfIteration = true; for(int j=0;jnI[i];j++){ if(fixedSizeSubsetIterate(whenObligation+j)){ endOfIteration=false; break; }else{ subsetInitSize(whenObligation+j,whenObligation[j].size,whenObligation[j].n); } } if(endOfIteration)return false; } return true; } bool borrelIterate(Output* out){ Input* in = out->in; for(int h=0;hm;h++){ out->s[h]++; if(out->s[h]+in->b[h]<=in->t) return true; else out->s[h]=0; } return false; } // Input: // t: Amount of time slots // m: Amount of borrels // b: Amount of time slots per borrel // n: Amount of students // I: List of obligations per student // nI: Amount of obligations per student // Output: // s: Time slot that a borrel starts // att: The set of of borrels that a student can attend // return==-1: There is no feasible solution // return>=0: Amount of students that can attend the borrels in the optimum solution double calcValue(Subset* borrelSubs,double** matrix,int n,int m){ double value=0; for(int k=0;kin; out->maxValue =0; Subset* borrelSubs=malloc(sizeof(Subset)*in->n); for(int i=0;in;i++) subsetInit(borrelSubs+i,in->m); bool iterating=true; while(iterating){ Subset** obl = malloc(sizeof(Subset*)*in->n); bool validSubsets = true; for(int i=0;in;i++){ obl[i] = malloc(sizeof(Subset)*in->nI[i]); if(!borrelSubsetCanAttend(out,borrelSubs+i,obl[i],i)){ validSubsets = false; break; } } if(validSubsets){ double value = calcValue(borrelSubs,in->socialMatrix,in->n,in->m); if(value>out->maxValue){ out->obl=obl; out->maxValue = value; }else freeListofListofSubsets(obl,in->n,in->nI); } for(int i=0;in;i++){ if(subsetIterate(borrelSubs+i)){ iterating = true; break; } else{ subsetInitSize(borrelSubs+i,in->m,in->m); iterating =false; } } } for(int i=0;in;i++) subsetFree(borrelSubs+i); free(borrelSubs); //for(int i=0;in;i++){ // subsetInit(borrelSubs+i,in->m); // int maxAttendanceForStudent = 0; // do{ // Subset whenObligationTmp[in->nI[i]]; // for(int j=0;jnI[i];j++){ // subsetInit(whenObligationTmp+j, in->I[i][j].d-in->I[i][j].r+1); // } // // if(!borrelSubsetCanAttend(in->t,borrelSubs+i,in->b,out->s,in->I[i],in->nI[i],whenObligationTmp)) // continue; // if(borrelSubs[i].size>maxAttendanceForStudent){ // maxAttendanceForStudent = borrelSubs[i].size; // for(int j=0;jnI[i];j++){ // out->obl[i][j] = whenObligationTmp[j]; // } // // } // }while(subsetIterate(borrelSubs+i)); // out->maxTotAtt+=maxAttendanceForStudent; //} } Output borrel(Input* in){ Output out = initOutput(in); Output ret = initOutput(in); do{ updateAttendance(&out); if(ret.maxValue