规则引擎Drools解决汽水问题

来源:互联网 发布:linux 文件后面带星号 编辑:程序博客网 时间:2024/04/30 03:47

喝汽水问题:
1元钱一瓶汽水,喝完后两个空瓶换一瓶汽水,问:你有50元钱,最多可以喝到几瓶汽水?(不能借空瓶,呵呵无商不奸)

 

answer:
1: 如果有超过一元钱, 则买一瓶汽水喝, 此时: 钱减少一元,同时拥有的空瓶增加一个。
2: 如果拥有至少两个空瓶, 则两个空瓶卖给老板兜里的钱加一(或是两个空瓶卖给老板换来一瓶汽水)。

SoftDrink.drl

Java代码  收藏代码
  1. #created on: 2011-10-18  
  2. package com.jsptpd.rjy.zyj.main  
  3. dialect "mvel"  
  4. #list any import classes here.  
  5. import com.jsptpd.rjy.zyj.main.SoftDrink.Customer  
  6.   
  7. #declare any global variables here  
  8.   
  9. rule "和了一瓶汽水"  
  10.     when  
  11.         $c:Customer(money>0,$m:money, $e:emptyBottle, $d :drinkBottleSum);  
  12.     then  
  13.         $c.money=$m-1;  
  14.         $c.emptyBottle=$e+1;  
  15.         $c.drinkBottleSum=$d+1;  
  16.         System.out.println($c.getName()+"有 "+$c.getMoney()+" 元, 有空瓶 "+$c.getEmptyBottle()+" 个, 喝了 "+$c.getDrinkBottleSum()+" 瓶。");  
  17.         update($c);  
  18. end  
  19.   
  20. rule "用两个空瓶换了一瓶汽水"  
  21.     when  
  22.         $c:Customer(emptyBottle>1,$e:emptyBottle, $d:drinkBottleSum);  
  23.     then  
  24.         $c.emptyBottle=$e-2+1;  
  25.         $c.drinkBottleSum=$d+1;  
  26.          System.out.println($c.getName()+"有 "+$c.getMoney()+" 元, 有空瓶 "+$c.getEmptyBottle()+" 个, 喝了 "+$c.getDrinkBottleSum()+" 瓶。");  
  27.         update($c);  
  28. end  
  29.   
  30. rule "结束"  
  31.     no-loop true      
  32.     when  
  33.          $c:Customer(money<=0,emptyBottle<2);  
  34.     then  
  35.          System.out.println("计算结束:"+$c.getName()+"有 "+$c.getMoney()+" 元, 有空瓶 "+$c.getEmptyBottle()+" 个, 喝了 "+$c.getDrinkBottleSum()+" 瓶。");  
  36.   
  37. end  

SoftDrink.java

 

Java代码  收藏代码
  1. package com.jsptpd.rjy.zyj.main;  
  2.   
  3. import org.drools.KnowledgeBase;  
  4. import org.drools.KnowledgeBaseFactory;  
  5. import org.drools.builder.KnowledgeBuilder;  
  6. import org.drools.builder.KnowledgeBuilderError;  
  7. import org.drools.builder.KnowledgeBuilderErrors;  
  8. import org.drools.builder.KnowledgeBuilderFactory;  
  9. import org.drools.builder.ResourceType;  
  10. import org.drools.io.ResourceFactory;  
  11. import org.drools.logger.KnowledgeRuntimeLogger;  
  12. import org.drools.logger.KnowledgeRuntimeLoggerFactory;  
  13. import org.drools.runtime.StatefulKnowledgeSession;  
  14.   
  15. public class SoftDrink {  
  16.   
  17.     /** 
  18.      * @param args 
  19.      */  
  20.     public static void main(String[] args) {  
  21.         try {  
  22.             KnowledgeBase knowledgeBase = readKnowledgeBase();  
  23.             StatefulKnowledgeSession statefulKnowledgeSession = knowledgeBase  
  24.                     .newStatefulKnowledgeSession();  
  25.             KnowledgeRuntimeLogger knowledgeRuntimeLogger = KnowledgeRuntimeLoggerFactory  
  26.                     .newFileLogger(statefulKnowledgeSession, "test");  
  27.             Customer customer=new Customer("小黄"5000);  
  28.             statefulKnowledgeSession.insert(customer);  
  29.             statefulKnowledgeSession.fireAllRules();  
  30.             knowledgeRuntimeLogger.close();  
  31.             statefulKnowledgeSession.dispose();  
  32.         } catch (Exception e) {  
  33.             // TODO Auto-generated catch block  
  34.             e.printStackTrace();  
  35.         }  
  36.     }  
  37.   
  38.     private static KnowledgeBase readKnowledgeBase() throws Exception {  
  39.         KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory  
  40.                 .newKnowledgeBuilder();  
  41.         knowledgeBuilder.add(ResourceFactory  
  42.                 .newClassPathResource("SoftDrink.drl"), ResourceType.DRL);  
  43.         KnowledgeBuilderErrors knowledgeBuilderErrors = knowledgeBuilder  
  44.                 .getErrors();  
  45.         if (knowledgeBuilderErrors.size() > 0) {  
  46.             for (KnowledgeBuilderError knowledgeBuilderError : knowledgeBuilderErrors) {  
  47.                 System.out.println(knowledgeBuilderError);  
  48.             }  
  49.             throw new IllegalArgumentException("KnowledgeBuilder创建失败!");  
  50.         }  
  51.   
  52.         KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();  
  53.         knowledgeBase.addKnowledgePackages(knowledgeBuilder  
  54.                 .getKnowledgePackages());  
  55.         return knowledgeBase;  
  56.     }  
  57.   
  58.     public static class Customer {  
  59.         private String name = "";  
  60.         private int money = 0;  
  61.         private int emptyBottle = 0;  
  62.         private int drinkBottleSum = 0;  
  63.   
  64.         public Customer(String name, int money, int emptyBottle,  
  65.                 int drinkBottleSum) {  
  66.             super();  
  67.             this.name = name;  
  68.             this.money = money;  
  69.             this.emptyBottle = emptyBottle;  
  70.             this.drinkBottleSum = drinkBottleSum;  
  71.         }  
  72.   
  73.         public String getName() {  
  74.             return name;  
  75.         }  
  76.   
  77.         public void setName(String name) {  
  78.             this.name = name;  
  79.         }  
  80.   
  81.         public int getMoney() {  
  82.             return money;  
  83.         }  
  84.   
  85.         public void setMoney(int money) {  
  86.             this.money = money;  
  87.         }  
  88.   
  89.         public int getEmptyBottle() {  
  90.             return emptyBottle;  
  91.         }  
  92.   
  93.         public void setEmptyBottle(int emptyBottle) {  
  94.             this.emptyBottle = emptyBottle;  
  95.         }  
  96.   
  97.         public int getDrinkBottleSum() {  
  98.             return drinkBottleSum;  
  99.         }  
  100.   
  101.         public void setDrinkBottleSum(int drinkBottleSum) {  
  102.             this.drinkBottleSum = drinkBottleSum;  
  103.         }  
  104.     }  
  105. }  

 

运行结果:

....

....

 

小黄有 2 元, 有空瓶 2 个, 喝了 94 瓶。

小黄有 2 元, 有空瓶 1 个, 喝了 95 瓶。

小黄有 1 元, 有空瓶 2 个, 喝了 96 瓶。

小黄有 1 元, 有空瓶 1 个, 喝了 97 瓶。

小黄有 0 元, 有空瓶 2 个, 喝了 98 瓶。

小黄有 0 元, 有空瓶 1 个, 喝了 99 瓶。

计算结束:小黄有 0 元, 有空瓶 1 个, 喝了 99 瓶。

 

 

 

---------------------------------------------------------------------------------------------------------------------------------------- 

附件直接导入Eclipse中运行.

附件drl文件有java实现,这个是mvel实现。例外还有个重写的。