<?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: IML to replace greedy algorithm for inventory optimization in SAS/IML Software and Matrix Computations</title>
    <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953191#M6402</link>
    <description>&lt;PRE&gt;&lt;FONT color="#FF0000"&gt;&lt;STRONG&gt;con con2{m in sku}:sum{n in stock} v[m,n]=2;  /*each SKU have two stock*/  /*  &amp;gt;=1  means at least one stock from each SKU*/&lt;/STRONG&gt;&lt;/FONT&gt;
&lt;/PRE&gt;&lt;P&gt;I was afraid that this is what you understood.&amp;nbsp; I did not mean that.&lt;/P&gt;&lt;P&gt;What I am asking is can my starting dataset be &lt;STRONG&gt;Table A&lt;/STRONG&gt; instead of original Table B.&amp;nbsp; In Table A there is an unequal number of stocking possibilities in each SKU.&amp;nbsp; I still want only 1 outcome to be used in the solution per SKU, but for SKU A it is 1 out 2, for SKU B it is 1 out 4 and for SKU C it is 1 out 5?&amp;nbsp; I will never want to get 2 stock possibilities out of a particular SKU.&lt;/P&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;Table A&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Table B&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;SKU&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;TD&gt;Stock&lt;/TD&gt;&lt;TD&gt;Cost&lt;/TD&gt;&lt;TD&gt;Contribution&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;SKU&lt;/TD&gt;&lt;TD&gt;Stock&lt;/TD&gt;&lt;TD&gt;Cost&lt;/TD&gt;&lt;TD&gt;Contribution&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;1.9&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;1.9&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;1.7&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;TD&gt;2.8&lt;/TD&gt;&lt;TD&gt;removed&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;2.6&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;3.75&lt;/TD&gt;&lt;TD&gt;removed&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;60&lt;/TD&gt;&lt;TD&gt;3.4&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;50&lt;/TD&gt;&lt;TD&gt;4.7&lt;/TD&gt;&lt;TD&gt;removed&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;80&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;1.7&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;210&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;2.6&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;245&lt;/TD&gt;&lt;TD&gt;4.2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;60&lt;/TD&gt;&lt;TD&gt;3.4&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;280&lt;/TD&gt;&lt;TD&gt;4.8&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;80&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;315&lt;/TD&gt;&lt;TD&gt;6.3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;TD&gt;5.1&lt;/TD&gt;&lt;TD&gt;removed&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;350&lt;/TD&gt;&lt;TD&gt;6.7&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;210&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;245&lt;/TD&gt;&lt;TD&gt;4.2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;280&lt;/TD&gt;&lt;TD&gt;4.8&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;315&lt;/TD&gt;&lt;TD&gt;6.3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;350&lt;/TD&gt;&lt;TD&gt;6.7&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;</description>
    <pubDate>Wed, 11 Dec 2024 09:38:00 GMT</pubDate>
    <dc:creator>AramF</dc:creator>
    <dc:date>2024-12-11T09:38:00Z</dc:date>
    <item>
      <title>IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/952933#M6384</link>
      <description>&lt;P&gt;Greetings.&amp;nbsp; I currently run an optimization routine for 6000 SKUs using a greedy algorithm to search through different stocking levels to achieve a certain customer satisfaction KPI.&amp;nbsp; My outcome is strongly influenced by my choice of starting stocking levels for each SKU.&amp;nbsp; I would like to harness the power of IML to find the most optimal stocking solution, but unfortunately, my programming skills are better suited to entertain seasoned programmers than to provide material for serious critique.&amp;nbsp; I hope I can learn from your help and further edit the code on my own to try different optimization parameters.&amp;nbsp; While there are plenty of examples on the web with IML Knapsak solutions, my particular case is complicated by diminishing contribution for higher stocking levels for each SKU as well as selecting 1 stocking level out of multiple options for each SKU.&amp;nbsp; &amp;nbsp;I run SAS 9.4.&amp;nbsp; In the example below I want to optimize 3 SKUs with different possible stocking levels.&amp;nbsp; My goal is to identify plans for each of my SKUs, minimize total expenditure, and achieve a desired customer satisfaction contribution between 11-14 units.&amp;nbsp; Thank you.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;SKU&lt;/TD&gt;&lt;TD&gt;Stock&lt;/TD&gt;&lt;TD&gt;Cost&lt;/TD&gt;&lt;TD&gt;Contribution&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;1.9&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;TD&gt;2.8&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;3.75&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;50&lt;/TD&gt;&lt;TD&gt;4.7&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;1.7&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;2.6&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;60&lt;/TD&gt;&lt;TD&gt;3.4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;80&lt;/TD&gt;&lt;TD&gt;4.0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;TD&gt;5.1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;210&lt;/TD&gt;&lt;TD&gt;3.0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;245&lt;/TD&gt;&lt;TD&gt;4.2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;280&lt;/TD&gt;&lt;TD&gt;4.8&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;315&lt;/TD&gt;&lt;TD&gt;6.3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;350&lt;/TD&gt;&lt;TD&gt;6.7&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;</description>
      <pubDate>Mon, 09 Dec 2024 10:32:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/952933#M6384</guid>
      <dc:creator>AramF</dc:creator>
      <dc:date>2024-12-09T10:32:20Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/952937#M6385</link>
      <description>&lt;P&gt;I assume from your comments that your programming skills are less than ideal? You might ask one of your team members to assist you.&lt;/P&gt;
&lt;P&gt;If you haven't already done so, you can start by reading about how to optimize problems like this by using either genetic algorithms of mixed-integer programming in IML:&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://blogs.sas.com/content/iml/2021/10/20/intro-genetic-algorithms-sas.html" target="_self"&gt;An introduction to genetic algorithms&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://blogs.sas.com/content/iml/2021/10/11/knapsack-problem.html" target="_self"&gt;The knapsack problem: Binary integer programming in SAS/IML&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://blogs.sas.com/content/iml/2021/10/13/penalties-constraints-optimization.html" target="_blank"&gt;Penalties versus constraints in optimization problems&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Calling&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/18408"&gt;@Ksharp&lt;/a&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 09 Dec 2024 11:01:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/952937#M6385</guid>
      <dc:creator>Rick_SAS</dc:creator>
      <dc:date>2024-12-09T11:01:09Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953068#M6386</link>
      <description>&lt;P&gt;I don't understand your question. Can you clarify it more ?&lt;BR /&gt;What is your object function ? and how many stock levels you want to pick up from each SKU at least ?&lt;BR /&gt;&lt;BR /&gt;And for the optimization problem , the best choice is SAS/OR ,(although SAS/IML have some routine/function like NLP* and Genetic Algorithm for optimial question).&lt;BR /&gt;Therefore better post is at OR forum:&lt;BR /&gt;&lt;A href="https://communities.sas.com/t5/Mathematical-Optimization/bd-p/operations_research" target="_blank" rel="noopener"&gt;https://communities.sas.com/t5/Mathematical-Optimization/bd-p/operations_research&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;can calling&amp;nbsp; &amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/1636"&gt;@RobPratt&lt;/a&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;"&lt;SPAN&gt;my particular case is complicated by diminishing contribution for higher stocking levels for each SKU as well as selecting 1 stocking level out of multiple options for each SKU.&amp;nbsp; &amp;nbsp;"&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;What do you mean by that ?&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 10 Dec 2024 02:43:42 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953068#M6386</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2024-12-10T02:43:42Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953127#M6387</link>
      <description>&lt;P&gt;Hi Kshap,&lt;/P&gt;&lt;P&gt;The objective function is to minimize the cost of inventory.&lt;/P&gt;&lt;P&gt;The constraints are:&lt;/P&gt;&lt;P&gt;Achieve a set level of contribution&lt;/P&gt;&lt;P&gt;Include every SKU in your analysis.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;In the classic Knapsack problem every fruit has a weight and a caloric value.&amp;nbsp; Similarly in my problem, SKU has a cost and a value contribution to service level.&amp;nbsp; The tricky difference is that the value of contribution is not scalar.&amp;nbsp; It's based on Poisson distribution.&amp;nbsp; So 1 unit could contribute 30% probability of service level, while 2 units together would have combined contribution 45%, or more accurately not 60%. (I translate probability into contribution value)&amp;nbsp; Therefore as the procedure goes through different scenarios of potential solutions, N_unit contribution and 1unit contribution cannot occur for the same SKU in the same scenario.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;My problem is actually very similar to&amp;nbsp;&lt;A href="https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Variation-of-Knapsack-Problem/td-p/569457" target="_blank"&gt;https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Variation-of-Knapsack-Problem/td-p/569457&lt;/A&gt;.&amp;nbsp; &amp;nbsp;In that example there are 3 arrays (he calls them lists).&amp;nbsp; To do the same thing I would need at least 6000 arrays for each SKU.&amp;nbsp; &amp;nbsp;I hope that clarifies it better.&amp;nbsp;&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/18408"&gt;@Ksharp&lt;/a&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/13684"&gt;@Rick_SAS&lt;/a&gt;&amp;nbsp; Rick, I am afraid I am the last of the Mohicans here, the younger generation shy away from SAS in favor of Python and R. Yesterday I asked around for advice in other groups, but those users are just running old scripts that were not developed by them.&lt;/P&gt;</description>
      <pubDate>Tue, 10 Dec 2024 18:15:58 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953127#M6387</guid>
      <dc:creator>AramF</dc:creator>
      <dc:date>2024-12-10T18:15:58Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953129#M6388</link>
      <description>&lt;P&gt;Rick,&lt;/P&gt;&lt;P&gt;In the above referenced thread from 2019 you proposed this code.&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;PRE class=""&gt;&lt;CODE&gt;proc iml;
L1 = {0 26 44};
L2 = {0 52 65 78};
L3 = {0  4 12 20 27 46};
target = 116;
G = ExpandGrid(L1, L2, L3);
idx = loc( G[,+]=target );
if ncol(idx)&amp;gt;0 then 
   soln = G[idx,];
else soln=.;  /* no soln */
print soln;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;I naturally would not come up with this solution due to my inexperience, so I thought maybe there are eloquent ways of dealing with the multitude of SKUs and different stocking levels within each SKU that someone has already developed.&amp;nbsp; My way of thinking is actually more along the lines of Ksharp's idea of making each SKU a stand alone table and then performing a cartesian product on all of them.&amp;nbsp; It is wonderfully clear solutions, yet intuitively I feel I might get some results in the next century if I go that route given my SKU population.&amp;nbsp; So hoping to address that issue in ways that I normally would not.&lt;/P&gt;</description>
      <pubDate>Tue, 10 Dec 2024 18:39:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953129#M6388</guid>
      <dc:creator>AramF</dc:creator>
      <dc:date>2024-12-10T18:39:16Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953136#M6389</link>
      <description>&lt;P&gt;Your problem sounds large and complex. Unfortunately, I have several work-related projects that require my attention. I cannot think about your problem right now, but hopefully someone else can offer you advice.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Regarding my post from 2019, that method is a brute-force method that examines all combinations. It will not work for large problems.&lt;/P&gt;</description>
      <pubDate>Tue, 10 Dec 2024 20:05:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953136#M6389</guid>
      <dc:creator>Rick_SAS</dc:creator>
      <dc:date>2024-12-10T20:05:01Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953150#M6390</link>
      <description>&lt;P&gt;In your toy input data, should the stock for C be 1-5 as well, similar to A and B?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Assuming yes, and if I'm following along correctly, the solution to your toy example should be:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A = 5&lt;/P&gt;
&lt;P&gt;B = 3&lt;/P&gt;
&lt;P&gt;C = 1&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Total Cost = 320&lt;/P&gt;
&lt;P&gt;Total Contribution = 11.1&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Is this correct? If not, please explain why not.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 10 Dec 2024 23:16:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953150#M6390</guid>
      <dc:creator>ChanceTGardener</dc:creator>
      <dc:date>2024-12-10T23:16:15Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953152#M6391</link>
      <description>&lt;P&gt;Hi Chance,&lt;/P&gt;&lt;P&gt;SKU C can start from 1 and go to 10.&amp;nbsp; In this case starting from 5 was intentional because there are SKUs that have minimum stocking qty&amp;gt; 1 for business reasons.&amp;nbsp; Other wise yes, your solution was correct because it was above 11 units and had the lowest cost.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;POSSIBLE SOLUTIONS&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;Contribution&lt;/TD&gt;&lt;TD&gt;Cost&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;12.4&lt;/TD&gt;&lt;TD&gt;425&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;12.8&lt;/TD&gt;&lt;TD&gt;460&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;11.6&lt;/TD&gt;&lt;TD&gt;395&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;11.1&lt;/TD&gt;&lt;TD&gt;320&lt;/TD&gt;&lt;TD&gt;winner&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;</description>
      <pubDate>Tue, 10 Dec 2024 23:42:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953152#M6391</guid>
      <dc:creator>AramF</dc:creator>
      <dc:date>2024-12-10T23:42:15Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953154#M6392</link>
      <description>&lt;P&gt;Thanks, I understand better now. Do you license SAS/OR?&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If so, happy to provide some code to get you started that formulates and solves this as a mixed-integer linear programming problem.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 11 Dec 2024 01:27:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953154#M6392</guid>
      <dc:creator>ChanceTGardener</dc:creator>
      <dc:date>2024-12-11T01:27:12Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953167#M6393</link>
      <description>&lt;P&gt;It looks like you just need a simple &lt;SPAN&gt;mixed integer linear programming (MILP) problems.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Since you have so many variables and so many constraint conditions, the only choice is using SAS/OR, if you do not have its license ,you could try free OR by SAS OnDemand for Academic :&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;A href="https://welcome.oda.sas.com/login" target="_self"&gt;SAS OnDemand for Academics&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Anyway, here is an example:&lt;/SPAN&gt;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;
proc optmodel;
set idx={1..15};
num cost{idx}=[10 20 30 40 50    20 40 60 80 100    210 245 280 315 350];
num contribution{idx}=[1 1.9 2.8 3.75 4.7   1.7 2.6 3.4 4.0 5.1  3.0 4.2 4.8 6.3 6.7];

var v{idx} binary;

min obj=sum{i in idx} cost[i]*v[i];

con con :11&amp;lt;=(sum{a in 1..15} contribution[a]*v[a])&amp;lt;=14  ;
con con1:sum{a1 in 1..5}   v[a1]=1;
con con2:sum{a2 in 6..10}  v[a2]=1;
con con3:sum{a3 in 11..15} v[a3]=1;

solve with clp / findallsolns;

print obj  Cost	Contribution v;
quit;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ksharp_0-1733898720299.png" style="width: 400px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/102884iCD09EE95ADCAB479/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Ksharp_0-1733898720299.png" alt="Ksharp_0-1733898720299.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 11 Dec 2024 06:32:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953167#M6393</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2024-12-11T06:32:09Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953173#M6394</link>
      <description>&lt;P&gt;If you want input thing is a dataset/table , not want type it by hand,&amp;nbsp; try the following code:&lt;/P&gt;
&lt;P&gt;NOTE: I changed the index of stock(from 1 to 5) in SKU=C to make the code easy to read, you can easily change the index by a data step.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile cards expandtabs truncover;
input sku $ stock	Cost	Contribution;
cards;
A	1	10	1
A	2	20	1.9
A	3	30	2.8
A	4	40	3.75
A	5	50	4.7
B	1	20	1.7
B	2	40	2.6
B	3	60	3.4
B	4	80	4.0
B	5	100	5.1
C	1	210	3.0
C	2	245	4.2
C	3	280	4.8
C	4	315	6.3
C	5	350	6.7
;



proc sort data=have out=sku nodupkey;by sku;run;
proc sort data=have out=stock nodupkey;by stock;run;
proc optmodel;
set&amp;lt;str&amp;gt; sku;
set stock;
num cost{sku, stock};
num contribution{sku, stock};

read data sku into sku=[sku];
read data stock into stock=[stock];
read data have into [sku stock] cost contribution;

var v{sku, stock} binary;

min obj=sum{i in sku,j in stock} cost[i,j]*v[i,j];
con con1 :11&amp;lt;=(sum{i in sku,j in stock} contribution[i,j]*v[i,j])&amp;lt;=14  ;
con con2{m in sku}:sum{n in stock} v[m,n]=1;
solve with clp / findallsolns;
create data want from [solution sku2 stock2]={s in 1.._NSOL_,i in sku,j in stock} 
                      cost2=cost[i,j] contribution2=contribution[i,j] flag=v[i,j].sol[s];
quit;

proc print data=want noobs;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ksharp_0-1733901897988.png" style="width: 400px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/102885iE1974A7338B69C03/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Ksharp_0-1733901897988.png" alt="Ksharp_0-1733901897988.png" /&gt;&lt;/span&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ksharp_1-1733901953885.png" style="width: 400px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/102886i41DCC599B79C4FFE/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Ksharp_1-1733901953885.png" alt="Ksharp_1-1733901953885.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 11 Dec 2024 07:26:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953173#M6394</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2024-12-11T07:26:01Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953175#M6395</link>
      <description>&lt;P&gt;Ksharp,&lt;/P&gt;&lt;P&gt;I ran the code exactly as you typed and it worked perfectly.&amp;nbsp; BIG SUCCESS !!!!!&amp;nbsp; Thank you so much.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I then tried to change two things:&lt;/P&gt;&lt;P&gt;1. I updated the SKU C to 6-10 instead of 1-5 and got "Semantic Error" in Solution Status.&amp;nbsp;&lt;/P&gt;&lt;P&gt;2. I renumbered SKU C to 1-5 as you originally posted and removed the last 2 observations, so SKU C only had 1-3 observations.&amp;nbsp; That caused Semantic Error too.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Is there a way to run &amp;lt;Optimodel&amp;gt; with dissimilar stock values for each SKU, because that is a very real situation that I face?&lt;/P&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;</description>
      <pubDate>Wed, 11 Dec 2024 08:23:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953175#M6395</guid>
      <dc:creator>AramF</dc:creator>
      <dc:date>2024-12-11T08:23:01Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953178#M6396</link>
      <description>&lt;P&gt;When I say dissimilar stock, I mean A could have 2 stocks, B 4 stocks and C 5 stocks.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;SKU&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;TD&gt;Stock&lt;/TD&gt;&lt;TD&gt;Cost&lt;/TD&gt;&lt;TD&gt;Contribution&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;1.9&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;1.7&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;2.6&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;60&lt;/TD&gt;&lt;TD&gt;3.4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;80&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;210&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;245&lt;/TD&gt;&lt;TD&gt;4.2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;280&lt;/TD&gt;&lt;TD&gt;4.8&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;315&lt;/TD&gt;&lt;TD&gt;6.3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;350&lt;/TD&gt;&lt;TD&gt;6.7&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;</description>
      <pubDate>Wed, 11 Dec 2024 08:43:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953178#M6396</guid>
      <dc:creator>AramF</dc:creator>
      <dc:date>2024-12-11T08:43:19Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953180#M6397</link>
      <description>&lt;P&gt;OK. Here is .&lt;/P&gt;
&lt;P&gt;I make a new index of stock(1 2 3 4 ....) , you could merge old index of stock back by one more data step (as I showed).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile cards expandtabs truncover;
input sku $ stock	Cost	Contribution;
cards;
A	1	10	1
A	2	20	1.9
A	3	30	2.8
A	4	40	3.75
A	5	50	4.7
B	1	20	1.7
B	2	40	2.6
B	3	60	3.4
B	4	80	4.0
B	5	100	5.1
C	6	210	3.0
C	7	245	4.2
C	8	280	4.8
C	9	315	6.3
C	10	350	6.7
;

data have2;
 set have(rename=(stock=old_stock));
 by sku;
 if first.sku then stock=0;
 stock+1;
run;
proc sql;
create table have3 as
select a.*,coalesce(b.Cost,0) as cost,coalesce(b.Contribution,0) as Contribution
 from (select * from (select distinct sku from have2),(select distinct stock from have2)) as a
 natural left join
 have2 as b ;
quit;

proc sort data=have3 out=sku nodupkey;by sku;run;
proc sort data=have3 out=stock nodupkey;by stock;run;
proc optmodel;
set&amp;lt;str&amp;gt; sku;
set stock;
num cost{sku, stock};
num contribution{sku, stock};

read data sku into sku=[sku];
read data stock into stock=[stock];
read data have3 into [sku stock] cost contribution;

var v{sku, stock} binary;

min obj=sum{i in sku,j in stock} cost[i,j]*v[i,j];
con con1 :11&amp;lt;=sum{i in sku,j in stock} contribution[i,j]*v[i,j]&amp;lt;=14  ;
con con2{m in sku}:sum{n in stock} v[m,n]=1;
solve with clp / findallsolns;
create data want from [solution sku2 stock2]={s in 1.._NSOL_,i in sku,j in stock} 
                      cost2=cost[i,j] contribution2=contribution[i,j] flag=v[i,j].sol[s];
quit;

data want2;
 length sku2 $ 100;
 merge want have2(keep=sku stock  old_stock rename=(sku=sku2 stock=stock2));
 by sku2 stock2;
run;
proc print data=want2 noobs;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ksharp_0-1733907114419.png" style="width: 400px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/102890i4EA1F4770101D013/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Ksharp_0-1733907114419.png" alt="Ksharp_0-1733907114419.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 11 Dec 2024 08:52:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953180#M6397</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2024-12-11T08:52:00Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953184#M6398</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/471578"&gt;@AramF&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;When I say dissimilar stock, I mean A could have 2 stocks, B 4 stocks and C 5 stocks.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV&gt;
&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;DIV&gt;
&lt;DIV&gt;
&lt;DIV&gt;
&lt;DIV&gt;
&lt;DIV&gt;
&lt;DIV&gt;
&lt;DIV&gt;SKU&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/TD&gt;
&lt;TD&gt;Stock&lt;/TD&gt;
&lt;TD&gt;Cost&lt;/TD&gt;
&lt;TD&gt;Contribution&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;A&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;10&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;A&lt;/TD&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;20&lt;/TD&gt;
&lt;TD&gt;1.9&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;B&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;20&lt;/TD&gt;
&lt;TD&gt;1.7&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;B&lt;/TD&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;40&lt;/TD&gt;
&lt;TD&gt;2.6&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;B&lt;/TD&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;60&lt;/TD&gt;
&lt;TD&gt;3.4&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;B&lt;/TD&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;80&lt;/TD&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C&lt;/TD&gt;
&lt;TD&gt;6&lt;/TD&gt;
&lt;TD&gt;210&lt;/TD&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C&lt;/TD&gt;
&lt;TD&gt;7&lt;/TD&gt;
&lt;TD&gt;245&lt;/TD&gt;
&lt;TD&gt;4.2&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C&lt;/TD&gt;
&lt;TD&gt;8&lt;/TD&gt;
&lt;TD&gt;280&lt;/TD&gt;
&lt;TD&gt;4.8&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C&lt;/TD&gt;
&lt;TD&gt;9&lt;/TD&gt;
&lt;TD&gt;315&lt;/TD&gt;
&lt;TD&gt;6.3&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C&lt;/TD&gt;
&lt;TD&gt;10&lt;/TD&gt;
&lt;TD&gt;350&lt;/TD&gt;
&lt;TD&gt;6.7
&lt;DIV&gt;
&lt;DIV&gt;
&lt;DIV&gt;
&lt;DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/DIV&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;So the number of stock from each SKU is varying ?&lt;/P&gt;
&lt;P&gt;Just change the constraint condition and could yield THREE solutions:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile cards expandtabs truncover;
input sku $ stock	Cost	Contribution;
cards;
A	1	10	1
A	2	20	1.9
A	3	30	2.8
A	4	40	3.75
A	5	50	4.7
B	1	20	1.7
B	2	40	2.6
B	3	60	3.4
B	4	80	4.0
B	5	100	5.1
C	6	210	3.0
C	7	245	4.2
C	8	280	4.8
C	9	315	6.3
C	10	350	6.7
;

data have2;
 set have(rename=(stock=old_stock));
 by sku;
 if first.sku then stock=0;
 stock+1;
run;
proc sql;
create table have3 as
select a.*,coalesce(b.Cost,0) as cost,coalesce(b.Contribution,0) as Contribution
 from (select * from (select distinct sku from have2),(select distinct stock from have2)) as a
 natural left join
 have2 as b ;
quit;

proc sort data=have3 out=sku nodupkey;by sku;run;
proc sort data=have3 out=stock nodupkey;by stock;run;
proc optmodel;
set&amp;lt;str&amp;gt; sku;
set stock;
num cost{sku, stock};
num contribution{sku, stock};

read data sku into sku=[sku];
read data stock into stock=[stock];
read data have3 into [sku stock] cost contribution;

var v{sku, stock} binary;

min obj=sum{i in sku,j in stock} cost[i,j]*v[i,j];
con con1 :11&amp;lt;=sum{i in sku,j in stock} contribution[i,j]*v[i,j]&amp;lt;=14  ;
&lt;FONT color="#FF0000"&gt;&lt;STRONG&gt;con con2{m in sku}:sum{n in stock} v[m,n]&amp;gt;=1;&lt;/STRONG&gt;&lt;/FONT&gt;
solve with clp / findallsolns;
create data want from [solution sku2 stock2]={s in 1.._NSOL_,i in sku,j in stock} 
                      cost2=cost[i,j] contribution2=contribution[i,j] flag=v[i,j].sol[s];
quit;
proc sort data=want;by sku2 stock2;run;
data want2;
 length sku2 $ 100;
 merge want have2(keep=sku stock  old_stock rename=(sku=sku2 stock=stock2));
 by sku2 stock2;
run;
proc sort data=want2;by solution sku2 stock2;run;
proc print data=want2 noobs;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ksharp_0-1733907725909.png" style="width: 400px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/102891i1BF32EE4721C2BD2/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Ksharp_0-1733907725909.png" alt="Ksharp_0-1733907725909.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ksharp_2-1733907808267.png" style="width: 400px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/102893iBF29B9D31B22E767/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Ksharp_2-1733907808267.png" alt="Ksharp_2-1733907808267.png" /&gt;&lt;/span&gt;&lt;/P&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;</description>
      <pubDate>Wed, 11 Dec 2024 09:03:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953184#M6398</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2024-12-11T09:03:55Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953185#M6399</link>
      <description>&lt;P&gt;I don't think I made myself clear.&amp;nbsp; Let me try to do a better job. BTW, that you so much for your generosity in working this.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;In my work I could have for SKU A 100 different stocks (10 thru 110), For SKU B 15 different stocks (1 thrugh 15) and SKU C 10 different ones (32-42).&amp;nbsp; The reason for it, is that I have Min stock and Max Stock values that are determined by business rules outside of optimization.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;To use the code that you offered,&amp;nbsp; would I need SKU A, B and C each have 100 different stocks instead of 100 for A, 14 for B and 10 for C?&lt;/P&gt;</description>
      <pubDate>Wed, 11 Dec 2024 09:13:31 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953185#M6399</guid>
      <dc:creator>AramF</dc:creator>
      <dc:date>2024-12-11T09:13:31Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953186#M6400</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/471578"&gt;@AramF&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;I don't think I made myself clear.&amp;nbsp; Let me try to do a better job. BTW, that you so much for your generosity in working this.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In my work I could have for SKU A 100 different stocks (10 thru 110), For SKU B 15 different stocks (1 thrugh 15) and SKU C 10 different ones (32-42).&amp;nbsp; The reason for it, is that I have Min stock and Max Stock values that are determined by business rules outside of optimization.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;To use the code that you offered,&amp;nbsp; would I need SKU A, B and C each have 100 different stocks instead of 100 for A, 14 for B and 10 for C?&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Sure. Of course you can. Just change the constraint condition in code:&lt;/P&gt;
&lt;PRE&gt;data have;
infile cards expandtabs truncover;
input sku $ stock	Cost	Contribution;
cards;
A	1	10	1
A	2	20	1.9
A	3	30	2.8
A	4	40	3.75
A	5	50	4.7
B	1	20	1.7
B	2	40	2.6
B	3	60	3.4
B	4	80	4.0
B	5	100	5.1
C	6	210	3.0
C	7	245	4.2
C	8	280	4.8
C	9	315	6.3
C	10	350	6.7
;

data have2;
 set have(rename=(stock=old_stock));
 by sku;
 if first.sku then stock=0;
 stock+1;
run;
proc sql;
create table have3 as
select a.*,coalesce(b.Cost,0) as cost,coalesce(b.Contribution,0) as Contribution
 from (select * from (select distinct sku from have2),(select distinct stock from have2)) as a
 natural left join
 have2 as b ;
quit;

proc sort data=have3 out=sku nodupkey;by sku;run;
proc sort data=have3 out=stock nodupkey;by stock;run;
proc optmodel;
set&amp;lt;str&amp;gt; sku;
set stock;
num cost{sku, stock};
num contribution{sku, stock};

read data sku into sku=[sku];
read data stock into stock=[stock];
read data have3 into [sku stock] cost contribution;

var v{sku, stock} binary;

min obj=sum{i in sku,j in stock} cost[i,j]*v[i,j];
con con1 :11&amp;lt;=sum{i in sku,j in stock} contribution[i,j]*v[i,j]&amp;lt;=14  ;
&lt;FONT color="#FF0000"&gt;&lt;STRONG&gt;con con2{m in sku}:sum{n in stock} v[m,n]=2;  /*each SKU have two stock*/  /*  &amp;gt;=1  means at least one stock from each SKU*/&lt;/STRONG&gt;&lt;/FONT&gt;
solve with clp / findallsolns;
create data want from [solution sku2 stock2]={s in 1.._NSOL_,i in sku,j in stock} 
                      cost2=cost[i,j] contribution2=contribution[i,j] flag=v[i,j].sol[s];
quit;
proc sort data=want;by sku2 stock2;run;
data want2;
 length sku2 $ 100;
 merge want have2(keep=sku stock  old_stock rename=(sku=sku2 stock=stock2));
 by sku2 stock2;
run;
proc sort data=want2;by solution sku2 stock2;run;
proc print data=want2 noobs;
run;&lt;/PRE&gt;
&lt;P&gt;Base on your orginal data, you can not set solution, you need to change this sample data .&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I have to leave now!&lt;/P&gt;</description>
      <pubDate>Wed, 11 Dec 2024 09:21:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953186#M6400</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2024-12-11T09:21:12Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953187#M6401</link>
      <description>&lt;P&gt;I just realized that my reply had wrong counts.&amp;nbsp; Let me redo the&amp;nbsp; numbers:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;In my work I could have for SKU A 100 different stocks (10 thru &lt;STRONG&gt;109&lt;/STRONG&gt;), For SKU B 15 different stocks (1 thru 15) and SKU C 10 different ones (32-&lt;STRONG&gt;41&lt;/STRONG&gt;).&amp;nbsp; The reason for it, is that I have Min stock and Max Stock values that are determined by business rules outside of optimization.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;To use the code that you offered,&amp;nbsp; would I need SKU A, B and C each have 100 different stocks instead of 100 for A, 15 for B and 10 for C?&lt;/P&gt;</description>
      <pubDate>Wed, 11 Dec 2024 09:22:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953187#M6401</guid>
      <dc:creator>AramF</dc:creator>
      <dc:date>2024-12-11T09:22:48Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953191#M6402</link>
      <description>&lt;PRE&gt;&lt;FONT color="#FF0000"&gt;&lt;STRONG&gt;con con2{m in sku}:sum{n in stock} v[m,n]=2;  /*each SKU have two stock*/  /*  &amp;gt;=1  means at least one stock from each SKU*/&lt;/STRONG&gt;&lt;/FONT&gt;
&lt;/PRE&gt;&lt;P&gt;I was afraid that this is what you understood.&amp;nbsp; I did not mean that.&lt;/P&gt;&lt;P&gt;What I am asking is can my starting dataset be &lt;STRONG&gt;Table A&lt;/STRONG&gt; instead of original Table B.&amp;nbsp; In Table A there is an unequal number of stocking possibilities in each SKU.&amp;nbsp; I still want only 1 outcome to be used in the solution per SKU, but for SKU A it is 1 out 2, for SKU B it is 1 out 4 and for SKU C it is 1 out 5?&amp;nbsp; I will never want to get 2 stock possibilities out of a particular SKU.&lt;/P&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;Table A&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Table B&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;SKU&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;TD&gt;Stock&lt;/TD&gt;&lt;TD&gt;Cost&lt;/TD&gt;&lt;TD&gt;Contribution&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;SKU&lt;/TD&gt;&lt;TD&gt;Stock&lt;/TD&gt;&lt;TD&gt;Cost&lt;/TD&gt;&lt;TD&gt;Contribution&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;1.9&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;1.9&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;1.7&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;TD&gt;2.8&lt;/TD&gt;&lt;TD&gt;removed&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;2.6&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;3.75&lt;/TD&gt;&lt;TD&gt;removed&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;60&lt;/TD&gt;&lt;TD&gt;3.4&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;50&lt;/TD&gt;&lt;TD&gt;4.7&lt;/TD&gt;&lt;TD&gt;removed&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;80&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;1.7&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;210&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;2.6&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;245&lt;/TD&gt;&lt;TD&gt;4.2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;60&lt;/TD&gt;&lt;TD&gt;3.4&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;280&lt;/TD&gt;&lt;TD&gt;4.8&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;80&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;315&lt;/TD&gt;&lt;TD&gt;6.3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;TD&gt;5.1&lt;/TD&gt;&lt;TD&gt;removed&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;350&lt;/TD&gt;&lt;TD&gt;6.7&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;210&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;245&lt;/TD&gt;&lt;TD&gt;4.2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;280&lt;/TD&gt;&lt;TD&gt;4.8&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;315&lt;/TD&gt;&lt;TD&gt;6.3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;C&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;350&lt;/TD&gt;&lt;TD&gt;6.7&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;</description>
      <pubDate>Wed, 11 Dec 2024 09:38:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953191#M6402</guid>
      <dc:creator>AramF</dc:creator>
      <dc:date>2024-12-11T09:38:00Z</dc:date>
    </item>
    <item>
      <title>Re: IML to replace greedy algorithm for inventory optimization</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953202#M6403</link>
      <description>&lt;P&gt;This model will accommodate an unequal number of possibilities (stocks) per SKU. Additionally, the stocks can, but are not required to increment by 1. See SKU C as an example in the input data below.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The output data set shows the optimal number of each SKU to stock.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Feel free to change the input data to accommodate the different scenarios you may face to confirm it performs well across all of them.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data input_data;
 input sku $ stock cost contribution;
datalines;
A 1 10 1
A 2 20 1.9
A 3 30 2.8
A 4 40 3.75
A 5 50 4.7
B 1 20 1.7
B 2 40 2.6
B 3 60 3.4
B 4 80 4.0
B 5 100 5.1
C 1 210 3.0
C 17 245 4.2
C 18 280 4.8
C 30 315 6.3
C 100 350 6.7
;

proc optmodel;

set &amp;lt;str,num&amp;gt; ARCS;

set SKUS = setof{&amp;lt;i,j&amp;gt; in ARCS} i;
set STOCK = setof{&amp;lt;i,j&amp;gt; in ARCS} j;

num cost{ARCS};
num contribution{ARCS};

read data input_data into ARCS=[sku stock] cost contribution;

var Assign{ARCS} binary;

impvar TotalContribution = sum{&amp;lt;i,j&amp;gt; in ARCS} Assign[i,j] * contribution[i,j];

min TotalCost = sum{&amp;lt;i,j&amp;gt; in ARCS} Assign[i,j]*cost[i,j];

con contribuion_lb: 11 &amp;lt;= TotalContribution &amp;lt;= 14;

con sku_minimum{i in SKUS}: sum{j in STOCK: &amp;lt;i,j&amp;gt; in ARCS} Assign[i,j] = 1;

solve;

print TotalContribution;
print TotalCost.sol;

create data output_data from [sku stock] = {&amp;lt;i,j&amp;gt; in ARCS: Assign[i,j] &amp;gt; 0.5};

quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 11 Dec 2024 11:17:11 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/IML-to-replace-greedy-algorithm-for-inventory-optimization/m-p/953202#M6403</guid>
      <dc:creator>ChanceTGardener</dc:creator>
      <dc:date>2024-12-11T11:17:11Z</dc:date>
    </item>
  </channel>
</rss>

