restaurant_tip_level/
restaurant_tip_level.rs1use 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}