The following will work even if you have more than one p for each M observation. It is more efficient and less error-prone to avoid duplicating data, so I have retained two separate data sets:
data VData;
input cod $ vol;
datalines;
M1 100
M2 100
Mn 150
S1 300
S2 400
Sn 200
;
data PData;
input cod $ j pcs;
datalines;
M1 1 10
M2 1 10.5
Mn 1 11
S1 1 11
S1 2 11.5
S2 1 12
Sn 1 10.5
;
proc optmodel;
set <str> ISET;
num v {ISET};
read data VData into ISET=[cod] v=vol;
set <str,num> IJ;
num p {IJ};
read data PData into IJ=[cod j] p=pcs;
var X {IJ} binary;
min f = abs(sum {<i,j> in IJ} (if char(i,1) = 'M' then 1 else -1)*v[i]*p[i,j]*X[i,j]);
con OneValue {i in ISET}:
sum {<(i),j> in IJ} X[i,j] = 1;
solve linearize;
print X;
print {i in ISET} (sum {<(i),j> in IJ} p[i,j]*X[i,j]);
quit;
... View more