BookmarkSubscribeRSS Feed
nehajain23
Calcite | Level 5

Hello, 

 

I am new to SAS and also using PROC OPTMODEL for the first time. I am trying to do unit commitment of generators. 

I have loads from hour 1 to 24. 

In a particular constraint, I wish to assign the next state of a variable based on a condition. 

Code : 

con count{i in PLANTS, j in HOUROP}:
if sum{i in PLANTS, j in HOUROP} use_plant[i,j] < pl_minup[i] then use_plant[i,j+1] = 1;

 

However, since my loads (j in HOUROP) has values from only 1 to 24, the following error appears 

Error: 

ERROR: The array subscript 'use_plant[1,25]' is invalid at line 217 column 68.
ERROR: The array subscript 'use_plant[2,25]' is invalid at line 217 column 68.
 
I need to limit this constraint to work only till hour =23. I am finding trouble in doing so. Would appreciate any kind of help. 
Thank you!
1 REPLY 1
RobPratt
SAS Super FREQ

To avoid the error, you can use a logical condition in the constraint declaration:

con count{i in PLANTS, j in HOUROP: j+1 in HOUROP}:

But you also need to rewrite the IF-THEN logic as a linear constraint.  Your desired implication is equivalent to its contrapositive:

/* if use_plant[i,j+1] = 0 then sum{i in PLANTS, j in HOUROP} use_plant[i,j] >= pl_minup[i] */

You can capture this with a big-M constraint:

pl_minup[i] - sum{i in PLANTS, j in HOUROP} use_plant[i,j] <= (pl_minup[i] - 0) * use_plant[i,j+1];

This simplifies to:

sum{i in PLANTS, j in HOUROP} use_plant[i,j] >= pl_minup[i] * (1 - use_plant[i,j+1]);

sas-innovate-white.png

Special offer for SAS Communities members

Save $250 on SAS Innovate and get a free advance copy of the new SAS For Dummies book! Use the code "SASforDummies" to register. Don't miss out, May 6-9, in Orlando, Florida.

 

View the full agenda.

Register now!

Discussion stats
  • 1 reply
  • 922 views
  • 0 likes
  • 2 in conversation