Here you go. The solution has about 24% of the persons assigned two tasks and 76% one. Is it a matter of precision? Thank you so much! proc optmodel forcepresolve=1 presolver=3 fd=central misscheck; performance details; profile on percent=0.05; set persons; number id{persons}, x{persons}, cond1{persons}, cond2{persons}; read data test into persons=[id] x cond1 cond2 ; number sumX=sum{i in persons} x[i]; number target=0.1*sumX; /*targeting pool size information????*/ var assign {persons, 1..5} binary; var isTwo {persons} binary; set tasks = 1..5; var surplus {tasks} >= 0; var slack {tasks} >= 0; min objabs = sum {j in tasks} (surplus[j] + slack[j]); con obj_alt {j in tasks}: sum {i in persons} assign[i,j]* x[i] - surplus[j] + slack[j] = target; con taskId {j in 1..5}: sum {i in persons} assign[i,j] = 100; con no_more_2 {i in persons}: sum {j in 1..5} assign[i,j] <= 1 + isTwo[i]; con percent_1: sum {i in persons} isTwo[i] <= 0.22*sum {i in persons} (sum {j in 1..5} assign[i,j] - isTwo[i]); con percent_1: sum {i in persons} isTwo[i] >= 0.18*sum {i in persons} (sum {j in 1..5} assign[i,j] - isTwo[i]); con con_d1 {j in 1..5}: sum {i in persons} assign[i,j]* cond1[i] >= .10*100; con con_d2 {j in 1..5}: sum {i in persons} assign[i,j]* cond1[i] <= .15*100; con con_d3 {j in 1..5}: sum {i in persons} assign[i,j]* cond2[i] >= .10*100; expand; solve with milp obj objabs / absobjgap=0.001 primalin ; create data output from [persons task] = {{i in persons}, {j in 1..5}} in=assign; quit;
... View more