natural ordering

L13-15. Term project(期末課題)
A recipe recommendation system
(レシピお勧めシステム)
(満点:30点)
RecipeRecommendation.java
recipes.data
materialsWm.data
1
期末課題(1)
レシピお勧めシステム
– 冷蔵庫にある素材
 facts in wm (materialsWM.data)
– レシピはruleである
http://www.ajinomoto.co.jp/recipe/
例:
• オムライス (ご飯、玉ねぎ、ハム、卵、トマトケチャップ、グリンピース)、
• オムライスカレーソース添え (オムライス、カレールートマト、パセリ))
rules in a rule base (recipes.data)
2
期末課題(2)
レシピお勧めシステム
– 個人の好き嫌いによっておすすめする
– メニューの情報や個人の健康状態によって
おすすめする
(optional)
– Backward chaining(後向き推論)で、冷蔵庫にあ
る素材から好きな料理が作れるかどうかを証明
する。もしつくれない場合は足りない材料を出力
する。
3
期末課題 (30p)
• CheckPointⅠ(15p)
– レシピは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クラスのカロリーや塩分の情報と、個人情報(健
康状態)の二つから最終的におすすめのランキングを
表示
– 例えばダイエット中である人の場合、カロリーの少ない順に
おすすめメニューを表示するなど
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;
import java.util.*;
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);
}
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
// 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);
}
}
Key
Output:
Key: ABC Val: abc
Key: MNO Val: mno
Key: XYZ Val: xyz
9
Rule-base System Examples
rule
if
then
"CarRule1"
"?x is inexpensive"
"?x is made in Japan"
antecedents
class WorkingMemory {
Vector assertions;
name
rule
if
then
"CarRule4"
"?x is big"
"?x needs a lot of gas"
"?x is a foreign car"
WorkingMemory(){
assertions = new Vector();
}
…….
class RuleBase {
String fileName;
class Rule {
WorkingMemory wm;
String name;
Vector rules;
Vector antecedents;
RuleBase(){
String consequent;
fileName = “ex10/CarShop.data";
Rule(String theName,Vector theAntecedents,
wm = new WorkingMemory();
String theConsequent){
wm.addAssertion("my-car is inexpensive");
this.name = theName;
wm.addAssertion("my-car is a wagon");
this.antecedents = theAntecedents;
rules = new Vector();
this.consequent = theConsequent;
loadRules(fileName);
}
}
public void addAssertion(String theAssertion){
consequent
System.out.println("ADD:"+theAssertion);
assertions.addElement(theAssertion);
}
10
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:
214:
215:
antecedents.addElement(st.sval);
st.nextToken();
}
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:}
11
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).
12