BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
Zakir
Obsidian | Level 7

Hi, 

I have the following code from this community. When I run the code, it works but I find that it does not give efficiency scores by year and region. Any help would be greatly appreciated. Thanks.

 

 

data inputs;
input input $8.;
datalines;
staff
showroom
;

 

data outputs;
input output $10.;
datalines;
beta_sales
profit
;

 

data garage_data;
input garage_name $ year region $ staff showroom alpha_sales beta_sales profit;
datalines;
Winchester 2020 A 7 8 10 12 8.5 4 2 0.6 1.5
Andover 2020 A 6 6 20 30 9 4.5 2.3 0.7 1.6
Basingstoke 2020 B 2 3 40 40 2 1.5 0.8 0.25 0.5
Poole 2020 B 14 9 20 25 10 6 2.6 0.86 1.9
Winchester 2021 A 10 9 10 10 11 5 2.4 1 2
Andover 2021 A 24 15 15 13 25 19 8 2.6 4.5
Basingstoke 2021 B 6 7 50 40 8.5 3 2.5 0.9 1.6
Poole 2021 B 8 7.5 5 8 9 4 2.1 0.85 2
;

 

proc sort data=garage_data;
by year region;
run;

 

data garage_data1;
set garage_data(keep=year region);
by year region;
if first.region;
run;

 

 

%macro compute(year=,region=);


proc optmodel ;


set <str> INPUTS;
read data inputs into INPUTS=[input];

 

set <str> OUTPUTS;

read data outputs into OUTPUTS=[output];

 

set <num> GARAGES ;

str garage_name {GARAGES};
num input {INPUTS, GARAGES};
num output {OUTPUTS, GARAGES};
read data garage_data(where=(year=&year and region="&region")) into GARAGES=[_N_] garage_name
{i in INPUTS} <input[i,_N_]=col(i)>
{i in OUTPUTS} <output[i,_N_]=col(I)>;

 

num k;
num efficiency_number {GARAGES};
num weight_sol {GARAGES, GARAGES};

 

var Weight {GARAGES} >= 0;
var Inefficiency >= 0;

 

max Objective = Inefficiency;

 

con Input_con {i in INPUTS}:
sum {j in GARAGES} input[i,j] * Weight[j] <= input[i,k];

 

con Output_con {i in OUTPUTS}:
sum {j in GARAGES} output[i,j] * Weight[j] >= output[i,k] * Inefficiency;

 

do k = GARAGES;
solve;
efficiency_number[k] = 1 / Inefficiency.sol;
for {j in GARAGES}
weight_sol[k,j] = (if Weight[j].sol > 1e-6 then Weight[j].sol else .);
end;

 

print garage_name efficiency_number;
create data efficiency_data from [garage] garage_name efficiency_number ;
quit;

%mend;

 

data _null_;
set garage_data1;
call execute(cats('%nrstr(%compute(year=',year,',region=',region,'))'));
run;

1 ACCEPTED SOLUTION
3 REPLIES 3

hackathon24-white-horiz.png

The 2025 SAS Hackathon has begun!

It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

Latest Updates

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 3 replies
  • 1034 views
  • 2 likes
  • 3 in conversation