Skip to main content

restaurant_tip_level/
restaurant_tip_level.rs

1use fuzzy_logic_engine_rs::{
2    fis::{FisType, FuzzyInferenceSystem},
3    membership::MembershipKind as M,
4    rule::{Connective, Rule},
5    term::Term,
6    variable::{LinguisticVariable, Range},
7};
8
9fn main() -> Result<(), Box<dyn std::error::Error>> {
10    let mut system = FuzzyInferenceSystem::new("Fuzzy logic based TIP system");
11
12    let mut tip = LinguisticVariable::new(
13        "tip",
14        Range {
15            min: 0.0,
16            max: 30.0,
17        },
18    );
19    tip.add_term(Term::new(
20        "small",
21        M::Triangle {
22            a: 0.0,
23            b: 5.0,
24            c: 10.0,
25        },
26    ));
27    tip.add_term(Term::new(
28        "average",
29        M::Triangle {
30            a: 10.0,
31            b: 15.0,
32            c: 20.0,
33        },
34    ));
35    tip.add_term(Term::new(
36        "generous",
37        M::Triangle {
38            a: 20.0,
39            b: 25.0,
40            c: 30.0,
41        },
42    ));
43    system.add_output(tip);
44
45    let mut service = LinguisticVariable::new(
46        "service",
47        Range {
48            min: 0.0,
49            max: 10.0,
50        },
51    );
52    service.add_term(Term::new(
53        "poor",
54        M::Gauss {
55            sigma: 2.123,
56            mu: 0.0,
57        },
58    ));
59    service.add_term(Term::new(
60        "normal",
61        M::Gauss {
62            sigma: 2.123,
63            mu: 5.0,
64        },
65    ));
66    service.add_term(Term::new(
67        "excellent",
68        M::Gauss {
69            sigma: 2.123,
70            mu: 10.0,
71        },
72    ));
73    system.add_input(service);
74
75    let mut food = LinguisticVariable::new(
76        "food",
77        Range {
78            min: 0.0,
79            max: 10.0,
80        },
81    );
82    food.add_term(Term::new(
83        "bad",
84        M::Trapezoid {
85            a: 0.0,
86            b: 0.0,
87            c: 1.0,
88            d: 3.0,
89        },
90    ));
91    food.add_term(Term::new(
92        "good",
93        M::Trapezoid {
94            a: 7.0,
95            b: 9.0,
96            c: 10.0,
97            d: 10.0,
98        },
99    ));
100    system.add_input(food);
101
102    system.set_rules(vec![
103        Rule::new(
104            vec![Some("poor".into()), Some("bad".into())],
105            vec!["small".into()],
106            Connective::And,
107        ),
108        Rule::new(
109            vec![Some("normal".into()), None],
110            vec!["average".into()],
111            Connective::And,
112        ),
113        Rule::new(
114            vec![Some("excellent".into()), Some("good".into())],
115            vec!["generous".into()],
116            Connective::And,
117        ),
118    ]);
119
120    let result = system.compute(FisType::Mamdani, &[7.892, 7.41])?;
121    println!("{result:?}");
122    assert!(result[0] > 18.0);
123    assert!(result[0] < 19.0);
124
125    Ok(())
126}