Source code for pyifdm.methods.copras.ifs

# Copyright (c) 2022 Jakub Więckowski
# Copyright (c) 2022 Bartłomiej Kizielewicz

import numpy as np

[docs] def ifs(matrix, weights, types, normalization, score): """ Calculates the alternatives preferences based on Intuitionistic Fuzzy Sets Parameters ---------- matrix : ndarray Decision matrix / alternatives data. Alternatives are in rows and Criteria are in columns. weights : ndarray Vector of criteria weights in a crisp or Intuitionistic Fuzzy form types : ndarray Types of criteria, 1 profit, -1 cost normalization: callable Function used to calculate normalized decision matrix score: callable Function used to calculate crisp score of IFS Returns ------- ndarray Crisp preferences of alternatives """ # normalized matrix if normalization is not None: nmatrix = normalization(matrix, types) else: nmatrix = matrix.copy() # weighted matrix wmatrix = np.zeros(nmatrix.shape) # crisp weights if weights.ndim == 1: weights = np.repeat(weights, 2).reshape((len(weights), 2)) wmatrix[:, :, 0] = np.sqrt(1 - (1 - nmatrix[:, :, 0] ** 2) ** weights[:, 0]) wmatrix[:, :, 1] = np.sqrt((nmatrix[:, :, 1] ** 2) ** weights[:, 1]) # Score function s = score(wmatrix) # Determine the maximizing and minimizing index Sp = np.sum(s[:, types == 1], axis=1) / types[types == 1].shape Sr = np.sum(s[:, types == -1], axis=1) / types[types == -1].shape # Determine the relative significance value of each alternative N = np.sum(np.exp(Sr)) / np.sum(1 / np.exp(Sr)) Q = Sp + (N / np.exp(Sr)) return Q / np.max(Q)