Skip to content

solar05/descisionex

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

37 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Descisionex

Library for dealing with descision theory algorithms.

Current algorithms

Installation

Package can be installed by adding descisionex to your list of dependencies in mix.exs:

def deps do
  [
    {:descisionex, "~> 1.0.0"}
  ]
end

Usage

Payment matrix (decision under uncertainty)

alias Descisionex

matrix = [
  [0.221, 0.194, 0.293, 0.181, 0.227],
  [0.074, 0.065, 0.073, 0.052, 0.091],
  [0.221, 0.258, 0.293, 0.361, 0.273],
  [0.441, 0.452, 0.293, 0.361, 0.364],
  [0.044, 0.032, 0.049, 0.045, 0.045]
]

# Calculate all criteria at once
result =
  Descisionex.payment_matrix(matrix)
  |> Descisionex.set_alternatives(["s1", "s2", "s3", "s4", "s5"])
  |> Descisionex.calculate_criteria()

result.wald_criterion      # %{criterion: 0.293, strategy_index: 3, strategy_name: "s4"}
result.maximax_criterion   # %{criterion: 0.452, strategy_index: 3, strategy_name: "s4"}
result.hurwitz_criterion   # %{criterion: 0.372, strategy_index: 3, strategy_name: "s4"}
result.savage_criterion    # %{criterion: 0.0,   strategy_index: 3, strategy_name: "s4"}
result.laplace_criterion   # %{criterion: 0.382, strategy_index: 3, strategy_name: "s4"}

# Bayes criterion requires probabilities
Descisionex.payment_matrix(matrix)
|> Descisionex.set_probabilities([0.2, 0.2, 0.2, 0.2, 0.2])
|> Descisionex.calculate_bayes_criterion()

Analytic Hierarchy Process (AHP)

alias Descisionex

# Pairwise comparison matrix for criteria
comparison_matrix = [
  [1,   3,   1,   1/2, 5],
  [1/3, 1,   1/4, 1/7, 2],
  [1,   4,   1,   1,   6],
  [2,   7,   1,   1,   8],
  [1/5, 1/2, 1/6, 1/8, 1]
]

# Pairwise comparison matrices for each criterion (alternatives vs alternatives)
# Each must be a valid reciprocal matrix: A[i][j] * A[j][i] == 1, diagonal == 1
alternatives_matrix = [
  [[1, 4, 1/2], [1/4, 1, 1/5],  [2, 5, 1]],      # price    CR=0.021
  [[1, 1/2, 3], [2, 1, 4],      [1/3, 1/4, 1]],  # size     CR=0.016
  [[1, 1, 2],   [1, 1, 3],      [1/2, 1/3, 1]],  # rooms    CR=0.016
  [[1, 1/4, 1/2], [4, 1, 2],    [2, 1/2, 1]],    # place    CR=0.000
  [[1, 2, 4],   [1/2, 1, 2],    [1/4, 1/2, 1]]   # category CR=0.000
]

result =
  Descisionex.analytic_hierarchy(comparison_matrix)
  |> Descisionex.set_criteria(["price", "size", "rooms", "place", "category"])
  |> Descisionex.set_alternatives(["apt1", "apt2", "apt3"])
  |> Descisionex.set_alternatives_matrix(alternatives_matrix)
  |> Descisionex.calculate()

result.consistency_ratio    # 0.013 (< 0.1, acceptable)
result.alternatives_weights # [0.286, 0.416, 0.299]

Descisionex.rank_alternatives(result)
# [
#   %{rank: 1, alternative: "apt2", weight: 0.416},
#   %{rank: 2, alternative: "apt3", weight: 0.299},
#   %{rank: 3, alternative: "apt1", weight: 0.286}
# ]

Documentation

Documentation can be found at https://hexdocs.pm/descisionex.