문제

사실 데이터베이스와 데이터베이스에 대한 특정 규칙을 처리 해야하는 규칙 평가 시스템을 설계하고 있습니다. 우리는 현재 a를 가지고 있습니다 RETE의 수정 된 버전 그것은 약간의 단점으로 부분적으로 올바르게 작동합니다.

문제는 규칙이 정확한 일치로 제한되지 않지만 불평등 (보다 적은 것과 같이) 및 기타 종류의 퍼지 계산을 지원해야한다는 것입니다.

예,이 사실이 있다고 가정 해 봅시다

(급여 John 58000) (Salary Sara 78000) (직원 John) (Boss Sara) (결혼 John Sara) (Works John StackoverFlow)

다음과 같은 규칙이있을 수 있습니다.

(급여? W <60000) / (결혼? W) / (Works? W stackoverflow) ==>

분명히 결과는 "존"이라는 값으로 규칙을 트리거 할 것이지만, 우리가 지금하고있는 방식은 첫 번째 표현식 (급여 xx)의 구걸과 일치하는 사실 기반의 각 요소를 루핑하는 것입니다. 비교를하고 결과를 자체적으로 저장합니다. 예를 들어, 첫 번째 패스 후에는 다음 항목이 사실 기반에 추가됩니다.

(급여 요한 58000 <60000)

그리고 일단 그것이 만들어지면 당신은 일반적인 Rete Way에서 조인을 수행합니다. 이렇게하면 사실 기반에서 많은 공간을 차지합니다. 특히 규칙은 숫자를 참조 할 수 있으므로 규칙이 활성화되는 한 "계산 된"사실이 있기 때문입니다.

반면에 첫 번째 표현식으로 여러 규칙을 적용 할 수 있으며 표준 매칭 알고리즘을 계속 사용하여 규칙을 트리거 할 수 있습니다.

이런 종류의 행동을 처리하는 패턴, 참조 또는 방법을 아는 사람이 있습니까? 일반적인 도약, 치료, 재고 알고리즘은 (내가 아는 한) "정확한"일치 만 처리합니다.

그건 그렇고, 이것은 c# .net입니다.

도움이 되었습니까?

해결책

클립 내가 알고있는 한 조건부 요소를 지원해 왔습니다. 확인하십시오 클립을위한 기본 프로그래밍 안내서클립 튜토리얼 예를 들어. 클립 소스를 무료로 보거나 수정할 수 있습니다.

클립은 접두사 표기법을 사용하므로 예제 조건부가 다음과 같습니다.

(defrule fat-boy
    (person-data (name ?name) (weight ?weight))
    (test (> ?weight 100))
=>
    (printout t ?name " weighs " ?weight " kg! " crlf)
)

다른 팁

내가 문제를 이해하는 한, 모든 퍼지 규칙은 정수 또는 부동 소수점 값을 나누게합니다. 예를 들어, 급여가 58000, 60000, 78000 값과 비교되면 <58000, 58000-60000, 60000-78000,> 78000의 4 가지 범위가 있습니다.

이 경우 변수를 0,1,2,3 인 정수로 재정의하여 불평등 규칙을 평등 규칙으로 변환 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top