L13-15. Term project(期末課題) A recipe recommendation system (レシピお勧めシステム) (満点:30点) RecipeRecommendation.java recipes.data materialsWm.data
期末課題(1) レシピお勧めシステム facts in wm (materialsWM.data) 冷蔵庫にある素材 facts in wm (materialsWM.data) レシピはruleであるhttp://www.ajinomoto.co.jp/recipe/ 例: オムライス (ご飯、玉ねぎ、ハム、卵、トマトケチャップ、グリンピース)、 オムライスカレーソース添え (オムライス、カレールートマト、パセリ)) rules in a rule base (recipes.data)
期末課題(2) レシピお勧めシステム 個人の好き嫌いによっておすすめする メニューの情報や個人の健康状態によって おすすめする おすすめする (optional) Backward chaining(後向き推論)で、冷蔵庫にある素材から好きな料理が作れるかどうかを証明する。もしつくれない場合は足りない材料を出力する。
期末課題 (30p) CheckPointⅠ(15p) CheckPointⅡ(10p) CheckPointⅢ(5p) レシピは10個以上(調味料は含まない) メニューを2個以上生成 CheckPointⅡ(10p) 好き嫌いによっておすすめメニューをランキング表示する CheckPointⅢ(5p) カロリーや塩分、個人情報(健康状態)からおすすめメニューをランキング表示する
Check Point Ⅰ ~メニューを2個以上完成させる~ Ruleだけでなく、WorkingMemoryファイルも別に作り読み込む 今回はloadRules(“recipe.data”)だけではなく、loadWm(“materialsWm.data”)といったものが必要となってくる キーワード FileReader
Check Point Ⅱ ~好き嫌いによっておすすめをランキング表示~ 好きなもの、嫌いなもののリストを自由につくり、それに応じて出来上がったメニューをランキング形式で並び替える キーワード Hashtable Vector
Check Point Ⅲ ~カロリーや塩分、個人情報(健康状態)からおすすめをランキング表示~ 新しいrecipeクラスで、getCalorie(), setCalorie(), getSalt(), setSalt(), などメニューの情報を追加・参照 別のpersonalクラスで個人情報(高血圧、ダイエット中など)の追加・参照(クラスでなくても可) recipeクラスのカロリーや塩分の情報と、個人情報(健康状態)の二つから最終的におすすめのランキングを表示 例えばダイエット中である人の場合、カロリーの少ない順におすすめメニューを表示するなど
Hashtable Ex4 RuleBaseSystem Ex11-12 Appendix -付録- (参照用) Hashtable Ex4 RuleBaseSystem Ex11-12
An example: Sort Hashtable import java.util.Hashtable; import java.util.Vector; import java.util.Collections; import java.util.Enumeration; public class SortHashtable { public static void main(String[] args) { // Create and populate hashtable Hashtable ht = new Hashtable(); ht.put("ABC", "abc"); ht.put("XYZ", "xyz"); ht.put("MNO", "mno"); // Sort hashtable. Vector v = new Vector(ht.keySet()); Collections.sort(v); // Display (sorted) hashtable. for (Enumeration e = v.elements(); e.hasMoreElements();) { String key = (String)e.nextElement(); String val = (String)ht.get(key); System.out.println("Key: " + key + " Val: " + val); } } } import java.util.*; Key Value ABC abc XYZ xyz MNO mno static voidsort(List list) Sorts the specified list into ascending order, according to the natural ordering of its elements Output: Key: ABC Val: abc Key: MNO Val: mno Key: XYZ Val: xyz
Rule-base System Examples rule "CarRule1" if "?x is inexpensive" then "?x is made in Japan" antecedents class WorkingMemory { Vector assertions; WorkingMemory(){ assertions = new Vector(); } ……. name rule "CarRule4" if "?x is big" "?x needs a lot of gas" then "?x is a foreign car" consequent class RuleBase { String fileName; WorkingMemory wm; Vector rules; RuleBase(){ fileName = “ex10/CarShop.data"; wm = new WorkingMemory(); wm.addAssertion("my-car is inexpensive"); wm.addAssertion("my-car is a wagon"); rules = new Vector(); loadRules(fileName); } class Rule { String name; Vector antecedents; String consequent; Rule(String theName,Vector theAntecedents, String theConsequent){ this.name = theName; this.antecedents = theAntecedents; this.consequent = theConsequent; } public void addAssertion(String theAssertion){ System.out.println("ADD:"+theAssertion); assertions.addElement(theAssertion); }
loadRules method 193: private void loadRules(String theFileName){ 194: String line; 195: try{ 196: int token; 197: f = new FileReader(theFileName); 198: st = new StreamTokenizer(f); 199: while((token = st.nextToken())!= StreamTokenizer.TT_EOF){ 200: switch(token){ 201: case StreamTokenizer.TT_WORD: 202: String name = null; 203: Vector antecedents = null; 204: String consequent = null; 205: if("rule".equals(st.sval)){ 206: if(st.nextToken() == '"'){ 207: name = st.sval; 208: st.nextToken(); 209: if("if".equals(st.sval)){ 210: antecedents = new Vector(); 211: st.nextToken(); 212: while(!"then".equals(st.sval)){ 213: antecedents.addElement(st.sval); 214: st.nextToken(); 215: } 216: if("then".equals(st.sval)){ 217: st.nextToken(); 218: consequent = st.sval; 219: } 220: } 221: } 222: } 223: rules.addElement( 224: new Rule(name,antecedents,consequent)); 225: break; 226: default: 227: System.out.println(token); 228: break; 229: } 230: } 231: } catch(Exception e){ 232: System.out.println(e); 233: } 234: for(int i = 0 ; i < rules.size() ; i++){ 235:System.out.println(((Rule)rules.elementAt(i)).toString()); 236: } 237: } 238:}
Term Project A recipe recommendation system Materials in a refrigerator facts in wm (materialsWM.data) Recipes as rules http://www.ajinomoto.co.jp/recipe/ e.g. * Omelet rice (Rice, Onion, Ham, Egg, Tomato, Green peas) * Curry sauce omelet rice (Omelet Rice, Curry root, Tomato, Parsely) rules in a rule base (recipe.data) Personal preference (like, dislike food) Personal health condition (calories, salt amount) (Optional) Use backward chaining method to prove the recipe you like if it is ok to cook (whether you have materials or not).