fuzzyrb 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ == 1.2.1 / 2007-11-19
2
+
3
+ * Bugfix: example has not included Fuzzyrb module.
4
+
1
5
  == 1.2.0 / 2007-11-16
2
6
 
3
7
  * Some bugfixes
data/README.txt CHANGED
@@ -13,8 +13,8 @@ Implements Fuzzy Sets in Ruby. I am very beginner at this topic, so it is very b
13
13
  * No error handling.
14
14
  * Defuzzification as center of gravity and first maximum
15
15
  * Minimum and Multiplication T-Norms.
16
- * Mamdami and Larsen aggregation methods.
17
- * Reasoning - apply matching rule and combine the results. Mamdami or Takagi-Sugeno system.
16
+ * Mamdani and Larsen aggregation methods.
17
+ * Reasoning - apply matching rule and combine the results. Mamdani or Takagi-Sugeno system.
18
18
 
19
19
  == SYNOPSIS:
20
20
 
@@ -17,9 +17,32 @@
17
17
  # In this example we try to model the function f(x, y) = x + y using different
18
18
  # parameters. As a result we get couple graphs of difference between the model
19
19
  # and the function and sum of errors (differences)
20
+ #
21
+ # To use gnuplot you have to apply a little diff on gnuplot 2.2 from
22
+ # RubyForge:
23
+ # *** 250,256 ****
24
+ # y.each_with_index do |yv, j|
25
+ # f << [ xv, yv, d[i][j] ].join(" ") << "\n"
26
+ # end
27
+ # ! # f << "\n"
28
+ # end
29
+ # elsif ( self[0].kind_of? Numeric ) then
30
+ # self.length.times do |i| f << "#{self[i]}\n" end
31
+ # --- 250,256 ----
32
+ # y.each_with_index do |yv, j|
33
+ # f << [ xv, yv, d[i][j] ].join(" ") << "\n"
34
+ # end
35
+ # ! f << "\n"
36
+ # end
37
+ # elsif ( self[0].kind_of? Numeric ) then
38
+ # self.length.times do |i| f << "#{self[i]}\n" end
39
+ #
40
+ # Without uncomenting this line 3dplot seems not to work.
41
+
20
42
 
21
43
  $:.unshift(File.dirname(__FILE__) + "/../lib/")
22
44
  require 'fuzzy'
45
+ include Fuzzyrb
23
46
  @smallInput = FuzzySet.trapezoid([0, 0, 0, 10])
24
47
  @largeInput = FuzzySet.trapezoid([0, 10, 10, 10])
25
48
  @smallOutput = FuzzySet.trapezoid([0, 0, 0, 10])
@@ -29,7 +52,7 @@ require 'fuzzy'
29
52
  @rule2 = FuzzyRule.new([@smallInput, @largeInput], @mediumOutput)
30
53
  @rule3 = FuzzyRule.new([@largeInput, @smallInput], @mediumOutput)
31
54
  @rule4 = FuzzyRule.new([@largeInput, @largeInput], @largeOutput)
32
- @ms = MamdamiImplication.new([@rule1, @rule2, @rule3, @rule4])
55
+ @ms = MamdaniImplication.new([@rule1, @rule2, @rule3, @rule4])
33
56
 
34
57
  @rulets1 = FuzzyRule.new([@smallInput, @smallInput], Proc.new { |a, b| 0})
35
58
  @rulets2 = FuzzyRule.new([@smallInput, @largeInput], Proc.new { |a, b| 10})
@@ -37,38 +60,46 @@ require 'fuzzy'
37
60
  @rulets4 = FuzzyRule.new([@largeInput, @largeInput], Proc.new { |a, b| 20})
38
61
  @tss = TakagiSugenoImplication.new([@rulets1, @rulets2, @rulets3, @rulets4])
39
62
 
40
- require 'rubygems'
41
- require 'gnuplot'
63
+ begin
64
+ require 'rubygems'
65
+ require 'gnuplot'
66
+ @makePlot = true
67
+ rescue LoadError
68
+ @makePlot = false
69
+ STDERR.puts "If you want to see graphical output you have to install gnuplot from Rubyforge!"
70
+ end
42
71
  @sum_of_diffs = {}
43
72
  def count_error(implication, params)
44
- Gnuplot.open do |gp|
45
- Gnuplot::SPlot.new( gp ) do |plot|
46
- plot.title "#{params.inspect}"
47
- plot.xlabel "a"
48
- plot.ylabel "b"
49
- plot.set("ticslevel", "0.8")
50
- plot.set("isosample", "40,40")
73
+ range = 0..10
74
+ x = range.collect {|v| v.to_f}
75
+ y = x
76
+ z = []
77
+ pp params
78
+ for i in range do
79
+ z << []
80
+ for j in range do
81
+ # print " T_Norm: #{t_norm}, implication: #{imp_type}, deffuzification: #{def_type}, difference: "
82
+ res = implication.evaluate([i, j],params)
83
+ diff = (res - (i+j)).abs
84
+ @sum_of_diffs[params] ||= 0
85
+ @sum_of_diffs[params] += diff
86
+ puts "[#{i}, #{j}] #{res} - #{i+j} = #{res - (i+j)}"
87
+ z[i] << diff
88
+ end
89
+ end
90
+ if @makePlot
91
+ Gnuplot.open do |gp|
92
+ Gnuplot::SPlot.new( gp ) do |plot|
93
+ plot.title "#{params.inspect}"
94
+ plot.xlabel "a"
95
+ plot.ylabel "b"
96
+ plot.set("ticslevel", "0.8")
97
+ plot.set("isosample", "40,40")
51
98
 
52
- range = 0..10
53
- x = range.collect {|v| v.to_f}
54
- y = x
55
- z = []
56
- pp params
57
- for i in range do
58
- z << []
59
- for j in range do
60
- # print " T_Norm: #{t_norm}, implication: #{imp_type}, deffuzification: #{def_type}, difference: "
61
- res = implication.evaluate([i, j],params)
62
- diff = (res - (i+j)).abs
63
- @sum_of_diffs[params] ||= 0
64
- @sum_of_diffs[params] += diff
65
- puts "[#{i}, #{j}] #{res} - #{i+j} = #{res - (i+j)}"
66
- z[i] << diff
99
+ plot.data << Gnuplot::DataSet.new( [x, y, z] ) do |ds|
100
+ ds.with = "lines"
67
101
  end
68
102
  end
69
- plot.data << Gnuplot::DataSet.new( [x, y, z] ) do |ds|
70
- ds.with = "lines"
71
- end
72
103
  end
73
104
  end
74
105
  end
@@ -80,10 +111,5 @@ end
80
111
  count_error(@ms, :t_norm => t_norm, :implication => imp_type, :defuzzification => def_type)
81
112
  end
82
113
  end
83
- # print "[#{i}, #{j}] T_norm: #{t_norm}, implication: Takagi Sugeno, difference: "
84
- # res = @tss.evaluate([i, j], t_norm)
85
- # sum_of_diffs[[t_norm, :ts]] ||= 0
86
- # sum_of_diffs[[t_norm, :ts]] += (res - (i+j)).abs
87
- # puts "#{res} - #{i+j} = #{res - (i+j)}"
88
114
  end
89
115
  pp @sum_of_diffs
data/lib/fuzzy.rb CHANGED
@@ -29,7 +29,7 @@ class Array
29
29
  }
30
30
  uniqArray
31
31
  end
32
-
32
+ # Removes duplicate elements from self. Duplicates by means of eql?.
33
33
  def uniq_values!()
34
34
  test = self.dup
35
35
  self.clear
@@ -39,6 +39,8 @@ class Array
39
39
  self
40
40
  end
41
41
 
42
+ # Returns a new array by removing duplicate values in self. Duplicates by
43
+ # means of eql?.
42
44
  def non_decreasing
43
45
  for i in 1..self.length-1
44
46
  return false if self[i-1] > self[i]
@@ -54,5 +56,5 @@ require 'fuzzy_rule'
54
56
  require 'fuzzy_implication'
55
57
 
56
58
  module Fuzzyrb
57
- VERSION = "1.2.0"
59
+ VERSION = "1.2.1"
58
60
  end
@@ -1,14 +1,14 @@
1
1
  module Fuzzyrb
2
2
  # Should not be used directly. Use <tt>TakagiSugenoImplication</tt> or
3
- # <tt>MamdamiImplication</tt>
3
+ # <tt>MamdaniImplication</tt>
4
4
  class FuzzyImplication
5
5
  def initialize(rules)
6
6
  @rules = rules
7
7
  end
8
8
  end
9
9
 
10
- # Uses Takegi-Sugeno system to compute implication. Each rule as its
11
- # conclusion has function of it's arguments.
10
+ # Uses Takegi-Sugeno system to compute implication. Each rule's conclusion
11
+ # is a function of rule's arguments.
12
12
  class TakagiSugenoImplication < FuzzyImplication
13
13
  # Evaluates the rule. Params are the same as for
14
14
  # <tt>FuzzyRule</tt>
@@ -25,10 +25,12 @@ module Fuzzyrb
25
25
  end
26
26
  end
27
27
 
28
- class MamdamiImplication < FuzzyImplication
28
+ # Regular implication. Result is defuzzification of fuzzy set composed of
29
+ # rules' conclusions scaled by T-norm.
30
+ class MamdaniImplication < FuzzyImplication
29
31
  # Evaluates the rule. Params includes <tt>FuzzyRule</tt> params and:
30
- # * <tt>:defuzzification</tt> which can be <tt>:CoG</tt> for center of gravity of
31
- # <tt>:firstMaximum</tt> for first maximum.
32
+ # * <tt>:defuzzification</tt> which can be <tt>:CoG</tt> for center of
33
+ # gravity of <tt>:firstMaximum</tt> for first maximum.
32
34
  def evaluate(values, params)
33
35
  result = @rules.map { |rule|
34
36
  rule.evaluate(values, params)
data/lib/fuzzy_rule.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  module Fuzzyrb
2
2
  class FuzzyRule
3
3
  # Creates rule.
4
- # First argument is an Array of premises (<tt>FuzzySet</tt>). Second is result. It is either <tt>FuzzySet</tt> or <tt>Proc</tt>.
4
+ # First argument is an Array of premises (<tt>FuzzySet</tt>). Second is
5
+ # result. It is either <tt>FuzzySet</tt> or <tt>Proc</tt>.
5
6
  def initialize(arguments, result)
6
7
  @arguments = arguments
7
8
  @result = result
@@ -12,7 +12,7 @@ class TestFuzzyImplication < Test::Unit::TestCase
12
12
  b2 = FuzzySet.trapezoid([30, 45, 45, 50])
13
13
  r1 = FuzzyRule.new([a11, a12], b1)
14
14
  r2 = FuzzyRule.new([a21, a22], b2)
15
- @fi = MamdamiImplication.new([r1, r2])
15
+ @fi = MamdaniImplication.new([r1, r2])
16
16
 
17
17
  tr1 = FuzzyRule.new([a11, a12], Proc.new { |a, b| a+b })
18
18
  tr2 = FuzzyRule.new([a21, a22], Proc.new { |a, b| a-b })
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -3,15 +3,15 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: fuzzyrb
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.2.0
7
- date: 2007-11-18 00:00:00 +01:00
6
+ version: 1.2.1
7
+ date: 2007-11-19 00:00:00 +01:00
8
8
  summary: Fuzzy Sets for Ruby
9
9
  require_paths:
10
10
  - lib
11
11
  email: roman.kamyk@gmail.com
12
12
  homepage: " by Roman Kamyk"
13
13
  rubyforge_project: fuzzyrb
14
- description: "== DESCRIPTION: Implements Fuzzy Sets in Ruby. I am very beginner at this topic, so it is very basic now. Any help will be appreciated. == FEATURES/PROBLEMS: * Fuzzy Sets defined as sequence of line segments. * Fuzzy Rules. Only conjunction of arguments is possible. * No error handling. * Defuzzification as center of gravity and first maximum * Minimum and Multiplication T-Norms. * Mamdami and Larsen aggregation methods. * Reasoning - apply matching rule and combine the results. Mamdami or Takagi-Sugeno system."
14
+ description: "== DESCRIPTION: Implements Fuzzy Sets in Ruby. I am very beginner at this topic, so it is very basic now. Any help will be appreciated. == FEATURES/PROBLEMS: * Fuzzy Sets defined as sequence of line segments. * Fuzzy Rules. Only conjunction of arguments is possible. * No error handling. * Defuzzification as center of gravity and first maximum * Minimum and Multiplication T-Norms. * Mamdani and Larsen aggregation methods. * Reasoning - apply matching rule and combine the results. Mamdani or Takagi-Sugeno system."
15
15
  autorequire:
16
16
  default_executable:
17
17
  bindir: bin
metadata.gz.sig CHANGED
Binary file