Optimization using SAS OR package
There are multiple OR packages to solve the optimization problems at academic as well as industry levels. One of the best OR packages that I am using is the SAS OR package. It has a capability to model highly complex problems and program it if required. Most of the optimization algorithms have been implemented on SAS. In SAS we call Procedure to any function. There are many procedures which are SAS implementation of the OR algorithms. But there is a procedure called Proc Opt Model using which we can call different algorithms to solve any optimization problems. We can write programs also inside it implement some constraints which can not be directly coded. I think this is very powerful tool for an operational research analyst. I use this procedure to model the business problems. I learnt it myself by going through user documentation. The SAS document explains clearly how can we use SAS OR packages with examples. In fact all the examples given in the HP Williams Model Building in Mathematical Programming have been fully solved using SAS OR package.
Like any other Optimization package we have some standard steps to use it to solve an OR problem.
1. Index Declaration Indexing for parameters and decision variables.
For character indices
set <str>Item= {'a','b','c'};
set <str>Country_code = {'HK','UK','UAE'};
For numeric indices
set machine_code ={101,102,103} ;
If number of indices is large then we can read it from an external file or SAS data also which is explained later
2. Parameter declaration: using this we can declare the parameters like cost of the production at using a machine for an item type. We can also declare the demand s at each location. This is a declaration only. We are not reading the data here.
num Cost{Item, Machine_code};
num Demand{Item,Country_code };
One can notice that indices declared earlier are being used here in the parameter declaration. Once parameters are declared along with the necessary indices we can read the data. Reading the data differs depends upon the structure of the raw data (SAS data)
3. Data Read statements.
Read data ProductionCost into [Item, Machine_code] Cost;
Read data DemandData into [Item, Country_code ] Demand;
Cost data look like the table below
item machine_code Cost
a 101 45.00
a 102 40.00
a 103 43.00
b 101 41.00
b 102 40.00
b 103 46.00
c 101 35.00
c 102 44.00
c 103 46.00
DemandData look like the table below
item Country_code Demand
a HK 4005.00
a UK 4010.00
a UAE 4300.00
b HK 4100.00
b UK 4120.00
b UAE 2046.00
c HK 3500.00
c UK 4440.00
c UAE 4600.00
Here we could also read the indices using similar statement. But in that case any other read data statement which used this index can be declared after the declaration of the index otherwise Proc Optmodel will give an error.
5. Objective Function Declaration: We can use either max or min to declare the objective function depending upon the optimization problem. The example, taken here is the cost minimization problem so I will use min .
min TotalCost= /**Cost**/ sum {i in item, m in machine_code} Cost[i,m]*Production[i,m];
i in the sum min statement varies by values in the item and m by machine. It is similar to stating objective function using the mathematical form.
6. Declaration of the constraints: Constraint in the optimization problem can be declared using the Constraint keyword. We also have features to assign a name to constraints.
CONSTRAINT Max_demand {i in item, c in Country_code }:
sum {m in machine_code}Production[i,m] <= Demand[i,c];
Solve with lp /*** Invokes LP solver***/
Here we have a flexibility to invoke algorithm depending on the size and type of the problem, Heuristics can also be invoked.
8. Capturing the Output (Decision variables): Once Optimization problem is solved by default Proc optmodel produces the objective value only. To get the values of the decision variables one has to write simple SAS code.
create data solution /***user defined data set name****/
from [Item, Machine_code ] = {i in Item, m in Machine_code: Production[i,m].sol ne 0}
Prod_Quantity=Production;
The following lines reproduces the Proc Opt model syntax from the SAS OR documentation. There are many functionality which have not be used in the above example but depending upon the problem can be used.
PROC OPTMODEL options ;
Declaration Statements:
CONSTRAINT constraints ;
IMPVAR optimization expression declarations ;
MAX objective ;
MIN objective ;
NUMBER parameter declarations ;
PROBLEM problem declaration ;
SET < types > parameter declarations ;
STRING parameter declarations ;
VAR variable declarations ;
Programming Statements:
Assignment parameter = expression ;
CALL name ( expressions ) ;
CLOSEFILE files ;
CONTINUE ;
CREATE DATA SAS-data-set FROM columns ;
DO ; statements ; END ;
DO variable = specifications ; statements ; END ;
DO UNTIL ( logic ) ; statements ; END ;
DO WHILE ( logic ) ; statements ; END ;
DROP constraint ;
EXPAND name / options ;
FILE file ;
FIX variable = expression ;
FOR { index-set } statement ;
IF logic THEN statement ; ELSE statement ;
LEAVE ;
.null statement/ ;
PRINT print items ;
PUT put items ;
QUIT ;
READ DATA SAS-data-set INTO columns ;
RESET OPTIONS options ;
RESTORE constraint ;
SAVE MPS SAS-data-set ( OBJECTIVE | OBJ ) name ;
SAVE QPS SAS-data-set ( OBJECTIVE | OBJ ) name ;
SOLVE WITH solver OBJECTIVE name RELAXINT / options ;
STOP ;
UNFIX variable = expression ;
USE PROBLEM problem ;
Like any other Optimization package we have some standard steps to use it to solve an OR problem.
1. Index Declaration Indexing for parameters and decision variables.
For character indices
set <str>Item= {'a','b','c'};
set <str>Country_code = {'HK','UK','UAE'};
For numeric indices
set machine_code ={101,102,103} ;
If number of indices is large then we can read it from an external file or SAS data also which is explained later
2. Parameter declaration: using this we can declare the parameters like cost of the production at using a machine for an item type. We can also declare the demand s at each location. This is a declaration only. We are not reading the data here.
num Cost{Item, Machine_code};
num Demand{Item,Country_code };
One can notice that indices declared earlier are being used here in the parameter declaration. Once parameters are declared along with the necessary indices we can read the data. Reading the data differs depends upon the structure of the raw data (SAS data)
3. Data Read statements.
Read data ProductionCost into [Item, Machine_code] Cost;
Read data DemandData into [Item, Country_code ] Demand;
Cost data look like the table below
item machine_code Cost
a 101 45.00
a 102 40.00
a 103 43.00
b 101 41.00
b 102 40.00
b 103 46.00
c 101 35.00
c 102 44.00
c 103 46.00
DemandData look like the table below
item Country_code Demand
a HK 4005.00
a UK 4010.00
a UAE 4300.00
b HK 4100.00
b UK 4120.00
b UAE 2046.00
c HK 3500.00
c UK 4440.00
c UAE 4600.00
Here we could also read the indices using similar statement. But in that case any other read data statement which used this index can be declared after the declaration of the index otherwise Proc Optmodel will give an error.
4. Decision Variable Declaration: Now we should declare the decision variables using the var statements
Var Production {item,machine_code} >= 0; /* non negative decision variable*/
5. Objective Function Declaration: We can use either max or min to declare the objective function depending upon the optimization problem. The example, taken here is the cost minimization problem so I will use min .
min TotalCost= /**Cost**/ sum {i in item, m in machine_code} Cost[i,m]*Production[i,m];
i in the sum min statement varies by values in the item and m by machine. It is similar to stating objective function using the mathematical form.
6. Declaration of the constraints: Constraint in the optimization problem can be declared using the Constraint keyword. We also have features to assign a name to constraints.
CONSTRAINT Max_demand {i in item, c in Country_code }:
sum {m in machine_code}Production[i,m] <= Demand[i,c];
Verbally Supply of an item from all the Machines to a country should not exceed the demand at that country.
7. Invoking the solver: We can invoke any algorithm solve the problem. Here I am invoking Linear programming (LP)
Solve with lp /*** Invokes LP solver***/
Here we have a flexibility to invoke algorithm depending on the size and type of the problem, Heuristics can also be invoked.
8. Capturing the Output (Decision variables): Once Optimization problem is solved by default Proc optmodel produces the objective value only. To get the values of the decision variables one has to write simple SAS code.
create data solution /***user defined data set name****/
from [Item, Machine_code ] = {i in Item, m in Machine_code: Production[i,m].sol ne 0}
Prod_Quantity=Production;
Quit;
Prod_Quantity will be name of the field which has optimize decision variable values.
The table Solution will look like
Item Machine_code Prod_Quantity
a 101
a 102
a 103
b 101
b 102
b 103
c 101
c 102
c 103
a 102
a 103
b 101
b 102
b 103
c 101
c 102
c 103
PROC OPTMODEL options ;
Declaration Statements:
CONSTRAINT constraints ;
IMPVAR optimization expression declarations ;
MAX objective ;
MIN objective ;
NUMBER parameter declarations ;
PROBLEM problem declaration ;
SET < types > parameter declarations ;
STRING parameter declarations ;
VAR variable declarations ;
Programming Statements:
Assignment parameter = expression ;
CALL name ( expressions ) ;
CLOSEFILE files ;
CONTINUE ;
CREATE DATA SAS-data-set FROM columns ;
DO ; statements ; END ;
DO variable = specifications ; statements ; END ;
DO UNTIL ( logic ) ; statements ; END ;
DO WHILE ( logic ) ; statements ; END ;
DROP constraint ;
EXPAND name / options ;
FILE file ;
FIX variable = expression ;
FOR { index-set } statement ;
IF logic THEN statement ; ELSE statement ;
LEAVE ;
.null statement/ ;
PRINT print items ;
PUT put items ;
QUIT ;
READ DATA SAS-data-set INTO columns ;
RESET OPTIONS options ;
RESTORE constraint ;
SAVE MPS SAS-data-set ( OBJECTIVE | OBJ ) name ;
SAVE QPS SAS-data-set ( OBJECTIVE | OBJ ) name ;
SOLVE WITH solver OBJECTIVE name RELAXINT / options ;
STOP ;
UNFIX variable = expression ;
USE PROBLEM problem ;
Comments
Post a Comment