361 lines
8.8 KiB
Plaintext
361 lines
8.8 KiB
Plaintext
<snippet>
|
|
<subclass>afryca.ase.Snippet</subclass>
|
|
<file></file>
|
|
<category>Library</category>
|
|
<name>HLPR</name>
|
|
<description>Hesitant Linguistic Preference Relation</description>
|
|
<code>
|
|
// Hesitant Linguistic Preference Relation class
|
|
//
|
|
// @param ids Labels
|
|
// @param n Number of alternatives
|
|
//
|
|
var HLPR = function HLPR(ids, n) {
|
|
this.ids = ids; // Ids
|
|
this.n = n; // Number of alternatives
|
|
this.lowerPreference = new LPR(ids, n);
|
|
this.upperPreference = new LPR(ids, n);
|
|
|
|
this.labelsValues = this.lowerPreference.labelsValues;
|
|
this.beta = this.lowerPreference.beta;
|
|
this.linguisticValue = this.lowerPreference.linguisticValue;
|
|
this.valueFor = this.lowerPreference.valueFor;
|
|
|
|
this.getValue = function(i, j) {
|
|
var result = {
|
|
lower: this.lowerPreference.getValue(i, j),
|
|
upper: this.upperPreference.getValue(i, j),
|
|
hlpr: this
|
|
};
|
|
result.toString = function() {
|
|
if (typeof result.lower == 'number') {
|
|
return 'NaN';
|
|
}
|
|
if (result.lower == result.upper) {
|
|
return '{' + result.lower + '}';
|
|
} else {
|
|
return '{' + result.lower + ', ' + result.upper + '}';
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
// Set alternative value
|
|
this.setValueSymmetrically = function (i, j, lowerLabel, lowerAlpha, upperLabel, upperAlpha) {
|
|
this.lowerPreference.setValueSymmetrically(i | 0, j | 0, lowerLabel, lowerAlpha);
|
|
this.upperPreference.setValueSymmetrically(i | 0, j | 0, upperLabel, upperAlpha);
|
|
}
|
|
|
|
this.toString = function() {
|
|
var result = [];
|
|
var lengths = [];
|
|
var value;
|
|
for (var i = 0; i < this.n; i++) {
|
|
result[i] = [];
|
|
for (var j = 0; j < this.n; j++) {
|
|
value = this.getValue(i | 0, j | 0).toString();
|
|
result[i][j] = (i == j) ? '-' : ((value == 'NaN') ? '' : value);
|
|
lengths[j] = (i == 0) ? result[i][j].length : Math.max(lengths[j], result[i][j].length);
|
|
}
|
|
}
|
|
var output = '';
|
|
for (var i = 0; i < this.n; i++) {
|
|
for (var j = 0; j < this.n; j++) {
|
|
if (j > 0) {
|
|
output += ' ';
|
|
}
|
|
output += '| ' + result[i][j];
|
|
for (var s = result[i][j].length; s < lengths[j]; s++) {
|
|
output += ' ';
|
|
}
|
|
}
|
|
output += ' |\n';
|
|
}
|
|
return output;
|
|
}
|
|
}
|
|
|
|
//
|
|
// HLPR inverse delta
|
|
//
|
|
// Computed as mean of lower and upper values
|
|
//
|
|
// @param value HLPR preference
|
|
//
|
|
HLPR.inverseDelta = function(value) {
|
|
if (typeof value == 'undefined') {
|
|
return NaN;
|
|
}
|
|
|
|
if (typeof value.hlpr == 'undefined') {
|
|
return NaN;
|
|
}
|
|
|
|
var L = hlpr.beta(hlpr.valueFor(value.lower.s)) + value.lower.alpha;
|
|
var U = hlpr.beta(hlpr.valueFor(value.upper.s)) + value.upper.alpha;
|
|
return (L + U) / 2;
|
|
}
|
|
|
|
//
|
|
// HLPR possibility distribution
|
|
//
|
|
// Managing consistency and consensus in group decision making with hesitant fuzzy linguistic preference relations - Definition 2
|
|
// http://dx.doi.org/10.1016/j.omega.2015.12.005
|
|
//
|
|
// @param value HLPR preference
|
|
//
|
|
HLPR.possibilityDistribution = function(value) {
|
|
if (typeof value == 'undefined') {
|
|
return NaN;
|
|
}
|
|
|
|
if (typeof value.hlpr == 'undefined') {
|
|
return NaN;
|
|
}
|
|
|
|
var hlpr = value.hlpr;
|
|
var T = hlpr.ids.length;
|
|
var L = hlpr.beta(hlpr.valueFor(value.lower.s));
|
|
var U = hlpr.beta(hlpr.valueFor(value.upper.s));
|
|
var p = 1 / ((U - L) + 1);
|
|
var result = [];
|
|
for (var l = 0; l < T; l++) {
|
|
result[l] = ((l >= L) && (l <= U)) ? p : 0;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// HLPR expected value
|
|
//
|
|
// Managing consistency and consensus in group decision making with hesitant fuzzy linguistic preference relations - Definition 3
|
|
// http://dx.doi.org/10.1016/j.omega.2015.12.005
|
|
//
|
|
// @param value HLPR preference
|
|
//
|
|
HLPR.expectedValue = function(value) {
|
|
var p = HLPR.possibilityDistribution(value);
|
|
if (typeof p == 'number') {
|
|
return NaN;
|
|
}
|
|
|
|
var hlpr = value.hlpr;
|
|
var ids = hlpr.ids;
|
|
var T = ids.length;
|
|
var result = 0;
|
|
for (var l = 0; l < T; l++) {
|
|
result += hlpr.valueFor(ids[l]) * p[l];
|
|
}
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// HLPR variance
|
|
//
|
|
// Managing consistency and consensus in group decision making with hesitant fuzzy linguistic preference relations - Definition 4
|
|
// http://dx.doi.org/10.1016/j.omega.2015.12.005
|
|
//
|
|
// @param value HLPR preference
|
|
//
|
|
HLPR.variance = function(value) {
|
|
var p = HLPR.possibilityDistribution(value);
|
|
if (typeof p == 'number') {
|
|
return NaN;
|
|
}
|
|
|
|
var hlpr = value.hlpr;
|
|
var ids = hlpr.ids;
|
|
var T = ids.length;
|
|
var result = 0;
|
|
var E = HLPR.expectedValue(value);
|
|
for (var l = 0; l < T; l++) {
|
|
result += Math.pow(hlpr.valueFor(ids[l]) - E, 2) * p[l];
|
|
}
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Hesitant Fuzzy Linguistic Weighted Average operator
|
|
//
|
|
// Managing consistency and consensus in group decision making with hesitant fuzzy linguistic preference relations - Definition 6
|
|
// http://dx.doi.org/10.1016/j.omega.2015.12.005
|
|
//
|
|
// @param values Preferences to aggregate
|
|
// @param weights HLPRs weights
|
|
//
|
|
HLPR.HFLWA = function(values, weights) {
|
|
var n = values.length;
|
|
if (typeof weights == 'undefined') {
|
|
weights = [];
|
|
var w = 1/n;
|
|
for (var i = 0; i < n; i++) {
|
|
weights[i] = w;
|
|
}
|
|
} else {
|
|
var sum = 0;
|
|
for (var i = 0; i < weights.length; i++) {
|
|
sum += weights[i];
|
|
}
|
|
for (var i = 0; i < weights.length; i++) {
|
|
weights[i] /= sum;
|
|
}
|
|
}
|
|
var distributions = [];
|
|
for (var i = 0; i < n; i++) {
|
|
distributions[i] = HLPR.possibilityDistribution(values[i]);
|
|
}
|
|
var result = [];
|
|
var T = values[0].hlpr.ids.length;
|
|
for (var i = 0; i < T; i++) {
|
|
result[i] = 0;
|
|
for (var j = 0; j < n; j++) {
|
|
result[i] += weights[j] * distributions[j][i];
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Expected LPR
|
|
//
|
|
// Managing consistency and consensus in group decision making with hesitant fuzzy linguistic preference relations - EB
|
|
// http://dx.doi.org/10.1016/j.omega.2015.12.005
|
|
//
|
|
// @param hlpr HLPR
|
|
//
|
|
HLPR.expectedLPR = function(hlpr) {
|
|
if (typeof hlpr == 'undefined') {
|
|
return NaN;
|
|
}
|
|
|
|
if (typeof hlpr.n == 'undefined') {
|
|
return NaN;
|
|
}
|
|
var n = hlpr.n;
|
|
var ids = hlpr.ids;
|
|
var result = new LPR(ids, n);
|
|
var value;
|
|
var e;
|
|
for (var i = 0; i < (n - 1); i++) {
|
|
for (var j = i + 1; j < n; j++) {
|
|
value = hlpr.getValue(i | 0, j | 0);
|
|
if (value.toString() !== 'NaN') {
|
|
e = HLPR.expectedValue(value);
|
|
result.preference.setValueSymmetrically(i | 0, j | 0, e);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Group LPR
|
|
//
|
|
// Managing consistency and consensus in group decision making with hesitant fuzzy linguistic preference relations - Eq. (10-13)
|
|
// http://dx.doi.org/10.1016/j.omega.2015.12.005
|
|
//
|
|
// @param hlprs HLPRs
|
|
// @param weights Experts' weights
|
|
//
|
|
HLPR.groupLPR = function(hlprs, weights) {
|
|
if (typeof hlprs == 'undefined') {
|
|
return NaN;
|
|
}
|
|
|
|
if (typeof hlprs[0] == 'undefined') {
|
|
return NaN;
|
|
}
|
|
|
|
var experts = hlprs.length;
|
|
var hlpr = hlprs[0];
|
|
var n = hlpr.n;
|
|
var ids = hlpr.ids;
|
|
var T = ids.length;
|
|
var result = new LPR(ids, n);
|
|
var aggregateValue;
|
|
var values;
|
|
var expectedValue;
|
|
for (var i = 0; i < (n - 1); i++) {
|
|
for (var j = i + 1; j < n; j++) {
|
|
values = [];
|
|
expectedValue = 0;
|
|
for (var e = 0; e < experts; e++) {
|
|
values[e] = hlprs[e].getValue(i | 0, j | 0);
|
|
}
|
|
aggregateValue = HLPR.HFLWA(values, weights);
|
|
for (var l = 0; l < T; l++) {
|
|
expectedValue += hlpr.valueFor(ids[l]) * aggregateValue[l];
|
|
}
|
|
result.preference.setValueSymmetrically(i | 0, j | 0, expectedValue);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Wu's distance between two values
|
|
//
|
|
// Managing consistency and consensus in group decision making with hesitant fuzzy linguistic preference relations - Eq. (16)
|
|
// http://dx.doi.org/10.1016/j.omega.2015.12.005
|
|
//
|
|
// @param a Linguistic variable a
|
|
// @param b Linguistic variable b
|
|
//
|
|
HLPR.wuDistanceBetweenTwoValues = function(a, b) {
|
|
if ((typeof a == 'undefined') || (typeof b == 'undefined')) {
|
|
return NaN;
|
|
}
|
|
if ((typeof a.lpr == 'undefined') || (typeof b.lpr == 'undefined')) {
|
|
return NaN;
|
|
}
|
|
if (a.lpr.ids != b.lpr.ids) {
|
|
return NaN;
|
|
}
|
|
if (!( a.lpr.ids.length & 1 )) {
|
|
return NaN;
|
|
}
|
|
var lpr = a.lpr;
|
|
var T = lpr.ids.length;
|
|
var aInverseDelta = lpr.beta(lpr.valueFor(a.s)) + a.alpha;
|
|
var bInverseDelta = lpr.beta(lpr.valueFor(b.s)) + b.alpha;
|
|
var result = Math.abs(aInverseDelta - bInverseDelta);
|
|
result /= T - 1;
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Wu's distance between expected and additive consistent
|
|
//
|
|
// Managing consistency and consensus in group decision making with hesitant fuzzy linguistic preference relations - Eq. (15)
|
|
// http://dx.doi.org/10.1016/j.omega.2015.12.005
|
|
//
|
|
// @param E Expected LPR
|
|
// @param B Additive consistent LPR
|
|
//
|
|
HLPR.wuDistanceBetweenExpectedAndAdittiveConsistent = function(E, B) {
|
|
if ((typeof E == 'undefined') || (typeof B == 'undefined')) {
|
|
return NaN;
|
|
}
|
|
if (E.ids != E.ids) {
|
|
return NaN;
|
|
}
|
|
if (!(E.ids.length & 1 )) {
|
|
return NaN;
|
|
}
|
|
var result = 0;
|
|
var e;
|
|
var b;
|
|
var n = E.n;
|
|
for (var i = 0; i < (n - 1); i++) {
|
|
for (var j = i + 1; j < n; j++) {
|
|
e = E.getValue(i | 0, j | 0);
|
|
b = B.getValue(i | 0, j | 0);
|
|
result += Math.pow(HLPR.wuDistanceBetweenTwoValues(e, b), 2);
|
|
}
|
|
}
|
|
result *= 2 / (n * (n - 1));
|
|
result = Math.sqrt(result).toFixed(2)/1;
|
|
return result;
|
|
}
|
|
</code>
|
|
</snippet> |