fuzzy_associative_memory 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -45,6 +45,22 @@ To do (in descending importance, roughly):
45
45
  * Hedges ('very' and 'fairly')
46
46
  * Additional examples
47
47
 
48
+ ## Gem installation
49
+
50
+ I recommend you clone the Git repository and browse the examples and source code to fully understand how FAMs work.
51
+
52
+ But if / when you want to use this in your own project, the easiest way to do so is via the Gem:
53
+ ```
54
+ gem install fuzzy_associative_memory
55
+ ```
56
+
57
+ Then in your code:
58
+ ```
59
+ require 'fuzzy_associative_memory'
60
+ ```
61
+
62
+ The gem is fully namespaced to prevent collisions. See the examples for usage details.
63
+
48
64
  ## Included examples
49
65
 
50
66
  The `bin` directory contains the following examples:
@@ -49,11 +49,11 @@ fan_speed.sets = [stop, slow, medium, fast, blast]
49
49
  # "If the temperature is cool, the fan motor speed should be slow."
50
50
  system = FuzzyAssociativeMemory::Ruleset.new("HVAC control", :larsen)
51
51
 
52
- rule_1 = FuzzyAssociativeMemory::Rule.new('If room is cold, the fan motor stops', [cold], nil, stop)
53
- rule_2 = FuzzyAssociativeMemory::Rule.new('If room is cool, the fan motor is slow', [cool], nil, slow)
54
- rule_3 = FuzzyAssociativeMemory::Rule.new('If room is just right, the fan motor is medium', [just_right], nil, medium)
55
- rule_4 = FuzzyAssociativeMemory::Rule.new('If room is warm, the fan motor speeds up', [warm], nil, fast)
56
- rule_5 = FuzzyAssociativeMemory::Rule.new('If room is hot, the fan motor runs full-blast', [hot], nil, blast)
52
+ rule_1 = FuzzyAssociativeMemory::Rule.new([cold], nil, stop , 'If room is cold, the fan motor stops' )
53
+ rule_2 = FuzzyAssociativeMemory::Rule.new([cool], nil, slow , 'If room is cool, the fan motor is slow' )
54
+ rule_3 = FuzzyAssociativeMemory::Rule.new([just_right], nil, medium , 'If room is just right, the fan motor is medium' )
55
+ rule_4 = FuzzyAssociativeMemory::Rule.new([warm], nil, fast , 'If room is warm, the fan motor speeds up' )
56
+ rule_5 = FuzzyAssociativeMemory::Rule.new([hot], nil, blast , 'If room is hot, the fan motor runs full-blast' )
57
57
 
58
58
  system.rules = [rule_1, rule_2, rule_3, rule_4, rule_5]
59
59
 
@@ -50,25 +50,25 @@ rocket_ammo_status.sets = [rkt_ammo_low, rkt_ammo_okay, rkt_ammo_loads]
50
50
  # fan speed' variable is the assemblage of all our fuzzy output sets.
51
51
  desirability = FuzzyAssociativeMemory::LinguisticVariable.new("weapon desirability")
52
52
 
53
- undes = FuzzyAssociativeMemory::Trapezoid.new(0, 0, 20, 50)
54
- desir = FuzzyAssociativeMemory::Triangle.new(30, 50, 70)
55
- v_desir = FuzzyAssociativeMemory::Trapezoid.new(50, 80, 100, 100)
53
+ undesirable = FuzzyAssociativeMemory::Trapezoid.new(0, 0, 20, 50)
54
+ desirable = FuzzyAssociativeMemory::Triangle.new(30, 50, 70)
55
+ very_desirable = FuzzyAssociativeMemory::Trapezoid.new(50, 80, 100, 100)
56
56
 
57
- desirability.sets = [undes, desir, v_desir]
57
+ desirability.sets = [undesirable, desirable, very_desirable]
58
58
 
59
59
  # Natural-language marriage of the inputs to the outputs, e.g.
60
60
  # "If the temperature is cool, the fan motor speed should be slow."
61
61
  rkt_ruleset = FuzzyAssociativeMemory::Ruleset.new("Rocket launcher desirability", implication)
62
62
 
63
- rule_1 = FuzzyAssociativeMemory::Rule.new('If target is far and I have loads of rocket ammo, rocket launcher is desirable', [tgt_far, rkt_ammo_loads], :and, desir)
64
- rule_2 = FuzzyAssociativeMemory::Rule.new('If target is far and I have some rocket ammo, rocket launcher is undesirable', [tgt_far, rkt_ammo_okay], :and, undes)
65
- rule_3 = FuzzyAssociativeMemory::Rule.new('If target is far and I have low rocket ammo, rocket launcher is undesirable', [tgt_far, rkt_ammo_low], :and, undes)
66
- rule_4 = FuzzyAssociativeMemory::Rule.new('If target is medium-distance and I have loads of rocket ammo, rocket launcher is very desirable', [tgt_medium, rkt_ammo_loads], :and, v_desir)
67
- rule_5 = FuzzyAssociativeMemory::Rule.new('If target is medium-distance and I have some rocket ammo, rocket launcher is very desirable', [tgt_medium, rkt_ammo_okay], :and, v_desir)
68
- rule_6 = FuzzyAssociativeMemory::Rule.new('If target is medium-distance and I have low rocket ammo, rocket launcher is desirable', [tgt_medium, rkt_ammo_low], :and, desir)
69
- rule_7 = FuzzyAssociativeMemory::Rule.new('If target is close and I have loads of rocket ammo, rocket launcher is undesirable', [tgt_close, rkt_ammo_loads], :and, undes)
70
- rule_8 = FuzzyAssociativeMemory::Rule.new('If target is close and I have some rocket ammo, rocket launcher is undesirable', [tgt_close, rkt_ammo_okay], :and, undes)
71
- rule_9 = FuzzyAssociativeMemory::Rule.new('If target is close and I have low rocket ammo, rocket launcher is undesirable', [tgt_close, rkt_ammo_low], :and, undes)
63
+ rule_1 = FuzzyAssociativeMemory::Rule.new([tgt_far, rkt_ammo_loads], :and, desirable, 'If target is far and I have loads of rocket ammo, rocket launcher is desirable')
64
+ rule_2 = FuzzyAssociativeMemory::Rule.new([tgt_far, rkt_ammo_okay], :and, undesirable, 'If target is far and I have some rocket ammo, rocket launcher is undesirable')
65
+ rule_3 = FuzzyAssociativeMemory::Rule.new([tgt_far, rkt_ammo_low], :and, undesirable, 'If target is far and I have low rocket ammo, rocket launcher is undesirable')
66
+ rule_4 = FuzzyAssociativeMemory::Rule.new([tgt_medium, rkt_ammo_loads], :and, very_desirable, 'If target is medium-distance and I have loads of rocket ammo, rocket launcher is very desirable')
67
+ rule_5 = FuzzyAssociativeMemory::Rule.new([tgt_medium, rkt_ammo_okay], :and, very_desirable, 'If target is medium-distance and I have some rocket ammo, rocket launcher is very desirable')
68
+ rule_6 = FuzzyAssociativeMemory::Rule.new([tgt_medium, rkt_ammo_low], :and, desirable, 'If target is medium-distance and I have low rocket ammo, rocket launcher is desirable')
69
+ rule_7 = FuzzyAssociativeMemory::Rule.new([tgt_close, rkt_ammo_loads], :and, undesirable, 'If target is close and I have loads of rocket ammo, rocket launcher is undesirable')
70
+ rule_8 = FuzzyAssociativeMemory::Rule.new([tgt_close, rkt_ammo_okay], :and, undesirable, 'If target is close and I have some rocket ammo, rocket launcher is undesirable')
71
+ rule_9 = FuzzyAssociativeMemory::Rule.new([tgt_close, rkt_ammo_low], :and, undesirable, 'If target is close and I have low rocket ammo, rocket launcher is undesirable')
72
72
 
73
73
  rkt_ruleset.rules = [rule_1, rule_2, rule_3, rule_4, rule_5, rule_6, rule_7, rule_8, rule_9]
74
74
 
@@ -91,15 +91,15 @@ gun_ammo_loads = FuzzyAssociativeMemory::Trapezoid.new(10, 30, 40, 40)
91
91
  shotgun_ammo_status.sets = [gun_ammo_low, gun_ammo_okay, gun_ammo_loads]
92
92
 
93
93
  gun_ruleset = FuzzyAssociativeMemory::Ruleset.new("Shotgun desirability", implication)
94
- rule_1 = FuzzyAssociativeMemory::Rule.new('If target is far and I have loads of shotgun ammo, shotgun is undesirable', [tgt_far, gun_ammo_loads], :and, undes)
95
- rule_2 = FuzzyAssociativeMemory::Rule.new('If target is far and I have some shotgun ammo, shotgun is undesirable', [tgt_far, gun_ammo_okay], :and, undes)
96
- rule_3 = FuzzyAssociativeMemory::Rule.new('If target is far and I have low shotgun ammo, shotgun is undesirable', [tgt_far, gun_ammo_low], :and, undes)
97
- rule_4 = FuzzyAssociativeMemory::Rule.new('If target is medium-distance and I have loads of shotgun ammo, shotgun is desirable', [tgt_medium, gun_ammo_loads], :and, desir)
98
- rule_5 = FuzzyAssociativeMemory::Rule.new('If target is medium-distance and I have some shotgun ammo, shotgun is desirable', [tgt_medium, gun_ammo_okay], :and, desir)
99
- rule_6 = FuzzyAssociativeMemory::Rule.new('If target is medium-distance and I have low shotgun ammo, shotgun is undesirable', [tgt_medium, gun_ammo_low], :and, undes)
100
- rule_7 = FuzzyAssociativeMemory::Rule.new('If target is close and I have loads of shotgun ammo, shotgun is very desirable', [tgt_close, gun_ammo_loads], :and, v_desir)
101
- rule_8 = FuzzyAssociativeMemory::Rule.new('If target is close and I have some shotgun ammo, shotgun is very desirable', [tgt_close, gun_ammo_okay], :and, v_desir)
102
- rule_9 = FuzzyAssociativeMemory::Rule.new('If target is close and I have low shotgun ammo, shotgun is very desirable', [tgt_close, gun_ammo_low], :and, v_desir)
94
+ rule_1 = FuzzyAssociativeMemory::Rule.new([tgt_far, gun_ammo_loads], :and, undesirable, 'If target is far and I have loads of shotgun ammo, shotgun is undesirable')
95
+ rule_2 = FuzzyAssociativeMemory::Rule.new([tgt_far, gun_ammo_okay], :and, undesirable, 'If target is far and I have some shotgun ammo, shotgun is undesirable')
96
+ rule_3 = FuzzyAssociativeMemory::Rule.new([tgt_far, gun_ammo_low], :and, undesirable, 'If target is far and I have low shotgun ammo, shotgun is undesirable')
97
+ rule_4 = FuzzyAssociativeMemory::Rule.new([tgt_medium, gun_ammo_loads], :and, desirable, 'If target is medium-distance and I have loads of shotgun ammo, shotgun is desirable')
98
+ rule_5 = FuzzyAssociativeMemory::Rule.new([tgt_medium, gun_ammo_okay], :and, desirable, 'If target is medium-distance and I have some shotgun ammo, shotgun is desirable')
99
+ rule_6 = FuzzyAssociativeMemory::Rule.new([tgt_medium, gun_ammo_low], :and, undesirable, 'If target is medium-distance and I have low shotgun ammo, shotgun is undesirable')
100
+ rule_7 = FuzzyAssociativeMemory::Rule.new([tgt_close, gun_ammo_loads], :and, very_desirable, 'If target is close and I have loads of shotgun ammo, shotgun is very desirable')
101
+ rule_8 = FuzzyAssociativeMemory::Rule.new([tgt_close, gun_ammo_okay], :and, very_desirable, 'If target is close and I have some shotgun ammo, shotgun is very desirable')
102
+ rule_9 = FuzzyAssociativeMemory::Rule.new([tgt_close, gun_ammo_low], :and, very_desirable, 'If target is close and I have low shotgun ammo, shotgun is very desirable')
103
103
  gun_ruleset.rules = [rule_1, rule_2, rule_3, rule_4, rule_5, rule_6, rule_7, rule_8, rule_9]
104
104
 
105
105
  sa = 12
@@ -19,7 +19,11 @@ class FuzzyAssociativeMemory::Rule
19
19
  # - +consequent+ -> the output fuzzy set
20
20
  # - +natural_language+ -> a rule description (your own words), useful in output
21
21
  #
22
- def initialize(natural_language, antecedent_array, boolean, consequent)
22
+ def initialize(antecedent_array, boolean, consequent, natural_language=nil)
23
+ if antecedent_array.is_a? String
24
+ raise ArgumentError, "As of v1.0.1, Rule::initialize() has changed. Please see the code and CHANGELOG. (Sorry for the trouble.)"
25
+ end
26
+
23
27
  raise ArgumentError, "Antecedent array must contain at least one fuzzy set" unless antecedent_array.size > 0
24
28
  raise ArgumentError, "Consequent must be provided" unless consequent
25
29
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: fuzzy_associative_memory
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.0.0
5
+ version: 1.0.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Chris Powell