花落成泥

          學習是進步的源泉

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            1 隨筆 :: 0 文章 :: 0 評論 :: 0 Trackbacks

          2011年9月2日 #

          轉自http://www.iteye.com/topic/257039

          同學幫他侄兒問我一個問題:
          資源:
          1、小明的錢可以購買50瓶汽水。
          2、老板搞促銷,兩個空汽水瓶子可以換一瓶汽水。

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

          開始還楞了一下, 現(xiàn)在的小學題目還真不簡單。不過馬上給出答案:
          先是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

          不過最近在學習規(guī)則引擎, 于是就想到了怎么用規(guī)則引擎來實現(xiàn)。
          我的想法是:
          1: 假設汽水一元一瓶, 則小明最初有50元。
          2: 如果兜里有超過一元錢, 則買一瓶汽水喝, 此時:
          錢減少一元,同時擁有的空瓶增加一個。
          3: 如果擁有至少兩個空瓶, 則兩個空瓶賣給老板, 兜里的錢加一。
          根據(jù)如上想法, 有了如下規(guī)則引擎的實現(xiàn)的實現(xiàn)(Drool):

          java文件SodaWater.java:

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



          rule文件:

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


          看看大家還有什么好的算法。


          posted @ 2011-09-02 14:39 WYH-THINK 閱讀(162) | 評論 (0)編輯 收藏

          僅列出標題  
          主站蜘蛛池模板: 和政县| 万全县| 雅安市| 红河县| 丹江口市| 库车县| 东阿县| 璧山县| 眉山市| 西城区| 库尔勒市| 阳城县| 霞浦县| 沈阳市| 崇礼县| 罗甸县| 新和县| 防城港市| 九龙县| 宜黄县| 瓦房店市| 兴宁市| 阿拉善盟| 神木县| 滨州市| 新泰市| 伊川县| 石柱| 株洲县| 北京市| 绥江县| 调兵山市| 华亭县| 武乡县| 文登市| 绥阳县| 都匀市| 宁南县| 墨玉县| 清原| 桃园县|