Source code for pyifdm.methods.marcos.ifs

# Copyright (c) 2023 Jakub Więckowski

import numpy as np
from ..ifs.score import chen_score_1

[docs] def ifs(matrix, weights, types): """ 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 Returns ------- ndarray Crisp preferences of alternatives """ # if ifs weights, convert to to crisp if not isinstance(weights[0], (float, np.floating)): weights = chen_score_1(weights) if matrix.shape[2] == 2: new_matrix = np.zeros((matrix.shape[0], matrix.shape[1], matrix.shape[2] + 1)) new_matrix[:, :, 0] = matrix[:, :, 0] new_matrix[:, :, 1] = matrix[:, :, 1] new_matrix[:, :, 2] = 1 - (matrix[:, :, 0] + matrix[:, :, 1]) matrix = new_matrix # aggregated IF decision matrix matrix_p = np.sqrt((matrix[:, :, 0] - 1)**2 + (matrix[:, :, 1] - 0)**2 + (matrix[:, :, 2] - 0)**2) matrix_m = np.sqrt((matrix[:, :, 0] - 0)**2 + (matrix[:, :, 1] - 1)**2 + (matrix[:, :, 2] - 0)**2) if_matrix = matrix_m / (matrix_m + matrix_p) # Extended initial IF decision matrix exmatrix = np.zeros((if_matrix.shape[0] + 2, if_matrix.shape[1])) exmatrix[:-2] = if_matrix for i in range(if_matrix.shape[1]): if types[i] == 1: exmatrix[-2, i] = np.max(if_matrix[:, i]) exmatrix[-1, i] = np.min(if_matrix[:, i]) else: exmatrix[-2, i] = np.min(if_matrix[:, i]) exmatrix[-1, i] = np.max(if_matrix[:, i]) # normalized matrix nmatrix = exmatrix.copy() nmatrix[:, types == 1] = exmatrix[:, types == 1] / np.max(exmatrix[:, types == 1]) nmatrix[:, types == -1] = np.min(exmatrix[:, types == -1]) / exmatrix[:, types == -1] # weighted matrix wmatrix = nmatrix * weights # s matrix smatrix = np.sum(wmatrix, axis=1) # utility degree km = (smatrix / smatrix[-1])[:-2] kp = (smatrix / smatrix[-2])[:-2] # anti-ideal and ideal solutions utility functions fkm = kp / (kp + km) fkp = km / (kp + km) # final utility function f = (kp + km) / ( 1 + ((1 - fkp) / fkp) + ((1 - fkm) / fkm) ) return f