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-2026-white.png



April 27 – 30 | Gaylord Texan | Grapevine, Texas

Registration is open

Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!

Register now

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