Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
344 views
in Technique[技术] by (71.8m points)

python - Fuzzy system ValueError

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
等待大神答复

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...