0

I have built a fuzzy control system that takes 9 inputs (normal, fire, water, electric, grass, ice, fighting, poison) that accept (low, medium, or high) values and returns one output (weakness) with (weak or strong) value. unfortunately, when I test the system I get an assertion error without any additional information. the code used to build the system is shown below.

import skfuzzy as fuzz
from skfuzzy import control as ctrl

normal = ctrl.Antecedent(np.arange(0, 100, 1), 'normal')
fire = ctrl.Antecedent(np.arange(0, 100, 1), 'fire')
water = ctrl.Antecedent(np.arange(0, 100, 1), 'water')
electric = ctrl.Antecedent(np.arange(0, 100, 1), 'electric')
grass = ctrl.Antecedent(np.arange(0, 100, 1), 'grass')
ice = ctrl.Antecedent(np.arange(0, 100, 1), 'ice')
fighting = ctrl.Antecedent(np.arange(0, 100, 1), 'fighting')
poison = ctrl.Antecedent(np.arange(0, 100, 1), 'poison')
weakness = ctrl.Consequent(np.arange(0, 100, 1), 'weakness')

#normal.automf(3)
#fire.automf(3)
#water.automf(3)
#electric.automf(3)
#grass.automf(3)
#ice.automf(3)
#fighting.automf(3)
#poison.automf(3)
#weakness.autof(3)

#create membership function for normal
normal['low'] = fuzz.trapmf (normal.universe, [0, 0, 10, 20])
normal['medium'] = fuzz.trimf (normal.universe, [0, 25, 50])
normal['high'] = fuzz.trapmf (normal.universe, [25, 75, 100, 101])

#create membership function for fire
fire['low'] = fuzz.trapmf (fire.universe, [0, 0, 20, 50])
fire['medium'] = fuzz.trapmf (fire.universe, [0, 0, 20, 50])
fire['high'] = fuzz.trapmf (fire.universe, [25, 75, 100, 101])

#create membership function for water
water['low'] = fuzz.trapmf (water.universe, [0, 0, 20, 55])
water['medium'] = fuzz.trapmf (water.universe, [0, 0, 20, 55])
water['high'] = fuzz.trapmf (water.universe, [25, 75, 100, 101])

#create membership function for electric
electric['low'] = fuzz.trapmf (electric.universe, [0, 0, 25, 50])
electric['medium'] = fuzz.trapmf (electric.universe, [0, 0, 25, 50])
electric['high'] = fuzz.trapmf (electric.universe, [25, 75, 100, 101])

#create membership function for grass
grass['low'] = fuzz.trapmf (grass.universe, [0, 0,50, 65])
grass['medium'] = fuzz.trapmf (grass.universe, [0, 0,50, 65])
grass['high'] = fuzz.trapmf (grass.universe, [25, 75, 100, 101])

#create membership function for ice
ice['low'] = fuzz.trapmf (ice.universe, [0, 0, 10, 20])
ice['medium'] = fuzz.trapmf (ice.universe, [0, 25, 50, 60])
ice['high'] = fuzz.trapmf (ice.universe, [25, 75, 100, 101])

#create membership function for fighting
fighting['low'] = fuzz.trapmf (fighting.universe, [0, 0, 10, 20])
fighting['medium'] = fuzz.trapmf (fighting.universe, [00, 25, 50, 60])
fighting['high'] = fuzz.trapmf (fighting.universe, [25, 75, 100, 101])

#create membership function for poison
poison['low'] = fuzz.trapmf (poison.universe, [0, 0, 10, 20])
poison['medium'] = fuzz.trapmf (poison.universe, [0, 25, 50, 60])
poison['high'] = fuzz.trapmf (poison.universe, [25, 75, 100, 101])

#create membership function for weakness
weakness['weak'] = fuzz.trapmf (weakness.universe, [0, 0,50, 65])
weakness['strong'] = fuzz.trapmf (weakness.universe, [5, 50, 100, 100])

normal.view()
fire.view()
water.view()
electric.view()
grass.view()
ice.view()
fighting.view()
poison.view()

rule1 = ctrl.Rule(normal['low'] & fire['low'] & water['low'] & electric['low'] & grass['low'] & ice['low'] & fighting['low'] & poison['low'], weakness['strong'] )
rule2 = ctrl.Rule(normal['medium'] & fire['medium'] & water['medium'] & electric['medium'] & grass['medium'] & ice['medium'] & fighting['medium'] & poison['medium'], weakness['strong'] )
rule3 = ctrl.Rule(normal['high'] & fire['high'] & water['high'] & electric['high'] & grass['high'] & ice['high'] & fighting['high'] & poison['high'], weakness['weak'] )
rule4 = ctrl.Rule(normal['medium'] & fire['medium'] & water['high'] & electric['low'] & grass['low'] & ice['low'] & fighting['medium'] & poison['low'], weakness['strong'] )
rule5 = ctrl.Rule(normal['high'] & fire['high'] & water['medium'] & electric['medium'] & grass['low'] & ice['high'] & fighting['high'] & poison['high'], weakness['weak'] )

rule1.view()
rule2.view()
rule3.view()
rule4.view()
rule5.view()

weaklevel_ctrl = ctrl.ControlSystem([rule1, rule2, rule3, rule4, rule5])
weaklevel = ctrl.ControlSystemSimulation(weaklevel_ctrl)

# Pass inputs to the ControlSystem using Antecedent labels with Pythonic API
weaklevel.input['normal'] = 25
weaklevel.input['fire'] = 57
weaklevel.input['water'] = 35
weaklevel.input['electric'] = 27
weaklevel.input['grass'] = 50
weaklevel.input['ice'] = 48
weaklevel.input['fighting'] = 35
weaklevel.input['poison'] = 22

#Crunch the number
weaklevel.compute()

print (weaklevel.output['weakness'])
weakness.view(sim=weaklevel)

and the error I got is

/usr/local/lib/python3.6/dist-packages/skfuzzy/control/controlsystem.py in defuzz(self)
    586                 return defuzz(ups_universe, output_mf,
--> 587                               self.var.defuzzify_method)
    588             except AssertionError:

3 frames
AssertionError: Total area is zero in defuzzification!

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/skfuzzy/control/controlsystem.py in defuzz(self)
    587                               self.var.defuzzify_method)
    588             except AssertionError:
--> 589                 raise ValueError("Crisp output cannot be calculated, likely "
    590                                  "because the system is too sparse. Check to "
    591                                  "make sure this set of input values will "

ValueError: Crisp output cannot be calculated, likely because the system is too sparse. Check to make sure this set of input values will activate at least one connected Term in each Antecedent via the current set of Rules.

Alex W
  • 37,233
  • 13
  • 109
  • 109
  • "without any additional information"? That looks like a lot of additional information to me... – user202729 Jan 06 '21 at 13:26
  • Welcome to SO! Would this help? [fuzzy system python assertion error during input](https://stackoverflow.com/questions/44244691/fuzzy-system-python-assertion-error-during-input) – Red Jan 06 '21 at 13:27
  • Is this correct? Does it need 3 or 4 values? ```normal['medium'] = fuzz.trimf (normal.universe, [0, 25, 50])``` – demokritos Jan 06 '21 at 13:33

0 Answers0