There is no built-in support for argmax of an array, but here are five ways to compute it yourself:
proc optmodel;
set MYSET = /a b c d e/;
num a {MYSET} = [13 100 37 100 42];
num max = max {i in MYSET} a[i];
put max=;
/* set of indices that achieve the max */
set ARGMAXSET = {i in MYSET: a[i] = max};
put ARGMAXSET=;
/* last index that achieves the precomputed max */
str argmax;
for {i in MYSET: a[i] = max} argmax = i;
put argmax=;
/* first index that achieves the precomputed max */
for {i in MYSET: a[i] = max} do;
argmax = i;
leave;
end;
put argmax=;
/* last index that achieves the max, calculated within the loop */
num max1 init -constant('BIG');
for {i in MYSET} do;
if max1 <= a[i] then do;
max1 = a[i];
argmax = i;
end;
end;
put max1= argmax=;
/* first index that achieves the max, calculated within the loop */
num max2 init -constant('BIG');
for {i in MYSET} do;
if max2 < a[i] then do;
max2 = a[i];
argmax = i;
end;
end;
put max2= argmax=;
quit;
For some examples of row generation in PROC OPTMODEL, see this SAS Global Forum paper...
http://support.sas.com/resources/papers/proceedings16/SAS3161-2016.pdf
...and the "Milk Collection" and "Lost Baggage Distribution" examples in the SAS/OR doc:
http://go.documentation.sas.com/?docsetId=ormpex&docsetVersion=14.2&docsetTarget=titlepage.htm&local...