import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
import matplotlib.pyplot as plt
# Step 1: Define fuzzy variables
service = ctrl.Antecedent(np.arange(0, 11, 1), 'service')
quality = ctrl.Antecedent(np.arange(0, 11, 1), 'quality')
tip = ctrl.Consequent(np.arange(0, 26, 1), 'tip')
# Membership functions
service['poor'] = fuzz.trimf(service.universe, [0, 0, 5])
service['average'] = fuzz.trimf(service.universe, [0, 5, 10])
service['good'] = fuzz.trimf(service.universe, [5, 10, 10])
quality['bad'] = fuzz.trimf(quality.universe, [0, 0, 5])
quality['okay'] = fuzz.trimf(quality.universe, [0, 5, 10])
quality['delicious'] = fuzz.trimf(quality.universe, [5, 10, 10])
tip['low'] = fuzz.trimf(tip.universe, [0, 0, 13])
tip['medium'] = fuzz.trimf(tip.universe, [0, 13, 25])
tip['high'] = fuzz.trimf(tip.universe, [13, 25, 25])
# View membership functions
# service.view(), quality.view(), tip.view()
# Step 2: Create Fuzzy Rule Base
rule1 = ctrl.Rule(service['poor'] & quality['bad'], tip['low'])
rule2 = ctrl.Rule(service['poor'] & quality['okay'], tip['low'])
rule3 = ctrl.Rule(service['poor'] & quality['delicious'],
tip['medium'])
rule4 = ctrl.Rule(service['average'] & quality['bad'], tip['low'])
rule5 = ctrl.Rule(service['average'] & quality['okay'], tip['medium'])
rule6 = ctrl.Rule(service['average'] & quality['delicious'],
tip['high'])
rule7 = ctrl.Rule(service['good'] & quality['bad'], tip['medium'])
rule8 = ctrl.Rule(service['good'] & quality['okay'], tip['high'])
rule9 = ctrl.Rule(service['good'] & quality['delicious'], tip['high'])
# Step 3: Implement the system
tipping_ctrl = ctrl.ControlSystem([rule1, rule2, rule3, rule4, rule5,
rule6, rule7, rule8, rule9])
tipping = ctrl.ControlSystemSimulation(tipping_ctrl)
# Step 4: Test with 5 inputs
test_cases = [
(2.0, 3.0),
(5.0, 5.0),
(8.0, 2.0),
(6.0, 9.0),
(9.0, 9.0)
]
# Case 1
tipping.input['service'] = 2.0
tipping.input['quality'] = 3.0
tipping.compute()
tip.view(sim=tipping)
# Case 2
tipping.input['service'] = 5.0
tipping.input['quality'] = 5.0
tipping.compute()
tip.view(sim=tipping)
# Case 3
tipping.input['service'] = 8.0
tipping.input['quality'] = 2.0
tipping.compute()
tip.view(sim=tipping)
# Case 4
tipping.input['service'] = 6.0
tipping.input['quality'] = 9.0
tipping.compute()
tip.view(sim=tipping)
# Case 5
tipping.input['service'] = 9.0
tipping.input['quality'] = 9.0
tipping.compute()
tip.view(sim=tipping)
# Optional: Show membership plots
service.view()
quality.view()
tip.view()