<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Code with multiple constraints in Proc Optmodel, running slow, trying to improve efficiency in Mathematical Optimization, Discrete-Event Simulation, and OR</title>
    <link>https://communities.sas.com/t5/Mathematical-Optimization/Code-with-multiple-constraints-in-Proc-Optmodel-running-slow/m-p/114348#M677</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm trying to run the optimization pasted below in optmodel.&amp;nbsp; The program is running, whereas earlier I was getting an out of memory message.&amp;nbsp; However, it is very slow.&amp;nbsp; I tried to do what I could to make the code more efficient.&amp;nbsp; Any other ideas?&lt;/P&gt;&lt;P&gt;On average, i=3,000.&amp;nbsp; t=465 and k=3.&amp;nbsp; One problem may be that I need to use 465 constraints, but I have to have these constraints in place.&amp;nbsp; I can run a similar program in Proc IML in a fraction of the time, but Proc Optmodel is so flexible that I really need to migrate as much of my coding as possible. Thank you for whatever ideas you can offer.t&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc optmodel PRINTLEVEL=0;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *create a numerical index based on permno and date, read in below;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set &amp;lt;num,num&amp;gt; STOCKS_DATES;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *create another numerical index just based on dates;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set DATES = setof {&amp;lt;i,t&amp;gt; in STOCKS_DATES} t;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *create another numerical index just based on permnos;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set STOCKS {t in DATES} = slice(&amp;lt;*,t&amp;gt;, STOCKS_DATES);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *create a numerical index based on the characteristics upon which portfolio weights are based;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set CHARACTERISTICS = {'alpha', 'beta', 'stdfirm'};&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *name variables that will be read in from the data set;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; num char {STOCKS_DATES, CHARACTERISTICS};&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; num ret {STOCKS_DATES};&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *read in the sas data set, specifying that each column in the char matrix is a different characteristic, k;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; read data foriml into STOCKS_DATES=[permno obs]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {k in CHARACTERISTICS} &amp;lt;char[permno,obs,k]=col(k)&amp;gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var Theta {CHARACTERISTICS} init 0;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; impvar portmean = (1/card(DATES)) * (sum {t in DATES} (sum {i in STOCKS&lt;T&gt;} ((1/card(STOCKS&lt;T&gt;)) + (1/card(STOCKS&lt;T&gt;)) * sum {k in CHARACTERISTICS} Theta&lt;K&gt; * char[i,t,k]) * ret[i,t]));&lt;/K&gt;&lt;/T&gt;&lt;/T&gt;&lt;/T&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; impvar portvar = (1/card(DATES)) * (sum {t in DATES}(((sum {i in STOCKS&lt;T&gt;} ((1/card(STOCKS&lt;T&gt;)) + (1/card(STOCKS&lt;T&gt;)) * sum {k in CHARACTERISTICS} Theta&lt;K&gt; * char[i,t,k]) * ret[i,t])-portmean)**2));&lt;/K&gt;&lt;/T&gt;&lt;/T&gt;&lt;/T&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; impvar sumneg_w {t in DATES} = sum {i in STOCKS&lt;T&gt;} min(((1/card(STOCKS&lt;T&gt;)) + (1/card(STOCKS&lt;T&gt;)) * sum {k in CHARACTERISTICS} Theta&lt;K&gt; * char[i,t,k]),0);&lt;/K&gt;&lt;/T&gt;&lt;/T&gt;&lt;/T&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; con short50 {t in DATES}: sumneg_w&lt;T&gt; &amp;gt;= -0.5 ;&lt;/T&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; max Objective1 = portmean - (&amp;amp;y/2) * portvar;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Problem Prob1 Include Theta short50 Objective1;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; USE PROBLEM Prob1;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; solve with NLP OBJ Objective1 / ms;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 20 Jun 2013 17:47:57 GMT</pubDate>
    <dc:creator>opti_miser</dc:creator>
    <dc:date>2013-06-20T17:47:57Z</dc:date>
    <item>
      <title>Code with multiple constraints in Proc Optmodel, running slow, trying to improve efficiency</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/Code-with-multiple-constraints-in-Proc-Optmodel-running-slow/m-p/114348#M677</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm trying to run the optimization pasted below in optmodel.&amp;nbsp; The program is running, whereas earlier I was getting an out of memory message.&amp;nbsp; However, it is very slow.&amp;nbsp; I tried to do what I could to make the code more efficient.&amp;nbsp; Any other ideas?&lt;/P&gt;&lt;P&gt;On average, i=3,000.&amp;nbsp; t=465 and k=3.&amp;nbsp; One problem may be that I need to use 465 constraints, but I have to have these constraints in place.&amp;nbsp; I can run a similar program in Proc IML in a fraction of the time, but Proc Optmodel is so flexible that I really need to migrate as much of my coding as possible. Thank you for whatever ideas you can offer.t&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc optmodel PRINTLEVEL=0;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *create a numerical index based on permno and date, read in below;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set &amp;lt;num,num&amp;gt; STOCKS_DATES;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *create another numerical index just based on dates;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set DATES = setof {&amp;lt;i,t&amp;gt; in STOCKS_DATES} t;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *create another numerical index just based on permnos;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set STOCKS {t in DATES} = slice(&amp;lt;*,t&amp;gt;, STOCKS_DATES);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *create a numerical index based on the characteristics upon which portfolio weights are based;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set CHARACTERISTICS = {'alpha', 'beta', 'stdfirm'};&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *name variables that will be read in from the data set;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; num char {STOCKS_DATES, CHARACTERISTICS};&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; num ret {STOCKS_DATES};&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *read in the sas data set, specifying that each column in the char matrix is a different characteristic, k;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; read data foriml into STOCKS_DATES=[permno obs]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {k in CHARACTERISTICS} &amp;lt;char[permno,obs,k]=col(k)&amp;gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var Theta {CHARACTERISTICS} init 0;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; impvar portmean = (1/card(DATES)) * (sum {t in DATES} (sum {i in STOCKS&lt;T&gt;} ((1/card(STOCKS&lt;T&gt;)) + (1/card(STOCKS&lt;T&gt;)) * sum {k in CHARACTERISTICS} Theta&lt;K&gt; * char[i,t,k]) * ret[i,t]));&lt;/K&gt;&lt;/T&gt;&lt;/T&gt;&lt;/T&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; impvar portvar = (1/card(DATES)) * (sum {t in DATES}(((sum {i in STOCKS&lt;T&gt;} ((1/card(STOCKS&lt;T&gt;)) + (1/card(STOCKS&lt;T&gt;)) * sum {k in CHARACTERISTICS} Theta&lt;K&gt; * char[i,t,k]) * ret[i,t])-portmean)**2));&lt;/K&gt;&lt;/T&gt;&lt;/T&gt;&lt;/T&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; impvar sumneg_w {t in DATES} = sum {i in STOCKS&lt;T&gt;} min(((1/card(STOCKS&lt;T&gt;)) + (1/card(STOCKS&lt;T&gt;)) * sum {k in CHARACTERISTICS} Theta&lt;K&gt; * char[i,t,k]),0);&lt;/K&gt;&lt;/T&gt;&lt;/T&gt;&lt;/T&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; con short50 {t in DATES}: sumneg_w&lt;T&gt; &amp;gt;= -0.5 ;&lt;/T&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; max Objective1 = portmean - (&amp;amp;y/2) * portvar;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Problem Prob1 Include Theta short50 Objective1;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; USE PROBLEM Prob1;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; solve with NLP OBJ Objective1 / ms;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 20 Jun 2013 17:47:57 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/Code-with-multiple-constraints-in-Proc-Optmodel-running-slow/m-p/114348#M677</guid>
      <dc:creator>opti_miser</dc:creator>
      <dc:date>2013-06-20T17:47:57Z</dc:date>
    </item>
    <item>
      <title>Re: Code with multiple constraints in Proc Optmodel, running slow, trying to improve efficiency</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/Code-with-multiple-constraints-in-Proc-Optmodel-running-slow/m-p/114349#M678</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;You might try making portmean an explicit variable instead, to reduce the density of the expression for portvar.&amp;nbsp; Replace the impvar portmean statement with:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;var portmean;&lt;/P&gt;&lt;P&gt;con portmean_con:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; portmean = (1/card(DATES)) * (sum {t in DATES} (sum {i in STOCKS&lt;T&gt;} ((1/card(STOCKS&lt;T&gt;)) + (1/card(STOCKS&lt;T&gt;)) * sum {k in CHARACTERISTICS} Theta&lt;K&gt; * char[i,t,k]) * ret[i,t]));&lt;/K&gt;&lt;/T&gt;&lt;/T&gt;&lt;/T&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 04 Jul 2013 16:49:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/Code-with-multiple-constraints-in-Proc-Optmodel-running-slow/m-p/114349#M678</guid>
      <dc:creator>RobPratt</dc:creator>
      <dc:date>2013-07-04T16:49:23Z</dc:date>
    </item>
  </channel>
</rss>

