<?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 Re: Proc Optmodel sample average constraint in Mathematical Optimization, Discrete-Event Simulation, and OR</title>
    <link>https://communities.sas.com/t5/Mathematical-Optimization/Proc-Optmodel-sample-average-constraint/m-p/447833#M2212</link>
    <description>&lt;P&gt;You can linearize such a ratio constraint by clearing the denominator.&amp;nbsp; Look for "ratio constraint" in &lt;A href="http://go.documentation.sas.com/api/docsets/ormpex/14.3/content/ormpex.pdf?locale=en#nameddest=titlepage" target="_self"&gt;this book of examples&lt;/A&gt; in the SAS/OR documentation.&lt;/P&gt;</description>
    <pubDate>Thu, 22 Mar 2018 15:43:54 GMT</pubDate>
    <dc:creator>RobPratt</dc:creator>
    <dc:date>2018-03-22T15:43:54Z</dc:date>
    <item>
      <title>Proc Optmodel sample average constraint</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/Proc-Optmodel-sample-average-constraint/m-p/447828#M2211</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;I am trying to solve a simple implementation of a knapsack problem. My objective is to select maximum units of a plan keeping it constrained to the budget and an average cost. Data looks like this.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;**Please let me know if you need any other information.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="455"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="61"&gt;Network&lt;/TD&gt;
&lt;TD width="79"&gt;Daypart&amp;nbsp;&lt;/TD&gt;
&lt;TD width="68"&gt;Selling ID&amp;nbsp;&lt;/TD&gt;
&lt;TD width="68"&gt;Spot_ids&lt;/TD&gt;
&lt;TD width="50"&gt;Dollars&lt;/TD&gt;
&lt;TD width="87"&gt;New_budget&lt;/TD&gt;
&lt;TD width="42"&gt;cost&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;CBS&lt;/TD&gt;
&lt;TD&gt;Primetime&lt;/TD&gt;
&lt;TD&gt;20110&lt;/TD&gt;
&lt;TD&gt;22212&lt;/TD&gt;
&lt;TD&gt;348&lt;/TD&gt;
&lt;TD&gt;350&lt;/TD&gt;
&lt;TD&gt;25.00&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;CBS&lt;/TD&gt;
&lt;TD&gt;Primetime&lt;/TD&gt;
&lt;TD&gt;20112&lt;/TD&gt;
&lt;TD&gt;22213&lt;/TD&gt;
&lt;TD&gt;365&lt;/TD&gt;
&lt;TD&gt;350&lt;/TD&gt;
&lt;TD&gt;25.69&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;CBS&lt;/TD&gt;
&lt;TD&gt;Early Fringe&lt;/TD&gt;
&lt;TD&gt;20113&lt;/TD&gt;
&lt;TD&gt;22214&lt;/TD&gt;
&lt;TD&gt;380&lt;/TD&gt;
&lt;TD&gt;750&lt;/TD&gt;
&lt;TD&gt;35.00&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;CBS&lt;/TD&gt;
&lt;TD&gt;Early Fringe&lt;/TD&gt;
&lt;TD&gt;20113&lt;/TD&gt;
&lt;TD&gt;22215&lt;/TD&gt;
&lt;TD&gt;380&lt;/TD&gt;
&lt;TD&gt;750&lt;/TD&gt;
&lt;TD&gt;38.50&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;CBS&lt;/TD&gt;
&lt;TD&gt;Early Fringe&lt;/TD&gt;
&lt;TD&gt;20114&lt;/TD&gt;
&lt;TD&gt;22216&lt;/TD&gt;
&lt;TD&gt;375&lt;/TD&gt;
&lt;TD&gt;750&lt;/TD&gt;
&lt;TD&gt;22.50&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ABC&lt;/TD&gt;
&lt;TD&gt;Daytime&lt;/TD&gt;
&lt;TD&gt;30110&lt;/TD&gt;
&lt;TD&gt;22217&lt;/TD&gt;
&lt;TD&gt;290&lt;/TD&gt;
&lt;TD&gt;1500&lt;/TD&gt;
&lt;TD&gt;23.00&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ABC&lt;/TD&gt;
&lt;TD&gt;Daytime&lt;/TD&gt;
&lt;TD&gt;30110&lt;/TD&gt;
&lt;TD&gt;22218&lt;/TD&gt;
&lt;TD&gt;290&lt;/TD&gt;
&lt;TD&gt;1500&lt;/TD&gt;
&lt;TD&gt;25.00&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ABC&lt;/TD&gt;
&lt;TD&gt;Daytime&lt;/TD&gt;
&lt;TD&gt;30110&lt;/TD&gt;
&lt;TD&gt;22219&lt;/TD&gt;
&lt;TD&gt;290&lt;/TD&gt;
&lt;TD&gt;1500&lt;/TD&gt;
&lt;TD&gt;28.00&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ABC&lt;/TD&gt;
&lt;TD&gt;Daytime&lt;/TD&gt;
&lt;TD&gt;30112&lt;/TD&gt;
&lt;TD&gt;22220&lt;/TD&gt;
&lt;TD&gt;545&lt;/TD&gt;
&lt;TD&gt;1500&lt;/TD&gt;
&lt;TD&gt;32.50&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ABC&lt;/TD&gt;
&lt;TD&gt;Daytime&lt;/TD&gt;
&lt;TD&gt;30113&lt;/TD&gt;
&lt;TD&gt;22221&lt;/TD&gt;
&lt;TD&gt;548&lt;/TD&gt;
&lt;TD&gt;1500&lt;/TD&gt;
&lt;TD&gt;36.48&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ABC&lt;/TD&gt;
&lt;TD&gt;Primetime&lt;/TD&gt;
&lt;TD&gt;30114&lt;/TD&gt;
&lt;TD&gt;22222&lt;/TD&gt;
&lt;TD&gt;650&lt;/TD&gt;
&lt;TD&gt;1000&lt;/TD&gt;
&lt;TD&gt;42.50&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ABC&lt;/TD&gt;
&lt;TD&gt;Primetime&lt;/TD&gt;
&lt;TD&gt;30114&lt;/TD&gt;
&lt;TD&gt;22223&lt;/TD&gt;
&lt;TD&gt;650&lt;/TD&gt;
&lt;TD&gt;1000&lt;/TD&gt;
&lt;TD&gt;25.90&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ABC&lt;/TD&gt;
&lt;TD&gt;Primetime&lt;/TD&gt;
&lt;TD&gt;30115&lt;/TD&gt;
&lt;TD&gt;22224&lt;/TD&gt;
&lt;TD&gt;679&lt;/TD&gt;
&lt;TD&gt;1000&lt;/TD&gt;
&lt;TD&gt;33.30&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Optimization Code:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;
proc optmodel;
		   /* declare variables */
			
			set &amp;lt;str&amp;gt; SPOT_IDS;

			num Dollars {SPOT_IDS};
			num cost {SPOT_IDS};

/*Value is a value assinged to each unique Spot_id. For now it's all equal to 1*/
			num Value {SPOT_IDS};

/*Data temp is a small subset of entire dataset. It is one Network and 1 daypart at a time processing to reach to the new desired budget amount*/

			read data temp into SPOT_IDS = [Spot_Ids] Dollars cost Value;

			/* declare variables, objective, and constraints */
			var NumSelected {SPOT_IDS} binary;


			/*Objective Function*/
			max TotalValue = sum {i in SPOT_IDS} Dollars[i] * NumSelected[i];

			/*Budget Constraint*/
			con budgetCon:
      			sum {i in SPOT_IDS} Dollars[i] * NumSelected[i] &amp;lt;= New_Budget;

/*Cost Constraint*/
/***** Need help with this****/
/*****I need to average over i****/
/*****Cost Lower bound and Upper bound is the average Cost per Network Daypart multiplied with 0.75 for lower bound and 1.25 for upper bound*****/

			con costCon:

			&amp;amp;Cost_LB_per_Bucket &amp;lt;= (avg{i in SPOT_IDS} cost *  NumSelected[i]) &amp;lt;= &amp;amp;Cost_UB_per_Bucket;*/

		   /* call mixed integer linear programming (MILP) solver */
		    solve with MILP/RELOBJGAP=&amp;amp;RelGap;
			expand;

		/*create result in form of a dataset*/
			create data results_iter1 from
		        [Spot_Ids] = {i in SPOT_IDS}
		        selected_units_prop_dp = NumSelected [i]
		        Dollars= Dollars [i]
				;

		quit;

			

	%end;

&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Question:&lt;/P&gt;
&lt;P&gt;1. Is this the right way of handling this problem?&lt;/P&gt;
&lt;P&gt;2. Also how can I average over a sample without making it non linear? A simple sum over count makes it a non linear constraint. If it is a non linear constraint solving it using 'NLP' gives an error too.&lt;/P&gt;</description>
      <pubDate>Thu, 22 Mar 2018 15:36:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/Proc-Optmodel-sample-average-constraint/m-p/447828#M2211</guid>
      <dc:creator>SASEnthusiast</dc:creator>
      <dc:date>2018-03-22T15:36:04Z</dc:date>
    </item>
    <item>
      <title>Re: Proc Optmodel sample average constraint</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/Proc-Optmodel-sample-average-constraint/m-p/447833#M2212</link>
      <description>&lt;P&gt;You can linearize such a ratio constraint by clearing the denominator.&amp;nbsp; Look for "ratio constraint" in &lt;A href="http://go.documentation.sas.com/api/docsets/ormpex/14.3/content/ormpex.pdf?locale=en#nameddest=titlepage" target="_self"&gt;this book of examples&lt;/A&gt; in the SAS/OR documentation.&lt;/P&gt;</description>
      <pubDate>Thu, 22 Mar 2018 15:43:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/Proc-Optmodel-sample-average-constraint/m-p/447833#M2212</guid>
      <dc:creator>RobPratt</dc:creator>
      <dc:date>2018-03-22T15:43:54Z</dc:date>
    </item>
    <item>
      <title>Re: Proc Optmodel sample average constraint</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/Proc-Optmodel-sample-average-constraint/m-p/447973#M2213</link>
      <description>&lt;P&gt;Oh I feel so dumb. This was so simple. Thanks a lot. And the resource is really helpful too.&amp;nbsp;&lt;img id="smileyhappy" class="emoticon emoticon-smileyhappy" src="https://communities.sas.com/i/smilies/16x16_smiley-happy.png" alt="Smiley Happy" title="Smiley Happy" /&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 22 Mar 2018 21:49:52 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/Proc-Optmodel-sample-average-constraint/m-p/447973#M2213</guid>
      <dc:creator>SASEnthusiast</dc:creator>
      <dc:date>2018-03-22T21:49:52Z</dc:date>
    </item>
  </channel>
</rss>

