afryca.ase.Snippet
Library
consistency
Consistency
var consistency = (typeof exports === "undefined")?(function consistency() {}):(exports);
if(typeof global !== "undefined") { global.consistency = consistency; }
//
// Compute the value of an assessment on (x_l,x_k) by applying an uninorm
// operator on assessments on pairs of the form (x_l,x_(l+1))
//
// @param preference FPR
// @param l First alternative of the pair
// @param k Second alternative of the pair
// @return The result of the uninorm, used as the assessment value
//
consistency.uninorm = function uninorm(preference, l, k) {
var numerator = 1;
var denominator = 1;
var value;
for (var i = l; i < k; i++) {
value = preference.getValue((i -1) | 0, i | 0);
numerator *= value;
denominator *= 1 - value;
}
return (numerator / (numerator + denominator)).toFixed(2)/1;
}
//
// Method invoked to generate a FPR of dimension n x n following the approach of Chiclana et al. (IEEE TFS, 2009)
//
// @param n Number of alternatives
// @return Generated FPR
//
consistency.chiclanaRandomFPR = function chiclanaRandomFPR(n) {
var result = new FPR(n);
// Generate "n-1" assessments randomly
// Assign them to pairs (x_l,x_(l+1)), l=1,...,n-1
for (var l = 1; l <= n - 1; l++) {
result.setValueSymmetrically(
(l-1) | 0, // Row
l | 0, // Column
Math.random().toFixed(2)/1); // Value between 0.00 and 1.00
}
// Generate assessments for remaining elements in the upper diagonal of
// the matrix assessments on pairs (x_l,x_k) such that k > l+1
for (var l = 1; l < n; l++) {
for (var k = l +2; k <= n; k++) {
result.setValueSymmetrically(
(l - 1) | 0, // Row
(k - 1) | 0, // Column
consistency.uninorm(result, l, k)); // Value
}
}
return result;
}
//
// Adapt preferences with missing values to compute Saaty CI
// http://dx.doi.org/10.1016/0270-0255(87)90492-1
//
consistency.missingValuesHarker1987 = function missingValuesHarker1987(matrix) {
var result = new Array(matrix.length);
for (var row = 0; row < result.length; row++) {
result[row] = new Array(matrix[row].length);
result[row][row] = 1;
for (var col = 0; col < matrix[row].length; col++) {
if (row != col) {
if (isNaN(matrix[row][col])) {
result[row][col] = 0;
result[row][row]++;
} else {
result[row][col] = matrix[row][col];
}
}
}
}
return result;
}
//
// Check if preference contains missing values
//
consistency.containsMissingValues = function containsMissingValues(preference) {
var alternatives = preference.getNumberOfAlternatives();
var preferences = preference.getPreferences();
var row = preferences.length;
for (var i = 0; i < row; i++) {
for (var j = 0; j < alternatives; j++) {
if (isNaN(preference.getValue(i | 0, j | 0))) {
return true;
}
}
}
return false;
}
//
// Check if preference contains missing values
//
consistency.containsMissingValues = function containsMissingValues(preference, row, col) {
var value;
for (var i = 0; i < row; i++) {
for (var j = 0; j < col; j++) {
value = preference.getValue(i | 0, j | 0);
if(typeof value === 'number') {
if (isNaN(preference.getValue(i | 0, j | 0))) {
return true;
}
}else if(value == null || value=='' || value ==' ' || value == "{}") {
return true;
}
}
}
return false;
}
//
// Check if there is at least one preference relation for an alternative
//
consistency.thereIsAnPreferenceRelationForAlternative = function thereIsAnPreferenceRelationForAlternative(preference, i) {
var alternatives = preference.getNumberOfAlternatives();
for (var j = 0; j < alternatives; j++) {
if ((i != j) && (!isNaN(preference.getValue(i | 0, j | 0)))) {
return true;
}
}
return false;
}
//
// Check if a spanning set exists in preferences
//
consistency.spanningSetExists = function spanningSetExists(preference) {
var alternatives = preference.getNumberOfAlternatives();
for (var i = 0; i < alternatives; i++) {
if (!consistency.thereIsAnPreferenceRelationForAlternative(preference, i)) {
return false;
}
}
return true;
}
//
// Return Saaty's preference matrix
//
consistency.getSaatyPreference = function getSaatyPreference(preference, missingValuesFunction) {
if (consistency.containsMissingValues(preference)) {
if (typeof missingValuesFunction === "undefined") {
return null;
} else if (!consistency.spanningSetExists(preference)) {
return null;
}
var saatyPreference = adapters.fpr2jsSaatyRelation(preference);
return missingValuesFunction(saatyPreference);
} else {
return adapters.fpr2jsSaatyRelation(preference);
}
}
//
// Compute Saaty's CI
// T.L. Saaty. The Analytic Hierarchy Process. McGraw-Hill, New York (1980)
//
consistency.saatyConsistencyIndex = function saatyConsistencyIndex(preference, missingValuesFunction) {
var saatyPreference = consistency.getSaatyPreference(preference, missingValuesFunction);
if (saatyPreference == null) {
return NaN;
}
//Descomposition
var descomposition = pca.generateDescomposition(adapters.fpr2jsArray(preference));
//Eigen values
var eigenValues = pca.generateEigenValues(descomposition);
var principalEigenvalue = eigenValues[0];
var N = saatyPreference.length;
var result = (principalEigenvalue - N) / (N - 1);
return result.toFixed(2)/1;
}
//
// Saaty's Random Indexes
//
consistency.saatyRI = [
[0.00], //0
[0.00], //1
[0.00], //2
[0.58], //3
[0.90], //4
[1.12], //5
[1.24], //6
[1.32], //7
[1.41], //8
[1.45], //9
[1.49], //10
[1.51], //11
[1.48], //12
[1.56], //13
[1.57], //14
[1.59]]; //15
//
// Forman's RI
// http://dx.doi.org/10.1016/0377-2217(90)90072-J
//
consistency.formanRI = [
[0.00], //0
[0.00], //1
[0.00], //2
[0.52333, 0.00], //3
[0.88604, 0.58614, 0.29994, 0.00], //4
[1.10983, 0.93120, 0.75097, 0.57231, 0.39095, 0.20171, 0.00], //5
[1.25390, 1.13028, NaN, 0.89415, 0.78113, 0.66280, 0.53832, 0.41822, 0.28718, 0.15141, 0.00], //6
[1.34516, 1.25976, 1.18055, 1.09311, 1.01190, 0.92629, 0.84444, 0.75805, 0.67878, 0.59372, 0.55072, 0.41665, 0.32232, 0.22515, 0.11962, 0.00]]; //7
//
// Donegan-Dodd's Random Indexes
// http://dx.doi.org/10.1016/0895-7177(91)90098-R
//
consistency.doneganDoddRI = [
[0.0000], // 0
[0.0000], // 1
[0.0000], // 2
[0.4914], // 3
[0.8286], // 4
[1.0591], // 5
[1.1797], // 6
[1.2519], // 7
[1.3171], // 8
[1.3733], // 9
[1.4055], //10
[1.4213], //11
[1.4497], //12
[1.4643], //13
[1.4822], //14
[1.4969], //15
[1.5078], //16
[1.5153], //17
[1.5262], //18
[1.5313], //19
[1.5371]]; //20
//
// Count missing values
//
consistency.countMissingValues = function countMissingValues(preference) {
var alternatives = preference.getNumberOfAlternatives();
var result = 0;
for (var i = 0; i < alternatives - 1; i++) {
for (var j = i + 1; j < alternatives; j++) {
if (isNaN(preference.getValue(i | 0, j | 0))) {
result++;
}
}
}
return result;
}
//
// Return Random Index
//
consistency.getRI = function getRI(preference, randomIndexes) {
if (typeof randomIndexes === "undefined") {
randomIndexes = consistency.saatyRI;
}
var alternatives = preference.getNumberOfAlternatives();
if (alternatives < randomIndexes.length) {
var missingValues = consistency.countMissingValues(preference);
return (missingValues < randomIndexes[alternatives].length)
? randomIndexes[alternatives][missingValues]
: NaN;
}
return NaN;
}
//
// Saaty Consistency Ratio
//
consistency.saatyConsistencyRatio = function saatyConsistencyRatio(preference, missingValuesFunction, randomIndexes) {
if (preference.getNumberOfAlternatives() <= 2) {
return 0.0;
}
var CI = consistency.saatyConsistencyIndex(preference, missingValuesFunction);
var RI = consistency.getRI(preference, randomIndexes);
return (isNaN(CI) || isNaN(RI))
? NaN
: (RI == 0)
? 0
: (CI / RI).toFixed(2)/1;
}
//
// Saaty's multiplicative consistent
//
// a_{ih} = a_{hj} = a_{ij} for each i,h,j \in [1, ..., n] and n = number of alternatives
//
// Default threshold == 1.0
//
consistency.multiplicativeConsistent = function multiplicativeConsistent(preference, threshold) {
var saaty = consistency.getSaatyPreference(preference);
if (saaty == null) {
return NaN;
}
if (typeof threshold === "undefined") {
threshold = 1.0;
}
var alternatives = saaty.length;
var value, left, bottom, difference;
for (var row = 0; row < (alternatives - 2); row++) {
for (var col = row + 2; col < alternatives; col++) {
left = saaty[row][col - 1];
bottom = saaty[row + 1][col];
value = saaty[row][col];
difference = Math.abs(((left * bottom) - value).toFixed(2)/1);
if (difference > threshold) {
return false;
}
}
}
return true;
}
//
// Additive consistent
//
// a_{ih} + a_{hj} - a_{ij} - 0.5 = 0 for each i,h,j \in [1, ..., n] and n = number of alternatives
//
// Default threshold == 0.01
//
consistency.additiveConsistent = function additiveConsistent(preference, threshold) {
if (consistency.containsMissingValues(preference)) {
return NaN;
}
if (typeof threshold === "undefined") {
threshold = 0.01;
}
var alternatives = preference.getNumberOfAlternatives();
var value, left, bottom, additiveApproach;
for (var row = 0; row < (alternatives - 2); row++) {
for (var col = row + 2; col < alternatives; col++) {
left = preference.getValue(row | 0, (col - 1) | 0);
bottom = preference.getValue((row + 1) | 0, col | 0);
value = preference.getValue(row | 0, col | 0);
additiveApproach = Math.abs(left + bottom - value - 0.5).toFixed(2)/1;
if (additiveApproach > threshold) {
return false;
}
}
}
return true;
}
//
// Fedrizzi's Global Inconsistency Index
//
consistency.fedrizziGlobalInconsistencyIndex = function fedrizziGlobalInconsistencyIndex(preference) {
if (consistency.containsMissingValues(preference)) {
return NaN;
}
var result = 0;
var alternatives = preference.getNumberOfAlternatives();
var value_ih, value_hj, value_ji;
for (var i = 0; i < (alternatives - 2); i++) {
for (var j = i+1; j < (alternatives - 1); j++) {
value_ji = preference.getValue(j | 0, i | 0);
for (var h = j+1; h < alternatives; h++) {
value_ih = preference.getValue(i | 0, h | 0);
value_hj = preference.getValue(h | 0, j | 0);
result += Math.pow(value_ih + value_hj + value_ji - 1.5, 2);
}
}
}
return (6 * result).toFixed(2)/1;
}
//
// Optimal preference value for preference relation r_st
//
consistency.fedrizziOptimalValue = function fedrizziOptimalValue(preference, s, t) {
var n = preference.getNumberOfAlternatives();
var s_sum = 0;
var t_sum = 0;
var value;
for (var h = 0; h < n; h++) {
if (h != t) {
value = preference.getValue(s | 0, h | 0);
if (isNaN(value)) {
return NaN;
}
s_sum += value;
}
if (h != s) {
value = preference.getValue(h | 0, t | 0);
if (isNaN(value)) {
return NaN;
}
t_sum += value;
}
}
var numerator = s_sum + t_sum - (n / 2);
var denominator = n - 2;
var result = (numerator / denominator).toFixed(2)/1;
if (result < 0) {
result = 0;
} else if (result > 1) {
result = 1;
}
return result;
}
//
// Resolve Fedrizzi equation system
//
consistency.fedrizziResolveEquationSystem = function fedrizziResolveEquationSystem(Q, B, set) {
var result = [];
var inverseQ = numeric.inv(Q);
var values = numeric.dot(inverseQ, B);
var value;
for (var v = 0; v < values.length; v++) {
value = values[v];
result[v] = (isNaN(value) || (value < 0) || (value > 1))
? NaN
: value;
}
return result;
}
//
// Compute 'position' element of Right Hand Side
//
consistency.fedrizziElementValueOfRHSV = function fedrizziElementValueOfRHSV(preference, set, k) {
var s_k = set[k].i;
var t_k = set[k].j;
var s_h, t_h;
var R_s_k = [];
var R_s_k_above = [];
var R_s_k_below = [];
var C_t_k = [];
var C_t_k_above = [];
var C_t_k_below = [];
for (var h = 0; h < set.length; h++) {
if (h != k) {
s_h = set[h].i;
t_h = set[h].j;
if (s_h == s_k) {
if (R_s_k.indexOf(t_h) == -1) {
R_s_k[R_s_k.length] = t_h;
if (s_h < t_h) {
R_s_k_above[R_s_k_above.length] = t_h;
} else {
R_s_k_below[R_s_k_below.length] = t_h;
}
}
} else if (t_h == t_k) {
if (C_t_k.indexOf(s_h) == -1) {
C_t_k[C_t_k.length] = s_h;
if (s_h < t_h) {
C_t_k_above[C_t_k_above.length] = s_h;
} else {
C_t_k_below[C_t_k_below.length] = s_h;
}
}
}
}
}
var n = preference.getNumberOfAlternatives();
var r_s_k_h_sum = 0;
var r_h_t_k_sum = 0;
for (var h = 0; h < n; h++) {
if ((h != t_k) && (R_s_k.indexOf(h) == -1)) {
r_s_k_h_sum += preference.getValue(s_k | 0, h | 0);
}
if ((h != s_k) && (C_t_k.indexOf(h) == -1)) {
r_h_t_k_sum += preference.getValue(h | 0, t_k | 0);
}
}
return R_s_k_below.length
+ C_t_k_below.length
+ r_s_k_h_sum
+ r_h_t_k_sum
- n / 2;
}
//
// Optimal preference value for more than two preference relations
//
consistency.fedrizziOptimalValueForMoreThanTwoElements = function fedrizziOptimalValueForMoreThanTwoElements(preference, set) {
var result = [];
var n = preference.getNumberOfAlternatives();
var diagonal = n - 2;
var Q = [];
var value;
for (var row = 0; row < set.length; row++) {
Q[row] = [];
for (var col = 0; col < set.length; col++) {
if (row == col) {
Q[row][col] = diagonal;
} else if ((set[row].i == set[col].i) || (set[row].j == set[col].j)) {
Q[row][col] = -1;
} else if ((set[row].i == set[col].j) || (set[row].j == set[col].i)) {
Q[row][col] = 1;
} else {
Q[row][col] = 0;
}
}
}
var completeSet = [];
for (var s = 0; s < set.length; s++) {
completeSet[completeSet.length] = set[s];
completeSet[completeSet.length] = {
i: set[s].j,
j: set[s].i
};
}
var B = [];
for (var s = 0; s < set.length; s++) {
B[B.length] = consistency.fedrizziElementValueOfRHSV(preference, completeSet, s * 2);
}
return consistency.fedrizziResolveEquationSystem(Q, B, set);
}
//
// Optimal preference value for two preference relations
//
consistency.fedrizziOptimalValueForTwoElements =function fedrizziOptimalValueForTwoElements(preference, set) {
var n = preference.getNumberOfAlternatives();
var diagonal = n - 2;
var Q = [
[diagonal, -1],
[-1, diagonal]];
var s, t, u;
t = ((set[0].i == set[1].i) || (set[0].i == set[1].j))
? set[0].i
: set[0].j;
var r_st = (set[0].i == t)
? {i: set[0].j, j: set[0].i}
: set[0];
s = r_st.i;
var r_ut = (set[1].i == t)
? {i: set[1].j, j: set[1].i}
: set[1];
u = r_ut.i;
var r_sh_sum = 0;
var r_uh_sum = 0;
var r_ht_sum = 0;
for (var h = 0; h < n; h++) {
if (h != t) {
r_sh_sum += preference.getValue(s | 0, h | 0);
r_uh_sum += preference.getValue(u | 0, h | 0);
}
if ((h != s) && (h != u)) {
r_ht_sum += preference.getValue(h | 0, t | 0);
}
}
var B = [
r_sh_sum + r_ht_sum - (n / 2),
r_uh_sum + r_ht_sum - (n / 2)];
var result = consistency.fedrizziResolveEquationSystem(Q, B, set);
var value;
for (var v = 0; v < result.length; v++) {
value = result[v];
result[v] = (isNaN(value))
? value
: (set[v].i == t)
? 1 - value
: value;
}
return result;
}
//
// Optimal preference relations values
//
consistency.fedrizziOptimalValues = function fedrizziOptimalValues(preference, set) {
var result = [];
var values = [];
if (set.length == 1) {
values[0] = consistency.fedrizziOptimalValue(preference, set[0].i, set[0].j);
} else if (set.length == 2) {
values = consistency.fedrizziOptimalValueForTwoElements(preference, set);
} else {
values = consistency.fedrizziOptimalValueForMoreThanTwoElements(preference, set);
}
for (var v = 0; v < values.length; v++) {
result[v] = {
i: set[v].i,
j: set[v].j,
v: values[v]
};
}
return result;
}
//
// Compute missing preference relations
//
consistency.getMissingPreferenceRelations = function getMissingPreferenceRelations(preference) {
var result = [];
var alternatives = preference.getNumberOfAlternatives();
var counter = 0;
for (var i = 0; i < alternatives - 1; i++) {
for (var j = i + 1; j < alternatives; j++) {
if (isNaN(preference.getValue(i | 0, j | 0))) {
result[counter++] = {i: i, j: j};
}
}
}
return result;
}
//
// Compute indexes of first dependent set in relations
//
consistency.getFirstDependentSetIndexes = function getFirstDependentSetIndexes(relations) {
var indexes = [];
var initialLength;
var i, j;
do {
initialLength = indexes.length;
for (var relation = 0; relation < relations.length; relation++) {
i = relations[relation].i;
j = relations[relation].j;
if (indexes.length == 0) {
indexes[indexes.length] = i;
indexes[indexes.length] = j;
} else {
if (indexes.indexOf(i) > -1) {
if (indexes.indexOf(j) == -1) {
indexes[indexes.length] = j;
}
} else if (indexes.indexOf(j) > -1) {
if (indexes.indexOf(i) == -1) {
indexes[indexes.length] = i;
}
}
}
}
} while (indexes.length != initialLength);
return indexes;
}
//
// Set of index relations
// @return {result.set: set of index relations, result.rest: rest of relations}
//
consistency.extractIndexSet = function extractIndexSet(relations, indexes) {
var set = [];
var rest = [];
for (var relation = 0; relation < relations.length; relation++) {
if ((indexes.indexOf(relations[relation].i) > -1) || (indexes.indexOf(relations[relation].j) > -1)) {
set[set.length] = relations[relation];
} else {
rest[rest.length] = relations[relation];
}
}
return {set: set, rest: rest};
}
//
// Compute independent relation sets
//
consistency.computeIndependentRelationSets = function computeIndependentRelationSets(relations) {
var result = [];
var indexes;
var dependentSet;
while (relations.length > 0) {
indexes = consistency.getFirstDependentSetIndexes(relations);
dependentSet = consistency.extractIndexSet(relations, indexes);
result[result.length] = dependentSet.set;
relations = dependentSet.rest;
}
return result;
}
// Consistency level of additive FPR
// E. Herrera-Viedma, F. Chiclana, F. Herrera, and S. Alonso.
// Group decision-making model with incomplete fuzzy preference relations based on additive consistency.
// IEEETransactions on Systems, Man, and Cybernetics, Part B (Cybernetics), 37(1):176–189, 2007
consistency.consistencyLevelAdditive = function consistencyLevelAdditive(preference) {
var n = preference.getNumberOfAlternatives();
var acum = 0;
for(var i = 0; i < n - 2; i++) {
for(var j = i + 1; j < n - 1; j++) {
for(var t = j + 1; t < n; t++) {
acum += Math.abs(preference.getValue(i |0, j | 0) + preference.getValue(j |0, t | 0) - preference.getValue(i |0, t | 0) - 0.5)
}
}
}
return 1 - ((4 / (n * (n - 1) * (n - 2))) * acum);
}
//
// Preference optimizer based on Fedrizzi paper
// 'Incomplete pairwise comparison and consistency optimization'
//
// http://dx.doi.org/10.1016/j.ejor.2006.09.065
//
consistency.fedrizziConsistencyOptimizer = function fedrizziConsistenceOptimizer(preference) {
var result = FPR.parseFPR(preference.toString());
var missingPreferenceRelations = consistency.getMissingPreferenceRelations(result);
if (missingPreferenceRelations.length == 0) {
return result;
} else {
var sets = consistency.computeIndependentRelationSets(missingPreferenceRelations);
var changes;
for (var s = 0; s < sets.length; s++) {
changes = consistency.fedrizziOptimalValues(result, sets[s]);
for (var c = 0; c < changes.length; c++) {
result.setValueSymmetrically(
changes[c].i | 0,
changes[c].j | 0,
changes[c].v);
}
}
}
return result;
}
//
// Inconsistency index of a triad of alternatives
//
// @param a x_ij
// @param b x_jk
// @param c x_ik
consistency.koczkodajTriadInconsistency = function koczkodajTriadInconsistency(a, b, c) {
var v1 = Math.abs(1 - (b / (a * c)));
var v2 = Math.abs(1 - ((a * c) / b));
return Math.min(v1, v2);
}
//
// Koczkodaj's inconsistency index
//
// 'A new definition of consistency of pairwise comparisons'
// http://dx.doi.org/10.1016/0895-7177(93)90059-8
//
// @param preference FPR
//
consistency.koczkodajInconsistencyIndex = function koczkodajInconsistencyIndex(preference) {
if (consistency.containsMissingValues(preference)) {
return NaN;
}
var saatyPreference = adapters.fpr2jsSaatyRelation(preference);
var alternatives = saatyPreference.length;
var a, b, c;
var result = 0;
for (var i = 0; i < (alternatives - 1); i++) {
for (var j = i + 1; j < (alternatives - 1); j++) {
a = saatyPreference[i][j];
for (var k = j + 1; k < alternatives; k++) {
b = saatyPreference[j][k];
c = saatyPreference[i][k];
result = Math.max(result, consistency.koczkodajTriadInconsistency(a, b, c));
}
}
}
return result.toFixed(2)/1;
}
//
// Koczkodaj's element inconsistency index
//
// 'A new definition of consistency of pairwise comparisons'
// http://dx.doi.org/10.1016/0895-7177(93)90059-8
//
// @param preference FPR
// @param i Alternative index i
// @param j Alternative index j
//
consistency.koczkodajElementInconsistencyIndex = function koczkodajElementInconsistencyIndex(preference, i, j) {
if (consistency.containsMissingValues(preference)) {
return NaN;
}
var alternatives = preference.getNumberOfAlternatives();
if ((i < 0) || (i >= alternatives) || (j < 0) || (j >= alternatives)) {
return NaN;
}
if (i == j) {
return 0;
}
var saatyPreference = adapters.fpr2jsSaatyRelation(preference);
var a, b, c;
var result = 0;
for (var ii = 0; ii < (alternatives - 1); ii++) {
for (var jj = ii + 1; jj < (alternatives - 1); jj++) {
a = saatyPreference[ii][jj];
for (var k = jj + 1; k < alternatives; k++) {
b = saatyPreference[jj][k];
c = saatyPreference[ii][k];
if (((i == ii) || (i == jj) || (i == k)) && ((j == ii) || (j == jj) || (j == k))) {
result = Math.max(result, consistency.koczkodajTriadInconsistency(a, b, c));
}
}
}
}
return result.toFixed(2)/1;
}
//
// Consistency LSM
//
// A Comparison of Two Methods for Determining the Weights of Belonging to Fuzzy Sets
// DOI: 10.1007/BF00933438
//
// @param preference FPR
//
consistency.LSM = function LSM(preference) {
if (consistency.containsMissingValues(preference)) {
return NaN;
}
var saatyPreference = adapters.fpr2jsSaatyRelation(preference);
var alternatives = saatyPreference.length;
var m = [];
for (var i = 0; i <= alternatives; i++) {
m[i] = (i != alternatives) ? 0 : 1;
}
var B = [];
for (var i = 0; i <= alternatives; i++) {
B[i] = [];
}
var aux;
for (var i = 0; i <= alternatives; i++) {
for (var j = i; j <= alternatives; j++) {
if (i == j) {
if (i == alternatives) {
B[i][j] = 0;
} else {
aux = alternatives - 1;
for (var k = 0; k < alternatives; k++) {
if (k != j) {
aux += Math.pow(saatyPreference[k][j], 2);
}
}
B[i][j] = aux;
}
} else if ((i == alternatives) || (j == alternatives)) {
B[j][i] = B[i][j] = 1;
} else {
B[j][i] = B[i][j] = - saatyPreference[i][j] - saatyPreference[j][i];
}
}
}
var inverseB = numeric.inv(B);
var w = numeric.dot(inverseB, m);
var solution = 0;
for (var i = 0; i < alternatives; i++) {
for (var j = 0; j < alternatives; j++) {
solution += Math.pow((saatyPreference[i][j] * w[j]) - w[i], 2);
}
}
return solution.toFixed(2)/1;
}
//
// Dong's consistency index
//
// On consistency measures of linguistic preference relations - Corollary 1
// doi:10.1016/j.ejor.2007.06.013
//
// @param lpr LPR
//
consistency.dongConsistencyIndex = function(lpr) {
var P = LPR.dongAverageLPR(lpr);
if (typeof P == 'number') {
return NaN;
}
return LPR.dongDistanceBetweenTwoLPR(lpr, P);
}
//
// Approximates Chi-Square critical value
//
// @param degreesOfFreedom Degrees of freedom
// @param Significance level
//
consistency.approximateChiSquareCriticalValue = function (degreesOfFreedom, significanceLevel) {
var threshold = 0.001;
var ChiSquaredDistribution = Java.type('org.apache.commons.math3.distribution.ChiSquaredDistribution');
var distribution = new ChiSquaredDistribution(degreesOfFreedom);
var increment = 10;
var value;
var nextValue = 0;
var computed;
var exit = false;
do {
value = nextValue;
computed = distribution.cumulativeProbability(value);
if (computed > significanceLevel) {
value -= increment;
nextValue -= increment;
increment /= 2;
} else {
exit = Math.abs(computed - significanceLevel) < threshold;
}
if (!exit) {
nextValue += increment;
}
} while (!exit);
return value;
}
//
// Dong's consistency index threshold
//
// On consistency measures of linguistic preference relations - Theorem 3
// doi:10.1016/j.ejor.2007.06.013
//
// @param lpr LPR
// @param significanceLevel Significance level
// @param standardDeviation Standard deviation
//
consistency.dongConsistencyIndexThreshold = function(lpr, significanceLevel, standardDeviation) {
if (typeof lpr == 'undefined') {
return NaN;
}
if (typeof lpr.preference == 'undefined') {
return NaN;
}
var n = lpr.n;
var T = lpr.ids.length;
var degreesOfFreedom = (n * (n - 1)) / 2;
var criticalValue = consistency.approximateChiSquareCriticalValue(degreesOfFreedom, significanceLevel);
var result = (standardDeviation/T) * Math.sqrt(1/degreesOfFreedom * criticalValue)
return result.toFixed(2)/1;
}
//
// Wu consistency index
//
// Managing consistency and consensus in group decision making with hesitant fuzzy linguistic preference relations - Definition 9
// http://dx.doi.org/10.1016/j.omega.2015.12.005
//
// @param hlpr HLPR
//
consistency.wuConsistencyIndex = function(hlpr) {
if (typeof hlpr == 'undefined') {
return NaN;
}
if (typeof hlpr.lowerPreference == 'undefined') {
return NaN;
}
var E = HLPR.expectedLPR(hlpr);
if (typeof E == 'number') {
return NaN;
}
var C = LPR.dongAverageLPR(E);
var result = HLPR.wuDistanceBetweenExpectedAndAdittiveConsistent(E, C);
return result.toFixed(2)/1;
}
//
// Check if a FPR verifies the weak transitivity
//
// Exploring consistency for hesitant preference relations in Decision Making- Discussing concepts, meaning and taxonomy - Definition 4
// DOI: 10.1007/BF00933438
//
// @param preference FPR
//
consistency.weakTransitivity = function(preference) {
var n = preference.getNumberOfAlternatives();
for (var i = 0; i < n; i++) {
for (var j = 0; j < n; j++) {
if (i != j) {
if (preference.getValue(i | 0, j | 0) < 0.5) {
for (var k = 0; k < n; k++) {
if ((i != k) && (j != k)) {
if ((preference.getValue(i | 0, k | 0) >= 0.5) && (preference.getValue(k | 0, j | 0) >= 0.5)) {
return false;
}
}
}
}
}
}
}
return true;
}
//
// Check if a FPR is ordinal consistent
//
// Exploring consistency for hesitant preference relations in Decision Making- Discussing concepts, meaning and taxonomy - Definition 7
// DOI: 10.1007/BF00933438
//
// @param preference FPR
//
consistency.ordinalConsistent = function(preference) {
var n = preference.getNumberOfAlternatives();
var p_i_k, p_k_j;
for (var i = 0; i < n; i++) {
for (var j = 0; j < n; j++) {
if (i != j) {
if (preference.getValue(i | 0, j | 0) <= 0.5) {
for (var k = 0; k < n; k++) {
if ((i != k) && (j != k)) {
p_i_k = preference.getValue(i | 0, k | 0);
p_k_j = preference.getValue(k | 0, j | 0);
if (((p_i_k > 0.5) && (p_k_j >= 0.5)) || ((p_i_k >= 0.5) && (p_k_j > 0.5))) {
return false;
}
}
}
}
}
}
}
return true;
}
consistency.calculateRwithAditiveConsistency = function(preference){
var result=new FPR(preference.getNumberOfAlternatives());
for(var i=0;i1) value=1;
if(value<0) value=0;
result.setValueSymmetrically(i | 0, j | 0, value);
}
}
return result;
}
consistency.calculateCIPAdditiveConsistency = function(preference, preferenceR){
var value=0;
var result=0;
var n=preference.getNumberOfAlternatives();
for(var i=0;iCI){
R_FPR=consistency.calculateRwithAditiveConsistency(RandomFPR);
var max=0;
var str="";
for(var i=0;i max ){
max=Math.abs((RandomFPR.getValue(i | 0, j | 0)-R_FPR.getValue(i | 0, j | 0)));
str=i+","+j+"|";
}else if(Math.abs((RandomFPR.getValue(i | 0, j | 0)-R_FPR.getValue(i | 0, j | 0)))== max){
str+=""+i+","+j+"|";
}
}
}
var array=str.split("|");
for(var i=0;ij){
var value=((i-j)+1)/2;
for(var l=j;l1) {
changes=true;
}
pref[i][j]=value;
pref[j][i]=1-value;
}
}
}
var minimumAux=100;
var maximumAux=0;
for(var i=0;ipref[i][j]){
minimumAux=pref[i][j];
}
if(maximumAux 0 && minimum > pref[i][j] && pref[i][j] > positiveMinimum ){
minimum=pref[i][j];
}
}else if(maximumAux > 1){
if( pref[i][j] > 0 && minimum > pref[i][j] && pref[i][j] > (maximumAux-1)){
minimum=pref[i][j];
}
}else{
if( pref[i][j] > 0 && minimum > pref[i][j]){
minimum=pref[i][j];
}
}
}
}
for(var i=0;i0.01){
return false;
}
}
}
}
return true;
}
/*
LPR Consistency Index based in paper :
Consistency Measures of Linguistic Preference Relations and Its Propertires in Group Decision Making
Yucheng Dong and Yinfeng Xu
*/
consistency.CalculateIndexConsistencyLPRDong = function(preference){
var n=preference.getNumberOfAlternatives();
var value=0;
var CIP;
var T=preference.getDomain().getLabelSet().getCardinality();
for(var i=0;i bMax) {
bMax = bCurrent;
}
}
}
var hflts = consistency.createMatrix(preference.getNumberOfAlternatives());
var indexes_ij;
var indexes_ji;
for(var i = 0; i < preference.getNumberOfAlternatives() - 1; ++i) {
for(var j = i + 1; j < preference.getNumberOfAlternatives(); ++j) {
indexes_ij = preference.getHesitantLinguisticValuation(i | 0, j | 0).getLinguisticIndexes();
indexes_ji = preference.getHesitantLinguisticValuation(j | 0, i | 0).getLinguisticIndexes();
bCurrent = indexes_ij.size();
if(bCurrent < bMax) {
for(var k = 0; k < bMax - bCurrent; ++k) {
indexes_ij.add(indexes_ij.get(indexes_ij.size() - 1));
indexes_ji.add(indexes_ji.get(indexes_ji.size() - 1));
}
}
hflts[i][j] = indexes_ij;
hflts[j][i] = indexes_ji;
}
}
return hflts;
}
consistency.createMatrix = function(n) {
var matrix = [];
for(var i = 0; i < n; i++) {
matrix[i] = [];
for(var j = 0; j < n; j++) {
matrix[i][j] = undefined;
}
}
return matrix;
}
consistency.checkIsNormalized = function(NHFLPR) {
var nElements = NHFLPR[0][1].size();
for(var i = 0; i < NHFLPR.length; ++i) {
for(var j = 0; j < NHFLPR.length; ++j) {
if(i != j) {
if(NHFLPR[i][j].size() !== nElements) {
return false;
}
}
}
}
return true;
}
consistency.computeConsistentNHFLPR = function(NHFLPR) {
var consistentNHFLPR = consistency.createMatrix(NHFLPR.length);
var indexes1;
var indexes2;
var nElements = NHFLPR[0][1].size();
/*//Ejemplo paper Bin zhu
var auxIndexes1 = NHFLPR[2][1];
auxIndexes1.clear();
auxIndexes1.add(4);
auxIndexes1.add(3);
NHFLPR[2][1] = auxIndexes1;
var auxIndexes2 = NHFLPR[3][2];
auxIndexes2.clear();
auxIndexes2.add(3);
auxIndexes2.add(2);
NHFLPR[3][2] = auxIndexes2;
var auxIndexes3 = NHFLPR[2][0];
auxIndexes3.clear();
auxIndexes3.add(-2);
auxIndexes3.add(-3);
NHFLPR[2][0] = auxIndexes3;*/
for(var i = 0; i < NHFLPR.length ; ++i) {
for(var j = 0; j < NHFLPR.length; ++j) {
if(i != j) {
var sumIndexes = new Array(nElements);
for(var s = 0; s < nElements; ++s) {
sumIndexes[s] = 0;
}
for(var k = 0; k < NHFLPR.length; ++k) {
if(k != i || k != j) {
indexes1 = NHFLPR[i][k];
indexes2 = NHFLPR[k][j];
for(var l = 0; l < nElements; ++l) {
if(indexes1 === undefined) {
sumIndexes[l] += indexes2.get(l) / NHFLPR.length;
} else if(indexes2 === undefined) {
sumIndexes[l] += indexes1.get(l) / NHFLPR.length;
} else {
sumIndexes[l] += indexes1.get(l) / NHFLPR.length + indexes2.get(l) / NHFLPR.length;
}
}
}
}
consistentNHFLPR[i][j] = sumIndexes;
}
}
}
return consistentNHFLPR;
}
consistency.computeEpsilon = function(indexesNormalized, indexesConsistent) {
var S = 0;
for(var k = 0; k < indexesNormalized.size(); ++k) {
S += indexesNormalized.get(k) - indexesConsistent[k];
}
return S / indexesNormalized.size();
}
/*
Generate consistent random HPR
*/
consistency.additiveConsistencyRandomHPR = function(n,number){
var RandomHPR=new HPR(n);
var c=new HPR(n);
var numValues=number;
var numFPRMax=number;
for(var i=0;i0.74);
var value=new ExpertDegree(-1,vrandom);
hesitantNumericV.addHesitantValue(value);
}
RandomHPR.setValueSymmetrically(i | 0, (i+1) | 0, hesitantNumericV);
}
for(var i=0;i<(n-2);i++){
for(var j=(i+1);j<(n-1);j++){
var hesitantNumericV=new HesitantNumericValuation();
for(var b=0;bRandomHPR.getValue(i | 0, j | 0).getHesitantValue(b).getDegree()){
min=RandomHPR.getValue(i | 0, j | 0).getHesitantValue(b).getDegree();
}
}
}
}
if(max>1){
for(var i=0;iumbral){
normalizada=consistency.calculateModifiedHPR(normalizada,c,0.1);
c=consistency.calculateCHPR(normalizada);
dist=consistency.calculateDistanceBetweenHPRs(normalizada,c);
}
return normalizada;
}
/*
Dada una HPR y un valor stigma, devuelve una HPR normalizada
*/
consistency.calculateNHPR = function (preference,stigma,max){
var n=preference.getNumberOfAlternatives();
var NHPR=new HPR(n);
if(max === undefined){
var max=0;
for(var i=0;i<(n-1);i++){
for(var j=i+1;j0.01){
return false;
}
}
}
}
}
}
return true;
}
/*
Prueba de HPR aleatorio
*/
consistency.additiveConsistencyRandomHPR2 = function(n){
var c=new HPR(n);
var pruebas2=new HPR(n);
var numValues=0;
var RandomHPR=new HPR(n);
var numFPRMax=10;
do{
numFPRMax=Math.round(((Math.random().toFixed(2))*10));
}while(numFPRMax==0);
var arrayFPR=new Array();
for(var i=0;i numFPRMax || numValues==0);
var hesitantNumericV=new HesitantNumericValuation();
for(var b=0;b