/**********************************************************************/ data profit; input person $ job1-job3; cards; A 450 920 585 B 300 690 700 C 420 690 660 ; /**********************************************************************/ /* solve the problem */ proc assign maximum data=profit; cost job1-job3; id person; run; /**********************************************************************/ /* print the solution */ proc print; sum _fcost_; title 'Basic Assignment Problem'; run; /**********************************************************************/ data values; input job1-job3; cards; 450 670 900 390 750 875 420 885 800 500 780 950 ; /**********************************************************************/ proc iml; /* This module analyzes n1 problems involving */ /* n people each, where the people have */ /* ratings called pvals. */ start assign(pvals); /* start the module ASSIGN */ /* read the data set and */ /* create a matrix of job values */ use values; read all into xmat; n1=nrow(xmat); /* number of problems */ n=nrow(pvals); /* number of people to assign */ /* DO loop to analyze n1 problems */ do i=1 to n1; /* select each row of the */ /* job value matrix and sort it */ newx=xmat[i,]; rnewx=newx; newx[rank(newx)]=rnewx; /* sort the employee ratings */ rvals=pvals; pvals[rank(pvals)]=rvals; /* ascending sort */ /* calculate the total profit (cost) and */ /* append it to a vector called PROFITS */ profits=profits//sum(pvals#newx); end; /* of do i=1 to n1 */ problem=(1:n1)`; /* label for the output */ /* print the total profits for the problems */ print problem profits[f=dollar10.2]; finish; /* end of the module ASSIGN */ /* specify employee ratings for current example */ ratings={.50, .75, .90}; run assign(ratings); /* run the module */ /**********************************************************************/ rvals=pvals; pvals [n-rank(pvals)+1]=rvals; /**********************************************************************/ profmat=newx@pvals; create profits from profmat[colname={job1 job2 job3}]; append from profmat; /**********************************************************************/ data persons; input person $ @@; cards; A B C ; data profits; merge persons profits; run; /**********************************************************************/ proc print data=profits; title 'Profits Data'; run; /**********************************************************************/ proc iml; /* employee ratings */ ratings={.2 .25 .35, .45 .5 .3, .65 .75 .2}; jobs={1000 2000 3000}; /* job values */ profmat=ratings#jobs; /* create profits matrix */ print profmat; /* print profits matrix */ /**********************************************************************/ /* create the PROFITS data set from the PROFMAT matrix */ create profits from profmat[colname={job1 job2 job3}]; append from profmat; quit; /* exit SAS/IML software */ /* add the PERSON variable to the PROFITS data set */ data persons; input person $ @@; cards; A B C ; data profits; merge persons profits; /* run PROC ASSIGN */ proc assign maximum data=profits; cost job1-job3; id person; run; /* print the results */ proc print; title 'Assigning People to Jobs'; sum _fcost_; run; /**********************************************************************/ proc iml; /* matrix of employee ratings */ ratings={.2 .25 .35, .45 .5 .3, .65 .75 .2}; /* matrix of job values */ jobs={1000 2000 3000, 1500 1400 2000, 2500 1300 2200, 1600 2100 1300}; n=nrow(jobs); /* number of assignment problems */ n1=nrow(ratings); /* number of people to assign */ /* DO loop to analyze n problems */ do i=1 to n; num=j(n1,1,i); /* create the problem identifier */ /* create the assignment problem matrices, */ /* append the identifier to each matrix, */ /* append each matrix to the previous one */ profmat=profmat//(num||(ratings#jobs[i,])); end; /* of DO loop */ print profmat; /**********************************************************************/ create profits from profmat[colname= {problem job1 job2 job3}]; append from profmat; quit; /* exit SAS/IML software */ proc assign maximum data=profits; cost job1-job3; by problem; run; proc print; title 'Assigning People to Jobs'; sum _fcost_; by problem; run; /**********************************************************************/