Class: FuzzyLogic

Inherits:
Object
  • Object
show all
Defined in:
lib/fuzzy_logic.rb

Overview

player_logic.hp(15) => [[:dieing, 0.75], [:healthy, 0.0]]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeFuzzyLogic

Returns a new instance of FuzzyLogic.



11
12
13
14
# File 'lib/fuzzy_logic.rb', line 11

def initialize
  @attributes = {}
  @consequences = {}  
end

Instance Attribute Details

#consequencesObject (readonly)

:nodoc:



10
11
12
# File 'lib/fuzzy_logic.rb', line 10

def consequences
  @consequences
end

Instance Method Details

#add_classification(attribute, classification, options = {}) ⇒ Object



21
22
23
24
# File 'lib/fuzzy_logic.rb', line 21

def add_classification( attribute, classification, options = {} )
  define_attribute(attribute) if(@attributes[attribute].nil?)
  define_interpolator(attribute,classification,options)
end

#add_consequence(consequence, classifications = {}) ⇒ Object



16
17
18
19
# File 'lib/fuzzy_logic.rb', line 16

def add_consequence( consequence, classifications={} )
  @consequences[classifications] ||= []
  @consequences[classifications] += [consequence]
end

#consequences_of(options = {}) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
# File 'lib/fuzzy_logic.rb', line 26

def consequences_of(options={})
  # transform the passed in attributes to probability sets
  valid_sequences = []
  options.each_pair do |attribute, value|
    valid_sequences << {attribute => classifications_of(attribute,value)}
  end
  # combine the probability sets
  valid_combinations = compile_consequence_combinations(valid_sequences)
  # realize the consequences of the combined probability sets
  return consequences_of_combinations(valid_combinations)
end

#parse_fuzzy_file(file_name) ⇒ Object

Raises:

  • (ArgumentError)


38
39
40
41
42
43
44
45
46
47
48
# File 'lib/fuzzy_logic.rb', line 38

def parse_fuzzy_file( file_name )
  file_name += ".yaml" if not(file_name =~ /\.yaml$/)
  raise ArgumentError, "Cannot find #{file_name}" if not(File.file? file_name)
  begin
    fuzzy_file = YAML::load(File.open(file_name))
  rescue ArgumentError => bang
    raise ArgumentError, "Error when loading #{file_name} : #{bang.message}"
  end
  parse_attributes(fuzzy_file)
  add_consequences_from_parsed(parse_consequences(fuzzy_file['consequences']))
end

#update(object) ⇒ Object

The algorithm always performs an action on update.



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/fuzzy_logic.rb', line 51

def update(object)
  status = {}
  @attributes.each_pair do |attribute, classifications|
    status.merge!({attribute => object.send(attribute)})
  end
  consequences = consequences_of(status)
  total_probability = 0
  consequences.each_pair do |actions, probability|
    total_probability+=probability
  end
  action_at_probability = rand*total_probability
  total_probability = 0
  consequences.each_pair do |actions, probability|
    total_probability += probability
    if( action_at_probability < total_probability )
      actions.each do |action|
        object.send(action)
      end
      break
    end
  end
end