一個小學題目的解: 規則引擎Drools實現

來源:互聯網
上載者:User
同學幫他侄兒問我一個問題:
資源:
1、小明的錢可以購買50瓶汽水。
2、老闆搞促銷,兩個空汽水瓶子可以換一瓶汽水。

問:小明最多能喝多少瓶汽水?

開始還楞了一下, 現在的小學題目還真不簡單。不過馬上給出答案:
先是50瓶,然後用50個空瓶換來25瓶,喝完後用25個空瓶換12瓶再多個空瓶,
喝完後用13個空瓶換6瓶,然後是7個空瓶換3瓶,然後是4個空瓶換2瓶,
然後是2個空瓶換1瓶,最後問老闆借1個空瓶,再用2個空瓶換1瓶,
剩下來那個空瓶還給老闆。所以喝到50+25+12+6+3+2+1+1=100

不過最近在學習規則引擎, 自然就想到了怎麼用規則引擎來實現。
我的想法是:
1: 假設汽水一元一瓶, 則小明最初由50元。
2: 如果兜裡有超過一元錢, 則買一瓶汽水喝, 此時:
錢減少一元,同時擁有的空瓶增加一個。
3: 如果擁有至少兩個空瓶, 則兩個空瓶賣給老闆, 兜裡的錢加一。
根據如上想法, 有了如下Drool的實現。

java檔案SodaWater.java:

  1. package org.drools.examples;
  2. import java.io.InputStreamReader;
  3. import java.io.Reader;
  4. import org.drools.FactHandle;
  5. import org.drools.RuleBase;
  6. import org.drools.RuleBaseFactory;
  7. import org.drools.StatefulSession;
  8. import org.drools.WorkingMemory;
  9. import org.drools.compiler.PackageBuilder;
  10. import org.drools.rule.Package;
  11. public class SodaWater
  12. {
  13.     public static final void main(String[] args) throws Exception {
  14.         final PackageBuilder builder = new PackageBuilder();
  15.         builder.addPackageFromDrl( new InputStreamReader( SodaWater.class.getResourceAsStream( "SodaWater.drl" ) ) );
  16.         final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
  17.         ruleBase.addPackage( builder.getPackage() );
  18.         final StatefulSession session = ruleBase.newStatefulSession();
  19.         Customer customer = new Customer( "XiaoMing", 50);
  20.         session.insert(customer);
  21.         session.fireAllRules();
  22.     }
  23.     
  24.     public static class Customer
  25.     {
  26.         private String name;
  27.         
  28.         private int money;
  29.         
  30.         private int drinkSum;
  31.         
  32.         private int blankCup;
  33.         
  34.         public Customer(String name, int money)
  35.         {
  36.             this.name = name;
  37.             this.money = money;
  38.             this.drinkSum = 0;
  39.             this.blankCup = 0;
  40.         }        
  41.         public int getMoney()
  42.         {
  43.             return money;
  44.         }
  45.         
  46.         public void setMoney(int money)
  47.         {
  48.             this.money = money;
  49.         }
  50.         
  51.         public int getBlankCup()
  52.         {
  53.             return blankCup;
  54.         }
  55.         public void setBlankCup(int blankCup)
  56.         {
  57.             this.blankCup = blankCup;
  58.         }
  59.         public int getDrinkSum()
  60.         {
  61.             return drinkSum;
  62.         }
  63.         public void setDrinkSum(int drinkSum)
  64.         {
  65.             this.drinkSum = drinkSum;
  66.         }
  67.         public String getName()
  68.         {
  69.             return name;
  70.         }
  71.         public void setName(String name)
  72.         {
  73.             this.name = name;
  74.         }       
  75.         
  76.     }
  77. }

rule檔案:

  1. package org.drools.examples
  2. dialect "mvel"
  3. import org.drools.examples.SodaWater.Customer
  4.  
  5. rule "buy a soda water and drink"
  6.     when
  7.         $c : Customer(money > 0, $m:money, $b:blankCup, $d:drinkSum)
  8.     then
  9.         $c.money = $m - 1;
  10.         $c.blankCup = $b + 1;
  11.         $c.drinkSum = $d + 1;
  12.         System.out.println( "Customer " + $c.name + " now buy a soda water and drink: money=" + $c.money + " and blankCup=" + $c.blankCup);
  13.         update($c);
  14. end
  15. rule "sale blank cup and get money"
  16.     when
  17.         $c : Customer(blankCup > 1, $b:blankCup, $m:money )
  18.     then
  19.         $c.blankCup = $b - 2;
  20.         $c.money = $m + 1;
  21.         System.out.println("Customer " + $c.name + " now sale 2 cups and get money: money=" + $c.money + ", blankCup=" + $c.blankCup);
  22.         update($c);
  23. end
  24. rule "finish drink"            
  25.     no-loop true    
  26.     dialect "java"
  27.     when
  28.         $c : Customer(blankCup < 2, money == 0)
  29.     then
  30.         System.out.println( "Customer " + $c.getName() + " finished drink, and drink number is " + $c.getDrinkSum() + " blankCup=" + $c.getBlankCup());
  31. end

運行結果如下:
Customer XiaoMing now buy a soda water and drink: money=49 and blankCup=1
Customer XiaoMing now buy a soda water and drink: money=48 and blankCup=2
Customer XiaoMing now sale 2 cups and get money: money=49, blankCup=0
Customer XiaoMing now buy a soda water and drink: money=48 and blankCup=1
Customer XiaoMing now buy a soda water and drink: money=47 and blankCup=2

...

Customer XiaoMing now buy a soda water and drink: money=1 and blankCup=1
Customer XiaoMing now buy a soda water and drink: money=0 and blankCup=2
Customer XiaoMing now sale 2 cups and get money: money=1, blankCup=0
Customer XiaoMing now buy a soda water and drink: money=0 and blankCup=1
Customer XiaoMing finished drink, and drink number is 99 blankCup=1

不過小明最後手上還有最後一個瓶子, 電腦只能到此了。
向老闆借一個瓶子換一瓶汽水,喝完在還一個空瓶子,估計就是人類智慧來。

此程式需要drools的jar包,具體可見:

http://lcllcl987.javaeye.com/blog/254381

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.