2011-04-19 8 views
2

Jess와 FuzzyJ를 배우려고하고 있지만 간단한 프로그램을 실행하는 데 문제가 있습니다. 나는 그것을 몇 시간 동안 보았고 왜 그것이 움직이지 않는지 확실히 모른다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면 그것은 대단히 감사하게 될 것입니다.Jess and FuzzyJ assist

;;;;;;;;;;;;;;;;;;;;;;;;; 
Fuzzy Variables 
;;;;;;;;;;;;;;;;;;;;;;;;;; 

(defglobal ?*income* = 
    (new nrc.fuzzy.FuzzyVariable "income" 0.0 230000.00 "dollars")) 
(defglobal ?*stability* = 
    (new nrc.fuzzy.FuzzyVariable "stability" 0.0 1.0 "index")) 
(defglobal ?*liquidity* = 
    (new nrc.fuzzy.FuzzyVariable "liquidity" 0.0 1.0 "index")) 



(defrule initial-terms 
    (declare (salience 100)) 
=> 
(import nrc.fuzzy.*) 
(load-package nrc.fuzzy.jess.FuzzyFunctions) 

;;;;;;;;;;;;;;;;;;;;; 
Primary Terms 
;;;;;;;;;;;;;;;;;;;;;;; 


(?*income* addTerm "low" (new ZFuzzySet 30000.00 80000.00)) 
(?*income* addTerm "medium" (new PIFuzzySet 100000.00 60000.00)) 
(?*income* addTerm "high" (new SFuzzySet 80000.00 190000.00)) 

(?*stability* addTerm "low" (new ZFuzzySet .3 .5)) 
(?*stability* addTerm "medium" (new PIFuzzySet .6 .4)) 
(?*stability* addTerm "high" (new SFuzzySet .7 .9)) 

(?*liquidity* addTerm "low" (new ZFuzzySet .3 .5)) 
(?*liquidity* addTerm "medium" (new PIFuzzySet .6 .4)) 
(?*liquidity* addTerm "high" (new SFuzzySet .7 . 9)) 
) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
Fuzzy Rules 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

(defrule rule-1 "low income => liquidity very low" 
    (theIncome ?x &: (fuzzy-match ?x "low")) 
=> 

    (assert(theLiquidity (new nrc.fuzzy.FuzzyValue ?*liquidity* "very low"))) 

(defrule rule-2 "high income & high stability => very high liquidity" 
    (theIncome ?x &: (fuzzy-match ?x "high")) 
    (theStability ?y (fuzzy-match ?y "high")) 
=> 
    (assert(theLiquidity (new nrc.fuzzy.FuzzyValue ?*liquidity* "very high")) 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
Defuzzification 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

(defrule defuzzification-and-display-liquidity 
    (declare (salience -1)) 
    ?f <- (theLiquidity ?z) 
=> 
    (printout t (str-cat "Liquidity: " (?z momentDefuzzify))) 
    retract(?f) 
    (halt)) 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
Start up Rule/Fuzzify 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

(defrule assert-income-and-stability "initialization" 
=> 
    (printout t "Enter the income(ex. 52000): ") 
    (bind ?income-value (float (readline t))) 

    (printout t "Enter the stability index(ex. 0.64): ") 
    (bind ?stability-value (float(readline t))) 


    (assert(theIncome 
     (new nrc.fuzzy.FuzzyValue ?*income* 
     (new nrc.fuzzy.TriangleFuzzySet 
     (- ?income-value 3000.0) 
     ?income-value 
     (+ ?income-value 3000.0))))) 

    (assert(theStability 
     (new nrc.fuzzy.FuzzyValue ?*stability* 
     (new nrc.fuzzy.TriangleFuzzySet 
     (- ?stability-value 3000.0) 
     ?stability-value 
     (+ ?stability-value 3000.0)))))) 

(reset) 
(run) 

답변

1

이 프로그램에는 많은 작은 구문 오류가 있습니다. 일반적으로 Jess 인터프리터는 그들을 지적하는 좋은 일을합니다. 우선, 각 주석 블록에서 주석의 실제 텍스트를 얻었습니다 ... 주석 처리되지 않았습니다. 예를 들어, "퍼지 변수"와 같은 줄의 시작 부분에 세미콜론을 추가하십시오.

둘째, 라인에 존재 해야지

(?*liquidity* addTerm "high" (new SFuzzySet .7 . 9)) 

은 마지막 소수점 공백 할 수 없습니다.

세 번째로, 규칙 rule-1rule-2은 끝에 대괄호가 충분하지 않습니다. 프로그래머가 편집 할 수있는 Lisp 코드를 포맷 할 수있는 편집기가 있으면이를 수정하는 데 도움이 될 것입니다. 참조 이전 행 - 술어 기능하기 전에 :

넷째, 라인

(theStability ?y (fuzzy-match ?y "high")) 

에 당신은 "&"을 놓치고있어. (retract ?f)을해야한다 -

마지막으로, 나는

retract(?f) 

가 기형화되어 줄 생각합니다.