# ------------------------------------------------ # ANTI-ASSIGNMENT PROBLEM: # Assign people to groups # so that groups are as heterogeneous as possible # ------------------------------------------------ # Version 2: Minimize "sum of deviations" # ------------------------------------------------ # To make this problem harder, # decrease sample and/or increase numberGrps. set ALL_PEOPLE ordered; param sample integer > 0; param selection integer >= 0, < sample; set PEOPLE := {i in ALL_PEOPLE: ord(i) mod sample = selection}; set CATEG; param type {ALL_PEOPLE,CATEG} symbolic; param typeWt {CATEG} >= 0; param numberGrps integer > 0; set TYPES {k in CATEG} := setof {i in PEOPLE} type[i,k]; var Assign {i in PEOPLE} integer >= 1, <= numberGrps; var MinInGrp integer <= floor (card(PEOPLE)/numberGrps); var MaxInGrp integer >= ceil (card(PEOPLE)/numberGrps); var MinType {k in CATEG, t in TYPES[k]} integer <= floor (card {i in PEOPLE: type[i,k] = t} / numberGrps); var MaxType {k in CATEG, t in TYPES[k]} integer >= ceil (card {i in PEOPLE: type[i,k] = t} / numberGrps); minimize Variation: (MaxInGrp - MinInGrp) + sum {k in CATEG, t in TYPES[k]} typeWt[k] * (MaxType[k,t] - MinType[k,t]); subj to MinInGrpDefn {j in 1..numberGrps}: MinInGrp <= numberof j in ({i in PEOPLE} Assign[i]); subj to MaxInGrpDefn {j in 1..numberGrps}: MaxInGrp >= numberof j in ({i in PEOPLE} Assign[i]); subj to MinTypeDefn {j in 1..numberGrps, k in CATEG, t in TYPES[k]}: MinType[k,t] <= numberof j in ({i in PEOPLE: type[i,k] = t} Assign[i]); subj to MaxTypeDefn {j in 1..numberGrps, k in CATEG, t in TYPES[k]}: MaxType[k,t] >= numberof j in ({i in PEOPLE: type[i,k] = t} Assign[i]);