Class: FeldtRuby::Optimize::Objective::MeanWeigthedGlobalRatios
- Inherits:
-
WeightedSumAggregator
- Object
- QualityAggregator
- WeightedSumAggregator
- FeldtRuby::Optimize::Objective::MeanWeigthedGlobalRatios
- Defined in:
- lib/feldtruby/optimize/objective.rb
Overview
A SumOfWeightedGlobalRatios is very similar to Bentley’s SWGR multi-objective fitness mapping scheme as described in the paper:
P. J. Bentley and J. P. Wakefield, "Finding Acceptable Solutions in the
Pareto-Optimal Range using Multiobjective Genetic Algorithms", 1997
http://eprints.hud.ac.uk/4052/1/PB_%26_JPW_1997_Finding_Acceptable_Solutions.htm
with the difference that lower values indicate better quality and we use mean instead of sum, and thus call it MWGR. It is the weighted sum of the ratios to the best so far for each goal. One of its benefits is that one need not sort individuals in relation to their peers; the aggregate fitness value is fully determined by the individual and the global min and max values for each objective.
Instance Attribute Summary
Attributes inherited from QualityAggregator
Instance Method Summary collapse
- #aggregate_from_sub_qualities(subQualityValues, weights) ⇒ Object
- #make_quality_value(subQvs, candidate, objective) ⇒ Object
- #ratio(index, value, min, max) ⇒ Object
Instance Method Details
#aggregate_from_sub_qualities(subQualityValues, weights) ⇒ Object
387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 |
# File 'lib/feldtruby/optimize/objective.rb', line 387 def aggregate_from_sub_qualities subQualityValues, weights goal_mins = objective.global_min_values_per_goal goal_maxs = objective.global_max_values_per_goal ratios = subQualityValues.map_with_index do |v, i| ratio i, v, goal_mins[i], goal_maxs[i] end # We cannot reuse the superclass in calculating the weighted sum since # we have already taken the signs into account in the ratio method. sum = 0.0 ratios.each_with_index do |r, i| sum += (r * weights[i]) end sum / weights.sum.to_f end |
#make_quality_value(subQvs, candidate, objective) ⇒ Object
373 374 375 |
# File 'lib/feldtruby/optimize/objective.rb', line 373 def make_quality_value(subQvs, candidate, objective) PercentageQualityValue.new subQvs, candidate, objective end |
#ratio(index, value, min, max) ⇒ Object
377 378 379 380 381 382 383 384 385 |
# File 'lib/feldtruby/optimize/objective.rb', line 377 def ratio(index, value, min, max) return 1000.0 if value == nil # We heavily penalize if one sub-quality could not be calculated. Max is otherwise 1.0. if objective.is_min_goal?(index) numerator = value - min else numerator = max - value end numerator.to_f.protected_division_with(max - min) end |