Source code for pyifdm.methods.aras.ifs

# Copyright (c) 2022 Jakub Więckowski

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 """ # optimal preference ranking R = np.zeros((matrix.shape[1], matrix.shape[2]), dtype=object) for j in range(matrix.shape[1]): if types[j] == 1: R[j] = matrix[np.argmax(matrix[:, j, 0]), j] else: R[j] = matrix[np.argmin(matrix[:, j, 0]), j] # extended decision matrix exmatrix = np.ones((matrix.shape[0]+1, matrix.shape[1], matrix.shape[2]), dtype=object) exmatrix[0] = R exmatrix[1:] = matrix # normalized matrix nmatrix = normalization(exmatrix, types) # weighted normalized matrix wmatrix = np.zeros((nmatrix.shape[0], nmatrix.shape[1], nmatrix.shape[2]), dtype=object) # crisp weights if weights.ndim == 1: weights = np.repeat(weights, 2).reshape((len(weights), 2)) wmatrix[:, :, 0] = 1 - (1 - nmatrix[:, :, 0])**weights[:, 0] wmatrix[:, :, 1] = nmatrix[:, :, 1]**weights[:, 1] # score values S = score(wmatrix) # overal performance rating M = np.sum(S, axis=1) Q = M[1:] / M[0] return Q