<?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: How do I use proc optmodel to solve for desired multiplier in Mathematical Optimization, Discrete-Event Simulation, and OR</title>
    <link>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/394027#M1987</link>
    <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data regiondata;
   input region $ target;
   datalines;
Central 0.05
West    0.04
South   0.06
East    0.10
;

proc optmodel;
   set &amp;lt;str&amp;gt; CARS;
   str region {CARS};
   num msrp {CARS};
   num invoice {CARS};
   num discount {CARS};
   read data indata into CARS=[make] region msrp invoice discount;

   set &amp;lt;str&amp;gt; REGIONS;
   num target {REGIONS};
   read data regiondata into REGIONS=[region] target;

   set CARS_reg {reg in REGIONS} = {car in CARS: region[car] = reg};
 
   var Multiplier {REGIONS};
   impvar AdjInvoice {car in CARS} = invoice[car] * Multiplier[region[car]];
   con MyCon {reg in REGIONS}:
      1 - (sum {car in CARS_reg[reg]} AdjInvoice[car]) / (sum {car in CARS_reg[reg]} msrp[car]) = target[reg];

   solve noobj;
   print Multiplier;

   /* or just skip the solver call and algebraically solve for Multiplier */
   for {reg in REGIONS} Multiplier[reg] = 
      ((1 - target[reg]) * (sum {car in CARS_reg[reg]} msrp[car]) / (sum {car in CARS_reg[reg]} invoice[car]));
   print Multiplier;

   create data outdata from [make] region msrp invoice discount AdjInvoice;
quit;

proc sort data=outdata;
   by region;
run;

proc print data=outdata;
   by region;
   sum msrp invoice AdjInvoice;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Thu, 07 Sep 2017 19:54:10 GMT</pubDate>
    <dc:creator>RobPratt</dc:creator>
    <dc:date>2017-09-07T19:54:10Z</dc:date>
    <item>
      <title>How do I use proc optmodel to solve for desired multiplier</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/393892#M1983</link>
      <description>&lt;P&gt;I am wondering if I can replicate my current process of utilizing excel's solver function in SAS (using proc optmodel?). I have a dataset of cars, msrp, invoice, and discount. In attached file you can see&amp;nbsp;each car has its own discount. In aggregate, all the cars have a weighted discount of 8.66%. My desire is to be able to target different aggregate discounts by using a multiplier - the multiplier would be used with the invoice amount to calculate an adjusted invoice. For example, if I wanted a target aggregate discount of 5.00%, what would my multiplier have to be? I currently use solver setting my objective to a value of 5.00% by changing the multiplier cell (B45). In this example, solver calculated 1.04. The invoice*multipler = adj_invoice for each car. In aggregate the sum of all the adj_invoice is $1,205,474 - when you compare this to the msrp you will find the discount is 5.00%. Is this possible with proc optmodel? If not, any other potential solutions? Thank you so much!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Here is my example dataset:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000080" face="Courier New" size="3"&gt;&lt;STRONG&gt;data&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; indata;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;input&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; make $ msrp invoice discount;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;datalines&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt;;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;Acura 36945 33337 0.097658682&lt;/P&gt;&lt;P&gt;Audi 25940 23508 0.093754819&lt;/P&gt;&lt;P&gt;BMW 37000 33873 0.084513514&lt;/P&gt;&lt;P&gt;Buick 37895 34357 0.093363241&lt;/P&gt;&lt;P&gt;Cadillac 52795 48377 0.083682167&lt;/P&gt;&lt;P&gt;Chevrolet 42735 37422 0.124324324&lt;/P&gt;&lt;P&gt;Chrysler 17985 16919 0.059271615&lt;/P&gt;&lt;P&gt;Dodge 32235 29472 0.085714286&lt;/P&gt;&lt;P&gt;Ford 41475 36494 0.120096444&lt;/P&gt;&lt;P&gt;GMC 31890 28922 0.093069928&lt;/P&gt;&lt;P&gt;Honda 20140 18451 0.083862959&lt;/P&gt;&lt;P&gt;Hummer 49995 45815 0.083608361&lt;/P&gt;&lt;P&gt;Hyundai 21589 20201 0.064292001&lt;/P&gt;&lt;P&gt;Infiniti 28495 26157 0.082049482&lt;/P&gt;&lt;P&gt;Isuzu 31849 29977 0.058777356&lt;/P&gt;&lt;P&gt;Jaguar 29995 27355 0.088014669&lt;/P&gt;&lt;P&gt;Jeep 27905 25686 0.079519799&lt;/P&gt;&lt;P&gt;Kia 19635 18630 0.05118411&lt;/P&gt;&lt;P&gt;Land-Rover 72250 65807 0.089176471&lt;/P&gt;&lt;P&gt;Lexus 45700 39838 0.128271335&lt;/P&gt;&lt;P&gt;Lincoln 52775 46360 0.121553766&lt;/P&gt;&lt;P&gt;MINI 16999 15437 0.091887758&lt;/P&gt;&lt;P&gt;Mazda 21087 19742 0.063783374&lt;/P&gt;&lt;P&gt;Mercedes-Benz 76870 71540 0.069337843&lt;/P&gt;&lt;P&gt;Mercury 29995 27317 0.089281547&lt;/P&gt;&lt;P&gt;Mitsubishi 30492 28330 0.070903844&lt;/P&gt;&lt;P&gt;Nissan 33840 30815 0.089391253&lt;/P&gt;&lt;P&gt;Oldsmobile 18825 17642 0.062841965&lt;/P&gt;&lt;P&gt;Pontiac 21595 19810 0.082658023&lt;/P&gt;&lt;P&gt;Porsche 56665 49865 0.12000353&lt;/P&gt;&lt;P&gt;Saab 30860 29269 0.051555412&lt;/P&gt;&lt;P&gt;Saturn 20585 19238 0.065435997&lt;/P&gt;&lt;P&gt;Scion 12965 12340 0.04820671&lt;/P&gt;&lt;P&gt;Subaru 19945 18399 0.077513161&lt;/P&gt;&lt;P&gt;Suzuki 23699 22307 0.058736656&lt;/P&gt;&lt;P&gt;Toyota 20510 18926 0.077230619&lt;/P&gt;&lt;P&gt;Volkswagen 35515 32243 0.092130086&lt;/P&gt;&lt;P&gt;Volvo 41250 38851 0.058157576&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 07 Sep 2017 14:36:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/393892#M1983</guid>
      <dc:creator>dsklein12</dc:creator>
      <dc:date>2017-09-07T14:36:02Z</dc:date>
    </item>
    <item>
      <title>Re: How do I use proc optmodel to solve for desired multiplier</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/393914#M1984</link>
      <description>FYI - I've moved this post to the optimization forum so hopefully the right people can answer your questions.</description>
      <pubDate>Thu, 07 Sep 2017 15:13:30 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/393914#M1984</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2017-09-07T15:13:30Z</dc:date>
    </item>
    <item>
      <title>Re: How do I use proc optmodel to solve for desired multiplier</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/393930#M1985</link>
      <description>&lt;P&gt;Yes, you can replicate these results by calling the LP solver in PROC OPTMODEL, or you can just algebraically solve the equation:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%let target_discount = 0.05;
proc optmodel;
   set &amp;lt;str&amp;gt; CARS;
   num msrp {CARS};
   num invoice {CARS};
   num discount {CARS};
   read data indata into CARS=[make] msrp invoice discount;
   
   var Multiplier;
   impvar AdjInvoice {car in CARS} = invoice[car] * Multiplier;
   con MyCon:
      1 - (sum {car in CARS} AdjInvoice[car]) / (sum {car in CARS} msrp[car]) = &amp;amp;target_discount;

   solve noobj;
   print Multiplier;

   /* or just skip the solver call and algebraically solve for Multiplier */
   Multiplier = ((1 - &amp;amp;target_discount) * (sum {car in CARS} msrp[car]) / (sum {car in CARS} invoice[car]));
   print Multiplier;

   create data outdata from [make] msrp invoice discount AdjInvoice;
quit;

proc print data=outdata;
   sum msrp invoice discount AdjInvoice;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 07 Sep 2017 15:43:52 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/393930#M1985</guid>
      <dc:creator>RobPratt</dc:creator>
      <dc:date>2017-09-07T15:43:52Z</dc:date>
    </item>
    <item>
      <title>Re: How do I use proc optmodel to solve for desired multiplier</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/394008#M1986</link>
      <description>&lt;P&gt;Wow, that's great! Thank you!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;If you don't mind, wondering if I can add a layer of complexity? What if the data was broken out into regions and each region had their own target discount - meaning each region would have their own multiplier. Would there be a way to loop through and calculate a multiplier for each region?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For example:&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000080" face="Courier New" size="3"&gt;&lt;STRONG&gt;data&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; indata;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;input&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; region $ make $ msrp invoice discount;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;datalines&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt;;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;Central Acura 36945 33337 0.097658682&lt;/P&gt;&lt;P&gt;Central Audi 25940 23508 0.093754819&lt;/P&gt;&lt;P&gt;Central BMW 37000 33873 0.084513514&lt;/P&gt;&lt;P&gt;Central Buick 37895 34357 0.093363241&lt;/P&gt;&lt;P&gt;Central Cadillac 52795 48377 0.083682167&lt;/P&gt;&lt;P&gt;Central Chevrolet 42735 37422 0.124324324&lt;/P&gt;&lt;P&gt;Central Chrysler 17985 16919 0.059271615&lt;/P&gt;&lt;P&gt;Central Dodge 32235 29472 0.085714286&lt;/P&gt;&lt;P&gt;Central Ford 41475 36494 0.120096444&lt;/P&gt;&lt;P&gt;Central GMC 31890 28922 0.093069928&lt;/P&gt;&lt;P&gt;West Honda 20140 18451 0.083862959&lt;/P&gt;&lt;P&gt;West Hummer 49995 45815 0.083608361&lt;/P&gt;&lt;P&gt;West Hyundai 21589 20201 0.064292001&lt;/P&gt;&lt;P&gt;West Infiniti 28495 26157 0.082049482&lt;/P&gt;&lt;P&gt;West Isuzu 31849 29977 0.058777356&lt;/P&gt;&lt;P&gt;West Jaguar 29995 27355 0.088014669&lt;/P&gt;&lt;P&gt;West Jeep 27905 25686 0.079519799&lt;/P&gt;&lt;P&gt;West Kia 19635 18630 0.05118411&lt;/P&gt;&lt;P&gt;West Land-Rover 72250 65807 0.089176471&lt;/P&gt;&lt;P&gt;West Lexus 45700 39838 0.128271335&lt;/P&gt;&lt;P&gt;West Lincoln 52775 46360 0.121553766&lt;/P&gt;&lt;P&gt;South MINI 16999 15437 0.091887758&lt;/P&gt;&lt;P&gt;South Mazda 21087 19742 0.063783374&lt;/P&gt;&lt;P&gt;South Mercedes-Benz 76870 71540 0.069337843&lt;/P&gt;&lt;P&gt;South Mercury 29995 27317 0.089281547&lt;/P&gt;&lt;P&gt;South Mitsubishi 30492 28330 0.070903844&lt;/P&gt;&lt;P&gt;South Nissan 33840 30815 0.089391253&lt;/P&gt;&lt;P&gt;South Oldsmobile 18825 17642 0.062841965&lt;/P&gt;&lt;P&gt;South Pontiac 21595 19810 0.082658023&lt;/P&gt;&lt;P&gt;South Porsche 56665 49865 0.12000353&lt;/P&gt;&lt;P&gt;South Saab 30860 29269 0.051555412&lt;/P&gt;&lt;P&gt;East Saturn 20585 19238 0.065435997&lt;/P&gt;&lt;P&gt;East Scion 12965 12340 0.04820671&lt;/P&gt;&lt;P&gt;East Subaru 19945 18399 0.077513161&lt;/P&gt;&lt;P&gt;East Suzuki 23699 22307 0.058736656&lt;/P&gt;&lt;P&gt;East Toyota 20510 18926 0.077230619&lt;/P&gt;&lt;P&gt;East Volkswagen 35515 32243 0.092130086&lt;/P&gt;&lt;P&gt;East Volvo 41250 38851 0.058157576&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;%let&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt;&amp;nbsp;central_target = 0.05;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;%let&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt;&amp;nbsp;west_target = 0.04;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;%let&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt;&amp;nbsp;south_target = 0.06;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;%let&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt;&amp;nbsp;east_target = 0.10;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT face="Courier New" size="3"&gt;Very much appreciated!&lt;/FONT&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 07 Sep 2017 19:27:51 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/394008#M1986</guid>
      <dc:creator>dsklein12</dc:creator>
      <dc:date>2017-09-07T19:27:51Z</dc:date>
    </item>
    <item>
      <title>Re: How do I use proc optmodel to solve for desired multiplier</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/394027#M1987</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data regiondata;
   input region $ target;
   datalines;
Central 0.05
West    0.04
South   0.06
East    0.10
;

proc optmodel;
   set &amp;lt;str&amp;gt; CARS;
   str region {CARS};
   num msrp {CARS};
   num invoice {CARS};
   num discount {CARS};
   read data indata into CARS=[make] region msrp invoice discount;

   set &amp;lt;str&amp;gt; REGIONS;
   num target {REGIONS};
   read data regiondata into REGIONS=[region] target;

   set CARS_reg {reg in REGIONS} = {car in CARS: region[car] = reg};
 
   var Multiplier {REGIONS};
   impvar AdjInvoice {car in CARS} = invoice[car] * Multiplier[region[car]];
   con MyCon {reg in REGIONS}:
      1 - (sum {car in CARS_reg[reg]} AdjInvoice[car]) / (sum {car in CARS_reg[reg]} msrp[car]) = target[reg];

   solve noobj;
   print Multiplier;

   /* or just skip the solver call and algebraically solve for Multiplier */
   for {reg in REGIONS} Multiplier[reg] = 
      ((1 - target[reg]) * (sum {car in CARS_reg[reg]} msrp[car]) / (sum {car in CARS_reg[reg]} invoice[car]));
   print Multiplier;

   create data outdata from [make] region msrp invoice discount AdjInvoice;
quit;

proc sort data=outdata;
   by region;
run;

proc print data=outdata;
   by region;
   sum msrp invoice AdjInvoice;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 07 Sep 2017 19:54:10 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/394027#M1987</guid>
      <dc:creator>RobPratt</dc:creator>
      <dc:date>2017-09-07T19:54:10Z</dc:date>
    </item>
    <item>
      <title>Re: How do I use proc optmodel to solve for desired multiplier</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/394031#M1988</link>
      <description>&lt;P&gt;Absolutely genius. Thank you so much!&lt;/P&gt;</description>
      <pubDate>Thu, 07 Sep 2017 20:00:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/394031#M1988</guid>
      <dc:creator>dsklein12</dc:creator>
      <dc:date>2017-09-07T20:00:46Z</dc:date>
    </item>
    <item>
      <title>Re: How do I use proc optmodel to solve for desired multiplier</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/396959#M1997</link>
      <description>&lt;P&gt;Hi Robb -&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;After further using the code you've provided, I've found that I will have instances where the same car will be found in multiple regions. This creates problem with the read data into statement, resulting in observations being left out of the optmization. Is there a way to read in two key variables (thereby creating a unique region-car key)?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks!&lt;/P&gt;</description>
      <pubDate>Mon, 18 Sep 2017 20:47:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/396959#M1997</guid>
      <dc:creator>dsklein12</dc:creator>
      <dc:date>2017-09-18T20:47:37Z</dc:date>
    </item>
    <item>
      <title>Re: How do I use proc optmodel to solve for desired multiplier</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/397906#M1998</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc optmodel;
   set &amp;lt;str,str&amp;gt; REGIONS_CARS;
   num msrp {REGIONS_CARS};
   num invoice {REGIONS_CARS};
   num discount {REGIONS_CARS};
   read data indata into REGIONS_CARS=[region make] msrp invoice discount;

   set &amp;lt;str&amp;gt; REGIONS;
   num target {REGIONS};
   read data regiondata into REGIONS=[region] target;

   var Multiplier {REGIONS};
   impvar AdjInvoice {&amp;lt;reg,car&amp;gt; in REGIONS_CARS} = invoice[reg,car] * Multiplier[reg];
   con MyCon {reg in REGIONS}:
      1 - (sum {&amp;lt;(reg),car&amp;gt; in REGIONS_CARS} AdjInvoice[reg,car]) / (sum {&amp;lt;(reg),car&amp;gt; in REGIONS_CARS} msrp[reg,car]) = target[reg];

   solve noobj;
   print Multiplier;

   /* or just skip the solver call and algebraically solve for Multiplier */
   for {reg in REGIONS} Multiplier[reg] = 
      ((1 - target[reg]) * (sum {&amp;lt;(reg),car&amp;gt; in REGIONS_CARS} msrp[reg,car]) / (sum {&amp;lt;(reg),car&amp;gt; in REGIONS_CARS} invoice[reg,car]));
   print Multiplier;

   create data outdata from [region make] msrp invoice discount AdjInvoice;
quit;
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 21 Sep 2017 19:28:08 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-do-I-use-proc-optmodel-to-solve-for-desired-multiplier/m-p/397906#M1998</guid>
      <dc:creator>RobPratt</dc:creator>
      <dc:date>2017-09-21T19:28:08Z</dc:date>
    </item>
  </channel>
</rss>

