BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Vane07
Fluorite | Level 6
Hi everyone, 

I am writing to you in hoping that someone would be able to help me. I am new in proc optmodel so i had really take time to learn the basic in
proc optmodel language before starting to solve my problem.
So, I am trying to solve a quadratic problem ( in 9.4 sas version ) with a minimizing function that is based of a
likelihood maximum formulation. In that way I have two tables :tableau 1 that contains my real X (188 rows and 8836 columns) and Marges that contains my real Y (188 rows, 188 columns).

What I want is that estimates X and Y that respond to this function like for each row (i) of the two tables (that means for X and Y ) we have
min f = [(X(to estimate) - X( real in "tableau"))**2/X(real)] + [(Y(to estimate) - Y(real in "Marges"))**2 / Y(real)]
following to the constraint that the sum of X - Y = 0 ( for each rows of the two tables ).

In my code the programm runs until the reading data step, there is no syntax error and it gives me the right format of my data but when i run the code with resolving part
I have the note : "out of memory" and it stopped. I've already changed my size of sas with (memsize 0) but when i re-run it is always in "out of memory".
Actually, my problem is that i really don't know if the problem is really the memory or if it's my syntax code wich that is not good.
So if you see the code below : do you think that the problem is that my code is not correct ?
Thanks for advance for the answer and hope that the question is clear (forgive about my english)
proc optmodel; 
		
	/* I Tableau des M reels 										 */ 
	/*************************************************************/
			/* declaration de paramètre */ 
			set zone1 = 1..8836; 
			set <num> C1; 
			number trafic1{C1, zone1};

			/* Lecture de la table */ 
			read data Tableau1 into 
				C1 = [_N_] 
				{r in zone1} < trafic1[_N_, r]=col("Z"||r) >;
			print trafic1; 

	/* II Tableau des contraintes réels ==> Y réels						*/
	/*********************************************************************/
			set Cont1 = 1..188; 
			set <num> N1; 
			number Marge1{N1, Cont1};

			/* Lecture de la table */
			read data Marges into 
				N1 = [_N_] 
				{m in Cont1} < Marge1[_N_, m]=col("O"||m) >;
			print Marge1; 

	/* V Resolution  												*/ 
	/*********************************************************************/
		/* V-1) Déclaration de variables */ 
		var  x{i in C1, d in zone1} >= 0 ;
		var  y{j in N1, o in cont1} >= 0 ;
	

		/* V-2) La fonction objective : minimisation de la variance */ 
		minimize f = sum{i in C1, d in zone1} ((X[i, d] - trafic1[i, d])**2/trafic1[i, d]) +
					 sum{j in N1 , o in cont1} (( Y[j, o]- Marge1[j, o])**2/Marge1[j, o]);


		/* V-3) subject to the following constraints */
		Con Bornes {i in C1, d in zone1, j in N1, o in cont1} :(X[i, d] - Y[j, o]) = 0;

	solve;

	print {i in C1, d in zone1: X[i, d] > 0} X ;
	
quit;


 

1 ACCEPTED SOLUTION

Accepted Solutions
RobPratt
SAS Super FREQ

It looks like you have some data issues (missing values and mixture of Z and VAR column names), but I think I see what you are trying to do.  You wanted 188 constraints, but you declared 188*8836*188*188 = 58.7 billion constraints instead.  Try this:

Con Bornes {i in C1}: sum {d in zone1} X[i, d] = sum {o in cont1} Y[i, o];

A good way to make sure your model is correct is to use the EXPAND statement on a smaller instance.

View solution in original post

9 REPLIES 9
RobPratt
SAS Super FREQ

Can you please share the data?

Vane07
Fluorite | Level 6

Thanks for replying . I have attached two files ("tableau" ( "marges"). 

 

RobPratt
SAS Super FREQ

I see only one attachment (marges.csv).

Vane07
Fluorite | Level 6

Here are the dataset compressed. I think it would be more accorded to my code posted before for understanding. 

 

Vane07
Fluorite | Level 6

I have attached two reduced files because the orginals are too bigs. So instead of having (188 row, 8836 colums for tableau1 ) and (188 rows, 188 for marges), i send you (12 rows, 12 colums for tableau1 ) and (12 rows, 12 colums for marges).

Thanks

RobPratt
SAS Super FREQ

This smaller instance solves instantly but yields a constant optimal solution with all variables equal to 0.010473.  I suspect that your Bornes constraint is not really what you want.  Your text description mentioned a sum, but that constraint does not contain any sum.

Vane07
Fluorite | Level 6

First I think i gave you a wrong reduced dataset for tableau1_set because  for C1 = 1..12, I should give you a dataset with 12 rows and 144 columns (+C1).  I don't know if there is a consequences for the resolution . Anyway I compressed the originals dataset ( that is attached with this mail ), i think it is better because of my error is about the note : "out of memory" that we would not see with the smaller contains. 

 

About the constraint, in the orginal dataset, what i want for contraints is that 

   if tableau1 have 188 rows and 8836 columns 

   if marges have 188 rows and 188 columns 

 

      Constraint 1 :  (X1+....+X8836) - ( Y1+....+Y188)   =0; (row 1)

       Constraint 2 :  (X1+....+X8836) - ( Y1+....+Y188)   =0; (row1)

 

         .....

      Constraint 188 : (X1+....+X8836) - ( Y1+....+Y188)   =0; (row188)

 

So i write the code like that Bornes {i in C1, d in zone1, j in N1, o in cont1} :(X[i, d] - Y[j, o]) = 0;

because i just want him to make sum operation for each row from row 1 to row 188. I don't know what exactly he does with this code. 

 

RobPratt
SAS Super FREQ

It looks like you have some data issues (missing values and mixture of Z and VAR column names), but I think I see what you are trying to do.  You wanted 188 constraints, but you declared 188*8836*188*188 = 58.7 billion constraints instead.  Try this:

Con Bornes {i in C1}: sum {d in zone1} X[i, d] = sum {o in cont1} Y[i, o];

A good way to make sure your model is correct is to use the EXPAND statement on a smaller instance.

Vane07
Fluorite | Level 6

Thank you for your answer ! 

 

You understood very well what i wanted to do with the constraint. It was exactly what I wanted, i didn't know about the expand statement and I see it is  a very good way to look after the code. So this morning i tried with your correction of the syntax (with expand) and I see that it write exactly the model and it solves very quickly so thank you very much beacause it helped me very well. 

However, I see that the solutions is not very good but I think it is more in my model than in the code sas. Also , I see a note that sas changed the solver to NLP instead of QP so I'm gonna take a look at my model if it very optimal.

I also want to tell you that with the originals dataset, when I run the program I still needed to change the memsize to 0 then it solves in 19 second ( better with 188 constraint of course 🙂 ) . 

 

Thank you again and I'll come back to you this evening if I find that it is my model wich us not goog or the QP solver is not adapted. 

 

 

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

Multiple Linear Regression in SAS

Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.

Find more tutorials on the SAS Users YouTube channel.

Discussion stats
  • 9 replies
  • 1612 views
  • 1 like
  • 2 in conversation