1323 lines
39 KiB
Plaintext
1323 lines
39 KiB
Plaintext
<snippet>
|
|
<subclass>afryca.ase.Snippet</subclass>
|
|
<file></file>
|
|
<category>Library</category>
|
|
<name>consensus</name>
|
|
<description></description>
|
|
<code>
|
|
var consensus = (typeof exports === "undefined")?(function consensus() {}):(exports);
|
|
if(typeof global !== "undefined") { global.consensus = consensus; }
|
|
|
|
/*
|
|
Minimum Cost Zhang 2011 using a vector with all experts for one i and j.
|
|
|
|
*/
|
|
consensus.zhang2011minimumcostVector = function zhang2011minimumcost(epsilon, cost, pref){
|
|
|
|
var stringData="";
|
|
var preferencesArray=[];
|
|
|
|
for(var i=0;i<cost.length;i++){
|
|
pref[i]=Math.round(pref[i]*100)/100;
|
|
cost[i]=Math.round(cost[i]*100)/100;
|
|
}
|
|
|
|
epsilon=Math.round(epsilon*100)/100;
|
|
|
|
var library='library(Rsolnp);';
|
|
var rengine = ase.evalCode('R', library);
|
|
var o='o =c(';
|
|
var costAux='cost=c(';
|
|
|
|
for(var i=0;i<pref.length;i++){
|
|
costAux+=cost[i];
|
|
o+=pref[i];
|
|
if(i!=pref.length-1){
|
|
costAux+=',';
|
|
o+=',';
|
|
}
|
|
}
|
|
o+=');';
|
|
costAux+=');';
|
|
|
|
rengine = ase.evalCode('R', o);
|
|
rengine = ase.evalCode('R', costAux);
|
|
var n = 'n = length(o);';
|
|
rengine = ase.evalCode('R', n);
|
|
|
|
var epsilonAux='epsilon ='+epsilon+';';
|
|
|
|
var rengineEpsilon = ase.evalCode('R', epsilonAux);
|
|
|
|
var fn1='fn1 = function(x) { sum(cost * abs(o - x)); };';
|
|
rengine = ase.evalCode('R', fn1);
|
|
|
|
var ineq1 = 'ineq1 = function(x) { acum = (sum(x) - (max(x) + min(x))) / (n - 2); if(x >= min(x) && x <= max(x)){ return (abs(x - acum));} };';
|
|
rengine = ase.evalCode('R', ineq1);
|
|
|
|
var solnp='sol = solnp(o, fun = fn1, ineqfun = ineq1, ineqLB = rep(0, n), ineqUB = rep(epsilon, n), LB=rep(0,n), UB=rep(1,n));';
|
|
rengine = ase.evalCode('R', solnp);
|
|
|
|
var fin='sol$pars';
|
|
rengine = ase.evalCode('R', fin);
|
|
|
|
|
|
stringData+=""+rengine;
|
|
stringData=stringData.split("(");
|
|
stringData=stringData[1].split(")");
|
|
stringData=stringData[0].split(",");
|
|
|
|
for(var m=0;m<pref.length;m++){
|
|
var fl=(parseFloat(stringData[m]));
|
|
preferencesArray.push(fl);
|
|
}
|
|
|
|
return preferencesArray;
|
|
}
|
|
|
|
/*
|
|
Minimum Cost Zhang 2011 using a vector with all experts for one i and j and weights vector.
|
|
|
|
*/
|
|
consensus.zhang2011minimumcostVectorWeights = function zhang2011minimumcostVectorWeights(epsilon,cost,pref,weights){
|
|
|
|
for(var i=0;i<cost.length;i++){
|
|
pref[i]=Math.round(pref[i]*100)/100;
|
|
cost[i]=Math.round(cost[i]*100)/100;
|
|
weights[i]=Math.round(weights[i]*1000)/1000;
|
|
}
|
|
|
|
epsilon=Math.round(epsilon*100)/100;
|
|
|
|
var library ='library(Rsolnp);';
|
|
var rengine = ase.evalCode('R', library);
|
|
var o='o =c(';
|
|
var costAux='cost=c(';
|
|
var w='weight =c(';
|
|
|
|
for(var i=0;i<pref.length;i++){
|
|
costAux+=cost[i];
|
|
o+=pref[i];
|
|
w+=weights[i];
|
|
if(i!=pref.length-1){
|
|
costAux+=',';
|
|
o+=',';
|
|
w+=',';
|
|
}
|
|
}
|
|
o+=');';
|
|
costAux+=');';
|
|
w+=');';
|
|
|
|
rengine = ase.evalCode('R', o);
|
|
rengine = ase.evalCode('R', costAux);
|
|
rengine = ase.evalCode('R', w);
|
|
|
|
var n = 'n = length(o);';
|
|
rengine = ase.evalCode('R', n);
|
|
|
|
var epsilonAux = 'epsilon ='+epsilon+';';
|
|
var rengineEpsilon = ase.evalCode('R', epsilonAux);
|
|
|
|
var fn1='fn1 = function(x) { sum(cost * abs(o - x)); };';
|
|
rengine = ase.evalCode('R', fn1);
|
|
|
|
var ineq1 = 'ineq1 = function(x) { acum = sum(x * weight); return (abs(x - acum)); };';
|
|
rengine = ase.evalCode('R', ineq1);
|
|
|
|
var solnp ='sol = try(solnp(o, fun = fn1, ineqfun = ineq1, ineqLB = rep(0, n), ineqUB = rep(epsilon, n), LB=rep(0,n), UB=rep(Inf,n), control=list(outer.iter=400,delta = 0.01, tol = 0.01)));';
|
|
var rengineSolnp = ase.evalCode('R', solnp);
|
|
|
|
rengine = ase.evalCode('R', 'class(sol)');
|
|
if ((rengine.asString()).equals("try-error")) {
|
|
print(rengineSolnp.asString());
|
|
}
|
|
|
|
var fin = 'sol$pars';
|
|
rengine = ase.evalCode('R', fin);
|
|
|
|
var stringData="";
|
|
var preferencesArray = new ArrayList();
|
|
|
|
stringData+=""+rengine;
|
|
stringData=stringData.split("(");
|
|
stringData=stringData[1].split(")");
|
|
stringData=stringData[0].split(",");
|
|
|
|
for(var m=0;m<pref.length;m++){
|
|
preferencesArray.add(stringData[m]);
|
|
}
|
|
|
|
return preferencesArray;
|
|
}
|
|
|
|
/*
|
|
Minimum Cost Zhang 2011 using a vector with all experts for one i and j.
|
|
Using for recommendation systems Raciel program
|
|
return -1 if solution not found or a value if solution is found
|
|
*/
|
|
consensus.zhang2011minimumcostvectorweightedaverage = function zhang2011minimumcostvectorweightedaverage(epsilon,cost,pref, weights){
|
|
var stringData="";
|
|
var preferencesArray=[];
|
|
|
|
for(var i=0;i<cost.length;i++){
|
|
pref[i]=Math.round(pref[i]*100)/100;
|
|
cost[i]=Math.round(cost[i]*100)/100;
|
|
weights[i]=Math.round(weights[i]*100)/100;
|
|
}
|
|
|
|
epsilon=Math.round(epsilon*100)/100;
|
|
|
|
var library='library(Rsolnp);';
|
|
var rengine = ase.evalCode('R', library);
|
|
var o='o =c(';
|
|
var costAux='cost=c(';
|
|
var w='weight =c(';
|
|
|
|
for(var i=0;i<pref.length;i++){
|
|
costAux+=cost[i];
|
|
o+=pref[i];
|
|
w+=weights[i];
|
|
if(i!=pref.length-1){
|
|
costAux+=',';
|
|
o+=',';
|
|
w+=',';
|
|
}
|
|
}
|
|
|
|
o+=');';
|
|
costAux+=');';
|
|
w+=');';
|
|
|
|
rengine = ase.evalCode('R', o);
|
|
rengine = ase.evalCode('R', costAux);
|
|
rengine = ase.evalCode('R', w);
|
|
var n = 'n = length(o);';
|
|
rengine = ase.evalCode('R', n);
|
|
|
|
var epsilonAux='epsilon ='+epsilon+';';
|
|
|
|
var rengineEpsilon = ase.evalCode('R', epsilonAux);
|
|
|
|
var fn1='fn1 = function(x) { sum(cost * abs(o - x)); };';
|
|
rengine = ase.evalCode('R', fn1);
|
|
|
|
var ineq1 = 'ineq1 = function(x) { acum = sum(x * weight); return (abs(x - acum)); };';
|
|
rengine = ase.evalCode('R', ineq1);
|
|
|
|
var solnp = 'sol = try(solnp(o, fun = fn1, ineqfun = ineq1, ineqLB = rep(0, n), ineqUB = rep(epsilon, n), LB=rep(1, n), UB=rep(5, n), control=list(outer.iter=400,delta = 0.01, tol = 0.01)));';
|
|
|
|
rengine = ase.evalCode('R', solnp);
|
|
|
|
var iter='sol$outer.iter';
|
|
rengine = ase.evalCode('R', iter);
|
|
if(rengine!='[REAL* (400.0)]'){
|
|
|
|
var fin='sol$pars';
|
|
rengine = ase.evalCode('R', fin);
|
|
|
|
stringData+=""+rengine;
|
|
stringData=stringData.split("(");
|
|
stringData=stringData[1].split(")");
|
|
stringData=stringData[0].split(",");
|
|
|
|
for(var m=0;m<pref.length;m++){
|
|
var fl=(parseFloat(stringData[m]));
|
|
preferencesArray.push(fl);
|
|
}
|
|
|
|
return preferencesArray;
|
|
}else{
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
Minimum Cost Zhang 2011 using a vector with all experts for one i and j (including consensus).
|
|
*/
|
|
consensus.zhang2011minimumcostLinguistic = function zhang2011minimumcostLinguistic(epsilon, alpha, cost, weights, pref){
|
|
epsilon = Math.round(epsilon * 100) / 100;
|
|
alpha = Math.round(alpha * 100) / 100;
|
|
|
|
var library='library(Rsolnp);';
|
|
var rengine = ase.evalCode('R', library);
|
|
|
|
var o = 'o = c(';
|
|
var costAux = 'cost = c(';
|
|
var weightsAux = 'weight = c(';
|
|
|
|
for(var i = 0; i < pref.length; i++){
|
|
|
|
if(pref[i] == 0) {
|
|
pref[i] = 0.01;
|
|
}
|
|
|
|
o += Math.round(pref[i] * 100) / 100;
|
|
costAux += Math.round(cost[i]);
|
|
weightsAux += Math.round(weights[i] * 100) / 100;
|
|
|
|
if(i != pref.length - 1){
|
|
o += ',';
|
|
costAux += ',';
|
|
weightsAux += ',';
|
|
}
|
|
}
|
|
|
|
o += ');';
|
|
costAux += ');';
|
|
weightsAux += ');';
|
|
|
|
rengine = ase.evalCode('R', o);
|
|
rengine = ase.evalCode('R', costAux);
|
|
rengine = ase.evalCode('R', weightsAux);
|
|
|
|
var n = 'n = length(o);';
|
|
rengine = ase.evalCode('R', n);
|
|
|
|
var epsilonAux='epsilon ='+epsilon+';';
|
|
var rengineEpsilon = ase.evalCode('R', epsilonAux);
|
|
|
|
var alphaAux = 'alpha =' + alpha + ';';
|
|
var rengineAlpha = ase.evalCode('R', alphaAux);
|
|
|
|
var fn1='fn1 = function(x) { sum(cost * abs(o - x)); };';
|
|
rengine = ase.evalCode('R', fn1);
|
|
|
|
var ineq1 = 'ineq1 = function(x) {' +
|
|
'collective = (sum(x) - (max(x) + min(x))) / (n - 2);' +
|
|
'consensus = sum(weight * abs(x - collective));' +
|
|
'result = rep(0, n + 1);' +
|
|
'result = c(abs(x - collective), consensus);' +
|
|
'return (result);' +
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', ineq1);
|
|
|
|
var solnp ='sol = try(solnp(o, fun = fn1, ineqfun = ineq1, ineqLB = rep(0, n + 1), ineqUB = c(rep(epsilon, n), 1 - alpha), LB = rep(0, n), UB = rep(1, n), control = list(outer.iter = 400, delta = 0.01, tol = 0.01)));';
|
|
var rengineSolnp = ase.evalCode('R', solnp);
|
|
|
|
rengine = ase.evalCode('R', 'class(sol)');
|
|
if ((rengine.asString()).equals("try-error")) {
|
|
print(rengineSolnp.asString());
|
|
}
|
|
|
|
var fin ='sol$pars';
|
|
rengine = ase.evalCode('R', fin);
|
|
|
|
var stringData = "";
|
|
var preferencesArray = [];
|
|
|
|
stringData += "" + rengine;
|
|
stringData = stringData.split("(");
|
|
stringData = stringData[1].split(")");
|
|
stringData = stringData[0].split(",");
|
|
|
|
for(var m = 0; m < pref.length; m++){
|
|
preferencesArray[m] = (Math.round(parseFloat(stringData[m]) * 100) / 100);
|
|
}
|
|
|
|
return preferencesArray;
|
|
}
|
|
|
|
|
|
/*
|
|
Consensus model Zhang Minimum Cost 2011 with fpr
|
|
|
|
*/
|
|
consensus.zhang2011minimumcost = function (epsilon,cost, pref, alternatives){
|
|
epsilon = Math.round(epsilon * 100) / 100;
|
|
alternatives = Math.round(alternatives);
|
|
var library='library(Rsolnp);';
|
|
var rengine = ase.evalCode('R', library);
|
|
|
|
var costAux ='cost = c(';
|
|
var o ='preferences = c(';
|
|
|
|
var fpr;
|
|
for(var i = 0;i < pref.length;i++){
|
|
fpr = pref[i];
|
|
for(var j = 0;j < alternatives;j++){
|
|
for(var l = 0;l < alternatives;l++){
|
|
if(fpr.getValue(j | 0, l | 0) == 0) {
|
|
o += 0.001;
|
|
} else {
|
|
o += Math.round(fpr.getValue(j | 0, l | 0) * 100) / 100;
|
|
}
|
|
o += ',';
|
|
}
|
|
}
|
|
|
|
costAux += Math.round(cost[i]);
|
|
|
|
if(i != pref.length - 1){
|
|
costAux += ',';
|
|
}
|
|
}
|
|
|
|
o = o.slice(0, -1);
|
|
|
|
costAux += ');';
|
|
o += ');';
|
|
rengine = ase.evalCode('R', costAux);
|
|
rengine = ase.evalCode('R', o);
|
|
|
|
var n = 'n ='+alternatives+';';
|
|
rengine = ase.evalCode('R', n);
|
|
var m = 'm ='+cost.length+';';
|
|
rengine = ase.evalCode('R', m);
|
|
|
|
var epsilonAux ='epsilon = '+epsilon+';';
|
|
var alternativesAux ='alternatives = '+alternatives+';';
|
|
|
|
rengine = ase.evalCode('R', epsilonAux);
|
|
rengine = ase.evalCode('R', alternativesAux);
|
|
|
|
var fn1 = 'fn1 <- function(x) {'+
|
|
'result = 0;'+
|
|
'for(k in 1:m) {'+
|
|
'result = result + (cost[k] * computeDistancePreference(x, k));'+
|
|
'};'+
|
|
'return (result);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', fn1);
|
|
|
|
var computeDistancePreference = 'computeDistancePreference = function(x, k) {'+
|
|
'acum = 0;'+
|
|
'distance = 0;'+
|
|
'for(i in 1: (n-1)) {'+
|
|
'for(j in (i+1): n) {'+
|
|
'acum = acum + (x[((i - 1) * n + j) + ((n^2) * (k - 1))] - preferences[((i - 1) * n + j) + ((n^2) * (k - 1))])^2;'+
|
|
'};'+
|
|
'};'+
|
|
'distance = sqrt((2/(n*(n-1))) * acum);'+
|
|
'return (distance);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', computeDistancePreference);
|
|
|
|
var eq1 = 'eq1 = function(x) {'+
|
|
'symmetric = rep(0, m * ((n * (n - 1)) / 2));'+
|
|
'cont2 = 1;'+
|
|
'for(k in 1: m) {'+
|
|
'for(i in 1: (n-1)) {'+
|
|
'for(j in (i+1): n) {'+
|
|
'symmetric[cont2] = x[((i - 1) * n + j) + ((n^2) * (k - 1))] + x[((j - 1) * n + i) + ((n^2) * (k - 1))];'+
|
|
'cont2 = cont2 + 1;'+
|
|
'};'+
|
|
'};'+
|
|
'};'+
|
|
'diagonal = rep(0, n * m);'+
|
|
'cont3 = 1;'+
|
|
'for(k in 1: m) {'+
|
|
'for(i in 1: n) {'+
|
|
'diagonal[cont3] = x[((i - 1) * n + i) + ((n^2) * (k - 1))];'+
|
|
'cont3 = cont3 + 1;'+
|
|
'};'+
|
|
'};'+
|
|
'equalities = c(symmetric, diagonal);'+
|
|
'return(equalities);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', eq1);
|
|
|
|
var ineq1 = 'ineq1 = function(x) {'+
|
|
'collective = computeCollective(x);'+
|
|
'distance = 0;'+
|
|
'for(k in 1:m) {'+
|
|
'distance = distance + computeDistanceCollective(x, k, collective);'+
|
|
'};'+
|
|
'return(distance);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', ineq1);
|
|
|
|
var computeCollective = 'computeCollective = function(x) {'+
|
|
'acum = 0;'+
|
|
'collective = rep(0, n * n);'+
|
|
'for(i in 1: (n-1)) {'+
|
|
'for(j in (i+1): n) {'+
|
|
'acum = 0;'+
|
|
'for(k in 1: m) {'+
|
|
'acum = acum + (x[((i - 1) * n + j) + ((n^2) * (k - 1))]);'+
|
|
'};'+
|
|
'acum = acum/m;'+
|
|
'collective[(i - 1) * n + j] = acum;'+
|
|
'collective[(j - 1) * n + i] = 1 - acum;'+
|
|
'collective[(i - 1) * n + i] = 0.5;'+
|
|
'collective[(j - 1) * n + j] = 0.5;'+
|
|
'};'+
|
|
'};'+
|
|
'return (collective);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', computeCollective);
|
|
|
|
var computeDistanceCollective = 'computeDistanceCollective <- function(x, k, collective) {'+
|
|
'acum = 0;'+
|
|
'distance = 0;'+
|
|
'for(i in 1: (n-1)) {'+
|
|
'for(j in (i+1): n) {'+
|
|
'acum = acum + (x[((i - 1) * n + j) + ((n^2) * (k - 1))] - collective[((i - 1) * n + j)])^2;'+
|
|
'};'+
|
|
'};'+
|
|
'distance = sqrt((2/(n*(n-1))) * acum);'+
|
|
'return (distance);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', computeDistanceCollective);
|
|
var sol = 'sol = try(solnp(preferences, fun = fn1, eqfun = eq1, eqB = c(rep(1, m * ((n * (n - 1)) / 2)), rep(0.5, n * m)), ineqfun = ineq1, ineqLB = 0, ineqUB = epsilon, LB = rep(0, n * n * m), UB = rep(1, n * n * m),control = list(outer.iter = 400, delta = 0.01, tol =0.01, trace = 1)))';
|
|
var rengineSolnp = ase.evalCode('R', sol);
|
|
|
|
rengine = ase.evalCode('R', 'class(sol)');
|
|
if ((rengine.asString()).equals("try-error")) {
|
|
print(rengineSolnp.asString());
|
|
}
|
|
|
|
var resultsSize = 'resultSize = length(sol$pars);';
|
|
rengine = ase.evalCode('R', resultsSize);
|
|
|
|
var preferencesArray = consensus.transformResults(rengine, cost.length);
|
|
|
|
var fprsRound = new ArrayList();
|
|
var fprRound;
|
|
var pr;
|
|
for(var k = 0; k < cost.length; k++) {
|
|
fprRound = new FPR(alternatives);
|
|
fprsRound.add(fprRound);
|
|
for(var i = 0; i < (alternatives - 1); i++) {
|
|
for(var j = i + 1; j < alternatives; j++) {
|
|
pr = preferencesArray[k];
|
|
fprRound.setValueSymmetrically(i | 0, j | 0, pr[(i * alternatives + j)]);
|
|
}
|
|
}
|
|
}
|
|
|
|
return fprsRound;
|
|
}
|
|
|
|
consensus.hliu2018minimumcost = function hongbin2018minimumcost(epsilon, alpha, cost, weights, pref, alternatives, model){
|
|
var result;
|
|
|
|
if(!model) {
|
|
result = consensus.distanceToCollective(epsilon, alpha, cost, weights, pref, alternatives);
|
|
} else {
|
|
result = consensus.distanceToExperts(epsilon, alpha, cost, weights, pref, alternatives);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
consensus.distanceToCollective = function distanceToCollective(epsilon, alpha, cost, weights, pref, alternatives){
|
|
epsilon = Math.round(epsilon * 100) / 100;
|
|
alpha = Math.round(alpha * 100) / 100;
|
|
gamma = Math.round((1 - alpha)* 100) / 100;
|
|
alternatives = Math.round(alternatives);
|
|
|
|
var library='library(Rsolnp);';
|
|
var rengine = ase.evalCode('R', library);
|
|
|
|
var costAux ='cost = c(';
|
|
var weightsAux ='weightsExperts = c(';
|
|
var o ='preferences = c(';
|
|
|
|
var fpr;
|
|
for(var i = 0;i < pref.length;i++){
|
|
fpr = pref[i];
|
|
for(var j = 0;j < alternatives - 1;j++){
|
|
for(var l = j+1;l < alternatives;l++){
|
|
if(fpr.getValue(j | 0, l | 0) == 0) {
|
|
o += 0.001;
|
|
} else {
|
|
o += Math.round(fpr.getValue(j | 0, l | 0) * 100) / 100;
|
|
}
|
|
o += ',';
|
|
|
|
costAux += Math.round(cost[i]);
|
|
costAux += ',';
|
|
}
|
|
}
|
|
|
|
weightsAux += Math.round(weights[i] * 1000) / 1000;
|
|
|
|
if(i != pref.length - 1){
|
|
weightsAux += ',';
|
|
}
|
|
}
|
|
|
|
o = o.slice(0, -1);
|
|
costAux = costAux.slice(0, -1);
|
|
|
|
costAux += ');';
|
|
weightsAux += ');';
|
|
o += ');';
|
|
|
|
rengine = ase.evalCode('R', costAux);
|
|
rengine = ase.evalCode('R', weightsAux);
|
|
rengine = ase.evalCode('R', o);
|
|
|
|
var n = 'n ='+alternatives+';';
|
|
rengine = ase.evalCode('R', n);
|
|
var m = 'm ='+cost.length+';';
|
|
rengine = ase.evalCode('R', m);
|
|
var upperDiagonal = 'upperDiagonal =' + ((alternatives * (alternatives - 1)) / 2)+';';
|
|
rengine = ase.evalCode('R', upperDiagonal);
|
|
|
|
var epsilonAux ='epsilon = '+epsilon+';';
|
|
var alphaAux ='alpha = '+alpha+';';
|
|
var gammaAux ='gamma = '+gamma+';';
|
|
var alternativesAux ='alternatives = '+alternatives+';';
|
|
|
|
rengine = ase.evalCode('R', epsilonAux);
|
|
rengine = ase.evalCode('R', alphaAux);
|
|
rengine = ase.evalCode('R', gammaAux);
|
|
rengine = ase.evalCode('R', alternativesAux);
|
|
|
|
var fn1 = 'fn1 <- function(x) {'+
|
|
'return (sum(cost * abs(x - preferences)));'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', fn1);
|
|
|
|
var ineq1 = 'ineq1 = function(x) {'+
|
|
'collective = computeCollective(x);'+
|
|
'distance = rep(0, m * ((n * (n - 1)) / 2));'+
|
|
'cont2 = 1;'+
|
|
'for(k in 1:m) {'+
|
|
'for(i in 1: upperDiagonal) {'+
|
|
'distance[cont2] = abs(x[i + (upperDiagonal * (k - 1))] - collective[i]);'+
|
|
'cont2 = cont2 + 1;'+
|
|
'};'+
|
|
'};'+
|
|
'consensus = 0;'+
|
|
'for(k in 1:m) {'+
|
|
'for(i in 1: upperDiagonal) {'+
|
|
'consensus = consensus + weightsExperts[k] * abs(x[i + (upperDiagonal * (k - 1))] - collective[i]);'+
|
|
'};'+
|
|
'};'+
|
|
'consensus = (consensus * 2) / (n * (n - 1));'+
|
|
'constraints = c(distance, consensus);'+
|
|
'return(constraints);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', ineq1);
|
|
|
|
var computeCollective = 'computeCollective = function(x) {'+
|
|
'acum = 0;'+
|
|
'collective = rep(0, (n * (n - 1)));'+
|
|
'for(i in 1: upperDiagonal) {'+
|
|
'acum = 0;'+
|
|
'for(k in 1: m) {'+
|
|
'acum = acum + (weightsExperts[k] * x[i + (upperDiagonal * (k - 1))]);'+
|
|
'};'+
|
|
'collective[i] = acum;'+
|
|
'};'+
|
|
'return (collective);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', computeCollective);
|
|
|
|
var sol = 'sol = try(solnp(preferences, fun = fn1, eqfun = NULL, eqB = NULL, ineqfun = ineq1, ineqLB = c(rep(0, m * ((n * (n - 1)) / 2)), 0), ineqUB = c(rep(epsilon, m * ((n * (n - 1)) / 2)), gamma), LB = rep(0, ((n * (n - 1)) / 2) * m), UB = rep(Inf, ((n * (n - 1)) / 2) * m), control = list(delta = 0.01, tol = 0.01)))';
|
|
|
|
var rengineSolnp = ase.evalCode('R', sol);
|
|
|
|
rengine = ase.evalCode('R', 'class(sol)');
|
|
if ((rengine.asString()).equals("try-error")) {
|
|
print(rengineSolnp.asString());
|
|
}
|
|
|
|
var lengthSol = 'length(sol$pars);';
|
|
var lengthSolRFormat = ase.evalCode('R', lengthSol);
|
|
|
|
var preferencesArray = consensus.transformResults(lengthSolRFormat, weights.length);
|
|
|
|
var fprsRound = new ArrayList();
|
|
var fprRound;
|
|
var pr;
|
|
|
|
var cont = 0;
|
|
for(var k = 0; k < preferencesArray.length; k++) {
|
|
fprRound = new FPR(alternatives);
|
|
fprsRound.add(fprRound);
|
|
cont = 0;
|
|
for(var i = 0; i < (alternatives - 1); i++) {
|
|
for(var j = i + 1; j < alternatives; j++) {
|
|
pr = preferencesArray[k];
|
|
fprRound.setValueSymmetrically(i | 0, j | 0, pr[cont]);
|
|
cont++;
|
|
}
|
|
}
|
|
}
|
|
|
|
return fprsRound;
|
|
}
|
|
|
|
consensus.transformResults = function transformResults(lengthSolRFormat, numExperts) {
|
|
var fin;
|
|
var stringData = "";
|
|
var fl;
|
|
var preferenceArray = [];
|
|
var preferencesArray = [];
|
|
|
|
var lengthSolString = "" + lengthSolRFormat;
|
|
lengthSolString = lengthSolString.replace("[INT* ", "");
|
|
lengthSolString = lengthSolString.replace("]", "");
|
|
lengthSolString = lengthSolString.replace("(", "");
|
|
lengthSolString = lengthSolString.replace(")", "");
|
|
|
|
var size = parseInt(lengthSolString);
|
|
for(var r = 1; r <= size; r++) {
|
|
fin = 'sol$pars['+ r +']';
|
|
rengine = ase.evalCode('R', fin);
|
|
|
|
stringData = "" + rengine;
|
|
stringData = stringData.replace("[REAL* ", "");
|
|
stringData = stringData.replace("]", "");
|
|
stringData = stringData.replace("(", "");
|
|
stringData = stringData.replace(")", "");
|
|
|
|
fl= Math.round(parseFloat(stringData) * 100) / 100;
|
|
preferenceArray.push(fl);
|
|
|
|
if(preferenceArray.length == parseInt(size / numExperts)) {
|
|
preferencesArray.push(preferenceArray);
|
|
preferenceArray = [];
|
|
}
|
|
}
|
|
return preferencesArray;
|
|
}
|
|
|
|
consensus.distanceToExperts = function distanceToExperts(epsilon, alpha, cost, weights, pref, alternatives){
|
|
epsilon = Math.round(epsilon * 100) / 100;
|
|
alpha = Math.round(alpha * 100) / 100;
|
|
gamma = Math.round((1 - alpha)* 100) / 100;
|
|
alternatives = Math.round(alternatives);
|
|
|
|
var library='library(Rsolnp);';
|
|
var rengine = ase.evalCode('R', library);
|
|
|
|
var costAux ='cost = c(';
|
|
var weightsAux ='weightsExperts = c(';
|
|
var o ='preferences = c(';
|
|
|
|
var fpr;
|
|
for(var i = 0;i < pref.length;i++){
|
|
fpr = pref[i];
|
|
for(var j = 0;j < alternatives - 1;j++){
|
|
for(var l = j+1;l < alternatives;l++){
|
|
if(fpr.getValue(j | 0, l | 0) == 0) {
|
|
o += 0.001;
|
|
} else {
|
|
o += Math.round(fpr.getValue(j | 0, l | 0) * 100) / 100;
|
|
}
|
|
o += ',';
|
|
|
|
costAux += Math.round(cost[i]);
|
|
costAux += ',';
|
|
}
|
|
}
|
|
|
|
weightsAux += Math.round(weights[i] * 10000) / 10000;
|
|
|
|
if(i != pref.length - 1){
|
|
weightsAux += ',';
|
|
}
|
|
}
|
|
|
|
o = o.slice(0, -1);
|
|
costAux = costAux.slice(0, -1);
|
|
|
|
costAux += ');';
|
|
weightsAux += ');';
|
|
o += ');';
|
|
|
|
rengine = ase.evalCode('R', costAux);
|
|
rengine = ase.evalCode('R', weightsAux);
|
|
rengine = ase.evalCode('R', o);
|
|
|
|
var n = 'n ='+alternatives+';';
|
|
rengine = ase.evalCode('R', n);
|
|
var m = 'm ='+cost.length+';';
|
|
rengine = ase.evalCode('R', m);
|
|
var upperDiagonal = 'upperDiagonal =' + ((alternatives * (alternatives - 1)) / 2)+';';
|
|
rengine = ase.evalCode('R', upperDiagonal);
|
|
|
|
var epsilonAux ='epsilon = '+epsilon+';';
|
|
var alphaAux ='alpha = '+alpha+';';
|
|
var gammaAux ='gamma = '+gamma+';';
|
|
var alternativesAux ='alternatives = '+alternatives+';';
|
|
|
|
rengine = ase.evalCode('R', epsilonAux);
|
|
rengine = ase.evalCode('R', alphaAux);
|
|
rengine = ase.evalCode('R', gammaAux);
|
|
rengine = ase.evalCode('R', alternativesAux);
|
|
|
|
var fn1 = 'fn1 <- function(x) {'+
|
|
'return (sum(cost * abs(x - preferences)));'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', fn1);
|
|
|
|
var ineq1 = 'ineq1 <- function(x) {'+
|
|
'collective = computeCollective(x);'+
|
|
'distance = rep(0, m * ((n * (n - 1)) / 2));'+
|
|
'cont2 = 1;'+
|
|
'for(k in 1:m) {'+
|
|
'for(i in 1: upperDiagonal) {'+
|
|
'distance[cont2] = abs(x[i + (upperDiagonal * (k - 1))] - collective[i]);'+
|
|
'cont2 = cont2 + 1;'+
|
|
'};'+
|
|
'};'+
|
|
'consensus = 0;'+
|
|
'for(k in 1:(m-1)) {'+
|
|
'for(r in (k+1):m) {'+
|
|
'for(i in 1: upperDiagonal) {'+
|
|
'consensus = consensus + ((weightsExperts[k] + weightsExperts[r]) / (m - 1)) * abs(x[i + (upperDiagonal * (k - 1))] - x[i + (upperDiagonal * (r - 1))]);'+
|
|
'};'+
|
|
'};'+
|
|
'};'+
|
|
'consensus = (consensus * 2) / (n * (n - 1));'+
|
|
'constraints = c(distance, consensus);'+
|
|
'return(constraints);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', ineq1);
|
|
|
|
var computeCollective = 'computeCollective = function(x) {'+
|
|
'acum = 0;'+
|
|
'collective = rep(0, (n * (n - 1)));'+
|
|
'for(i in 1: upperDiagonal) {'+
|
|
'acum = 0;'+
|
|
'for(k in 1: m) {'+
|
|
'acum = acum + (weightsExperts[k] * x[i + (upperDiagonal * (k - 1))]);'+
|
|
'};'+
|
|
'collective[i] = acum;'+
|
|
'};'+
|
|
'return (collective);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', computeCollective);
|
|
|
|
var sol = 'sol = try(solnp(preferences, fun = fn1, eqfun = NULL, eqB = NULL, ineqfun = ineq1, ineqLB = c(rep(0, m * ((n * (n - 1)) / 2)), 0), ineqUB = c(rep(epsilon, m * ((n * (n - 1)) / 2)), gamma), LB = rep(0, ((n * (n - 1)) / 2) * m), UB = rep(Inf, ((n * (n - 1)) / 2) * m), control = list(delta = 0.01, tol = 0.01)))';
|
|
|
|
var rengineSolnp = ase.evalCode('R', sol);
|
|
|
|
rengine = ase.evalCode('R', 'class(sol)');
|
|
if ((rengine.asString()).equals("try-error")) {
|
|
print(rengineSolnp.asString());
|
|
}
|
|
|
|
var lengthSol = 'length(sol$pars);';
|
|
var lengthSolRFormat = ase.evalCode('R', lengthSol);
|
|
|
|
var preferencesArray = consensus.transformResults(lengthSolRFormat, weights.length);
|
|
|
|
var fprsRound = new ArrayList();
|
|
var fprRound;
|
|
var pr;
|
|
|
|
var cont = 0;
|
|
for(var k = 0; k < preferencesArray.length; k++) {
|
|
fprRound = new FPR(alternatives);
|
|
fprsRound.add(fprRound);
|
|
cont = 0;
|
|
for(var i = 0; i < (alternatives - 1); i++) {
|
|
for(var j = i + 1; j < alternatives; j++) {
|
|
pr = preferencesArray[k];
|
|
fprRound.setValueSymmetrically(i | 0, j | 0, pr[cont]);
|
|
cont++;
|
|
}
|
|
}
|
|
}
|
|
|
|
return fprsRound;
|
|
}
|
|
|
|
consensus.Rodriguez2017 = function (epsilon, cost, weights, pref, alternatives){
|
|
epsilon = Math.round(epsilon * 100) / 100;
|
|
alternatives = Math.round(alternatives);
|
|
|
|
var library='library(Rsolnp);';
|
|
var rengine = ase.evalCode('R', library);
|
|
|
|
var costAux ='cost = c(';
|
|
var weightsAux ='weightsExperts = c(';
|
|
var o ='preferences = c(';
|
|
|
|
var fpr;
|
|
for(var i = 0;i < pref.length;i++){
|
|
fpr = pref[i];
|
|
for(var j = 0;j < alternatives;j++){
|
|
for(var l = 0;l < alternatives;l++){
|
|
if(fpr.getValue(j | 0, l | 0) == 0) {
|
|
o += 0.001;
|
|
} else {
|
|
o += Math.round(fpr.getValue(j | 0, l | 0) * 100) / 100;
|
|
|
|
}
|
|
o += ',';
|
|
}
|
|
}
|
|
|
|
costAux += Math.round(cost[i]);
|
|
weightsAux += Math.round(weights[i] * 100) / 100;
|
|
|
|
if(i != pref.length - 1){
|
|
costAux += ',';
|
|
weightsAux += ',';
|
|
}
|
|
}
|
|
|
|
o = o.slice(0, -1);
|
|
|
|
costAux += ');';
|
|
weightsAux += ');';
|
|
o += ');';
|
|
|
|
rengine = ase.evalCode('R', costAux);
|
|
rengine = ase.evalCode('R', weightsAux);
|
|
rengine = ase.evalCode('R', o);
|
|
|
|
var n = 'n ='+alternatives+';';
|
|
rengine = ase.evalCode('R', n);
|
|
var m = 'm ='+cost.length+';';
|
|
rengine = ase.evalCode('R', m);
|
|
|
|
var epsilonAux ='epsilon = '+epsilon+';';
|
|
var alternativesAux ='alternatives = '+alternatives+';';
|
|
|
|
rengine = ase.evalCode('R', epsilonAux);
|
|
rengine = ase.evalCode('R', alternativesAux);
|
|
|
|
var fn1 = 'fn1 <- function(x) {'+
|
|
'result = 0;'+
|
|
'for(k in 1:m) {'+
|
|
'result = result + (cost[k] * computeDistancePreference(x, k));'+
|
|
'};'+
|
|
'return (result);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', fn1);
|
|
|
|
var computeDistancePreference = 'computeDistancePreference = function(x, k) {'+
|
|
'acum = 0;'+
|
|
'distance = 0;'+
|
|
'for(i in 1: (n-1)) {'+
|
|
'for(j in (i+1): n) {'+
|
|
'acum = acum + (x[((i - 1) * n + j) + ((n^2) * (k - 1))] - preferences[((i - 1) * n + j) + ((n^2) * (k - 1))])^2;'+
|
|
'};'+
|
|
'};'+
|
|
'distance = sqrt((2/(n*(n-1))) * acum);'+
|
|
'return (distance);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', computeDistancePreference);
|
|
|
|
var eq1 = 'eq1 = function(x) {'+
|
|
'symmetric = rep(0, m * ((n * (n - 1)) / 2));'+
|
|
'cont2 = 1;'+
|
|
'for(k in 1: m) {'+
|
|
'for(i in 1: (n-1)) {'+
|
|
'for(j in (i+1): n) {'+
|
|
'symmetric[cont2] = x[((i - 1) * n + j) + ((n^2) * (k - 1))] + x[((j - 1) * n + i) + ((n^2) * (k - 1))];'+
|
|
'cont2 = cont2 + 1;'+
|
|
'};'+
|
|
'};'+
|
|
'};'+
|
|
'diagonal = rep(0, n * m);'+
|
|
'cont3 = 1;'+
|
|
'for(k in 1: m) {'+
|
|
'for(i in 1: n) {'+
|
|
'diagonal[cont3] = x[((i - 1) * n + i) + ((n^2) * (k - 1))];'+
|
|
'cont3 = cont3 + 1;'+
|
|
'};'+
|
|
'};'+
|
|
'equalities = c(symmetric, diagonal);'+
|
|
'return(equalities);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', eq1);
|
|
|
|
var ineq1 = 'ineq1 = function(x) {'+
|
|
'collective = computeCollective(x);'+
|
|
'distance = 0;'+
|
|
'for(k in 1:m) {'+
|
|
'distance = distance + computeDistanceCollective(x, k, collective);'+
|
|
'};'+
|
|
'return(distance);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', ineq1);
|
|
|
|
var computeCollective = 'computeCollective = function(x) {'+
|
|
'acum = 0;'+
|
|
'collective = rep(0, n * n);'+
|
|
'for(i in 1: (n-1)) {'+
|
|
'for(j in (i+1): n) {'+
|
|
'acum = 0;'+
|
|
'for(k in 1: m) {'+
|
|
'acum = acum + (weightsExperts[k] * (x[((i - 1) * n + j) + ((n^2) * (k - 1))]));'+
|
|
'};'+
|
|
'acum = acum;'+
|
|
'collective[(i - 1) * n + j] = acum;'+
|
|
'collective[(j - 1) * n + i] = 1 - acum;'+
|
|
'collective[(i - 1) * n + i] = 0.5;'+
|
|
'collective[(j - 1) * n + j] = 0.5;'+
|
|
'};'+
|
|
'};'+
|
|
'return (collective);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', computeCollective);
|
|
|
|
var computeDistanceCollective = 'computeDistanceCollective <- function(x, k, collective) {'+
|
|
'acum = 0;'+
|
|
'distance = 0;'+
|
|
'for(i in 1: (n-1)) {'+
|
|
'for(j in (i+1): n) {'+
|
|
'acum = acum + (x[((i - 1) * n + j) + ((n^2) * (k - 1))] - collective[((i - 1) * n + j)])^2;'+
|
|
'};'+
|
|
'};'+
|
|
'distance = sqrt((2/(n*(n-1))) * acum);'+
|
|
'return (distance);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', computeDistanceCollective);
|
|
|
|
var sol = 'sol = try(solnp(preferences, fun = fn1, eqfun = eq1, eqB = c(rep(1, m * ((n * (n - 1)) / 2)), rep(0.5, n * m)), ineqfun = ineq1, ineqLB = 0, ineqUB = 1-epsilon, LB = rep(0, n * n * m), UB = rep(Inf, n * n * m), control = list(delta = 0.01, tol = 0.01)))';
|
|
|
|
var rengineSolnp = ase.evalCode('R', sol);
|
|
|
|
rengine = ase.evalCode('R', 'class(sol)');
|
|
if ((rengine.asString()).equals("try-error")) {
|
|
print(rengineSolnp.asString());
|
|
}
|
|
|
|
var resultsSize = 'resultSize = length(sol$pars);';
|
|
rengine = ase.evalCode('R', resultsSize);
|
|
|
|
var preferencesArray = consensus.transformResults(rengine, cost.length);
|
|
|
|
var fprsRound = new ArrayList();
|
|
var fprRound;
|
|
var pr;
|
|
for(var k = 0; k < cost.length; k++) {
|
|
fprRound = new FPR(alternatives);
|
|
fprsRound.add(fprRound);
|
|
for(var i = 0; i < (alternatives - 1); i++) {
|
|
for(var j = i + 1; j < alternatives; j++) {
|
|
pr = preferencesArray[k];
|
|
fprRound.setValueSymmetrically(i | 0, j | 0, pr[(i * alternatives + j)]);
|
|
}
|
|
}
|
|
}
|
|
return fprsRound;
|
|
}
|
|
|
|
consensus.zhang2011LinearOptimization = function zhang2011LinearOptimization(cl, ccl, prefs, numAlternatives, numExperts) {
|
|
cl = Math.round(cl * 100) / 100;
|
|
ccl = Math.round(ccl * 100) / 100;
|
|
|
|
var library='library(Rsolnp);';
|
|
var rengine = ase.evalCode('R', library);
|
|
var preferences='preferencesR = c(';
|
|
|
|
for(var i = 0;i < prefs.length;i++){
|
|
if(prefs[i] == 0) {
|
|
prefs[i] = 0.001;
|
|
}
|
|
preferences+=prefs[i];
|
|
if(i != prefs.length - 1){
|
|
preferences+=',';
|
|
}
|
|
}
|
|
|
|
preferences += ');';
|
|
ase.evalCode('R', preferences);
|
|
|
|
var n = 'n = '+numAlternatives+';';
|
|
ase.evalCode('R', n);
|
|
|
|
var m = 'm = '+numExperts+';';
|
|
ase.evalCode('R', m);
|
|
|
|
var clAux = 'CL = '+cl+';';
|
|
ase.evalCode('R', clAux);
|
|
|
|
var cclAux = 'CCL = '+ccl+';';
|
|
ase.evalCode('R', cclAux);
|
|
|
|
var fn1 ='fn1 = function(x) { acum = 0; for(k in 1:m) { for(i in 1:n) { for(j in 1:n) { acum = acum + abs(preferencesR[((i - 1) * n + j) + ((n^2) * (k - 1))] - x[((i - 1) * n + j) + ((n^2) * (k - 1))]); } } }; return ((1 /((n^2) * m)) * acum); };';
|
|
|
|
ase.evalCode('R', fn1);
|
|
|
|
var eq1 = 'eq1 = function(x) {'+
|
|
'symmetric = rep(0, m * ((n * (n - 1)) / 2));'+
|
|
'cont2 = 1;'+
|
|
'for(k in 1: m) {'+
|
|
'for(i in 1: (n-1)) {'+
|
|
'for(j in (i+1): n) {'+
|
|
'symmetric[cont2] = x[((i - 1) * n + j) + ((n^2) * (k - 1))] + x[((j - 1) * n + i) + ((n^2) * (k - 1))];'+
|
|
'cont2 = cont2 + 1;'+
|
|
'};'+
|
|
'};'+
|
|
'};'+
|
|
'diagonal = rep(0, n * m);'+
|
|
'cont3 = 1;'+
|
|
'for(k in 1: m) {'+
|
|
'for(i in 1: n) {'+
|
|
'diagonal[cont3] = x[((i - 1) * n + i) + ((n^2) * (k - 1))];'+
|
|
'cont3 = cont3 + 1;'+
|
|
'};'+
|
|
'};'+
|
|
'equalities = c(symmetric, diagonal);'+
|
|
'return(equalities);'+
|
|
'};';
|
|
|
|
rengine = ase.evalCode('R', eq1);
|
|
|
|
var ineq1 = 'ineq1 = function(x) { experts = c(1:m); for(k in 1:m) { acum = 0; for(i in 1:n) { for(cc in 1:n) { if(i != cc) { for(j in 1:n) { if(j != i && j != cc) { acum = acum + abs(x[((i - 1) * n + j) + ((n^2) * (k - 1))] + x[((j - 1) * n + cc) + ((n^2) * (k - 1))] - x[((i - 1) * n + cc) + ((n^2) * (k - 1))] - 0.5); } } } } }; experts[k] = acum * (2 / ((3 * n) * (n - 1) * (n - 2))); }; acum2 = 0; for(i in 1:n) { for(j in 1:n) { if(j != i) { for(tt in 1:m) { for(r in 1:m) { if(tt >= r) { acum2 = acum2 + abs(x[((i - 1) * n + j) + ((n^2) * (r - 1))] - x[((i - 1) * n + j) + ((n^2) * (tt - 1))]); } } } } } }; acum2 = acum2 * (2 / ((n * m) * (m - 1) * (n - 1))); return (c(experts, acum2)); };';
|
|
|
|
rengine = ase.evalCode('R', ineq1);
|
|
|
|
var preferencesSize = 'psize = length(preferencesR)'
|
|
ase.evalCode('R', preferencesSize);
|
|
|
|
var constraintsLB = 'ineqLBCons = c(rep(0,m), rep(0,1))'
|
|
ase.evalCode('R', constraintsLB);
|
|
|
|
var inverseCL = Math.round((1 - cl) * 100) / 100;
|
|
var invclAux = 'invCL = '+inverseCL+';';
|
|
ase.evalCode('R', invclAux);
|
|
|
|
var inverseCCL = Math.round((1 - ccl) * 100) / 100;
|
|
var invcclAux = 'invCCL = '+inverseCCL+';';
|
|
ase.evalCode('R', invcclAux);
|
|
|
|
var constraintsUB = 'ineqUBCons = c(rep(invCL,m), rep(invCCL,1))'
|
|
rengine = ase.evalCode('R', constraintsUB);
|
|
|
|
var solnp ='sol = try(solnp(preferencesR, fun = fn1, eqfun = eq1, eqB = c(rep(1, m * ((n * (n - 1)) / 2)), rep(0.5, n * m)) , ineqfun = ineq1, ineqLB = c(rep(0, m), 0), ineqUB = c(rep(invCL, m), invCCL), LB = rep(0, length(preferencesR)), UB = rep(Inf, length(preferencesR)), control = list(delta = 0.01, tol = 0.01)));';
|
|
var rengineSolnp = ase.evalCode('R', solnp);
|
|
|
|
rengine = ase.evalCode('R', 'class(sol)');
|
|
if ((rengine.asString()).equals("try-error")) {
|
|
print(rengineSolnp.asString());
|
|
}
|
|
|
|
var resultsSize = 'resultSize = length(sol$pars);';
|
|
rengine = ase.evalCode('R', resultsSize);
|
|
|
|
var preferencesArray = consensus.transformResults(rengine, numExperts);
|
|
|
|
var fprsRound = new ArrayList();
|
|
var fprRound;
|
|
var pr;
|
|
for(var k = 0; k < numExperts; k++) {
|
|
fprRound = new FPR(numAlternatives);
|
|
fprsRound.add(fprRound);
|
|
for(var i = 0; i < (numAlternatives - 1); i++) {
|
|
for(var j = i + 1; j < numAlternatives; j++) {
|
|
pr = preferencesArray[k];
|
|
fprRound.setValueSymmetrically(i | 0, j | 0, pr[(i * numAlternatives + j)]);
|
|
}
|
|
}
|
|
}
|
|
|
|
return fprsRound;
|
|
}
|
|
|
|
consensus.groupPreferences = function groupPreferences(experts, alternatives, preferences) {
|
|
|
|
if(preferences.length % experts != 0){
|
|
var pref=[];
|
|
for(var i=0;i < experts;i++){
|
|
pref.push(preferences[i]);
|
|
}
|
|
preferences = [];
|
|
preferences = pref;
|
|
}
|
|
|
|
if(preferences.length == experts){
|
|
return consensus.group(experts, alternatives, preferences);
|
|
} else {
|
|
var result =[];
|
|
var numCriteria=preferences.length/experts;
|
|
for(var c=0;c<numCriteria;c++){
|
|
result[c]=new FPR(alternatives);
|
|
for (var i = 0; i < (alternatives - 1); i++) {
|
|
for (var j = i+1; j < alternatives; j++) {
|
|
var aux = 0;
|
|
for (var expert = 0; expert < experts; expert++) {
|
|
var k=(expert*numCriteria)+c;
|
|
aux += (Math.round(preferences[k].getValue(i | 0, j | 0)*10000)/10000);
|
|
}
|
|
aux /= experts;
|
|
result[c].setValueSymmetrically(i | 0, j | 0, aux);
|
|
}
|
|
}
|
|
}
|
|
return consensus.group(numCriteria, alternatives, result);
|
|
}
|
|
}
|
|
|
|
consensus.group = function group(experts, alternatives, preferences){
|
|
var result = new FPR(alternatives);
|
|
var aux;
|
|
|
|
for (var i = 0; i < (alternatives - 1); i++) {
|
|
for (var j = i+1; j < alternatives; j++) {
|
|
aux = 0;
|
|
for (var expert = 0; expert < experts; expert++) {
|
|
aux += (Math.round(preferences[expert].getValue(i | 0, j | 0)*10000)/10000);
|
|
}
|
|
aux /= experts;
|
|
result.setValueSymmetrically(i | 0, j | 0, (Math.round(aux*10000)/10000));
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
consensus.groupPreferencesMPR = function groupPreferences(experts, alternatives, preferences) {
|
|
|
|
if(preferences.length%experts !=0){
|
|
var pref=[];
|
|
for(var i=0;i<experts;i++){
|
|
pref.push(preferences[i]);
|
|
}
|
|
preferences=[];
|
|
preferences=pref;
|
|
}
|
|
|
|
if(preferences.length==experts){
|
|
return consensus.groupMPR(experts, alternatives, preferences);
|
|
} else {
|
|
var result =[];
|
|
var numCriteria=preferences.length/experts;
|
|
for(var c=0;c<numCriteria;c++){
|
|
result[c]=new MPR(alternatives);
|
|
for (var i = 0; i < (alternatives ); i++) {
|
|
for (var j = 0; j < alternatives; j++) {
|
|
var aux = 0;
|
|
for (var expert = 0; expert < experts; expert++) {
|
|
var k=(expert*numCriteria)+c;
|
|
aux += (Math.round(preferences[k].getValue(i | 0, j | 0)*10000)/10000);
|
|
}
|
|
aux /= experts;
|
|
result[c].setValueToPairOfAlternatives(i | 0, j | 0, aux);
|
|
}
|
|
}
|
|
}
|
|
return consensus.groupMPR(numCriteria, alternatives, result);
|
|
}
|
|
}
|
|
|
|
consensus.groupMPR=function(experts, alternatives, preferences){
|
|
var result = new MPR(alternatives);
|
|
var aux;
|
|
for (var i = 0; i < (alternatives); i++) {
|
|
for (var j = 0; j < alternatives; j++) {
|
|
aux = 0;
|
|
for (var expert = 0; expert < experts; expert++) {
|
|
aux += (Math.round(preferences[expert].getValue(i | 0, j | 0)*10000)/10000);
|
|
}
|
|
aux /= experts;
|
|
result.setValueToPairOfAlternatives(i | 0, j | 0, (Math.round(aux*10000)/10000));
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|
|
/*
|
|
consensus.HierarchicalClustering(hpr,numElements)
|
|
Recibe un array de elementos(hpr)
|
|
Numero de cluster a obtener(numElements)
|
|
|
|
Devuelve una matriz con dos filas y tantas columnas como elementos tenga hpr.
|
|
En la fila 0 de la matriz obtenemos a que cluster pertenece cada elemento de la fila 1
|
|
|
|
Ejemplo:
|
|
|
|
matriz[0] = 1,1,1,2,2,2,2,3,3,3, 4, 4, 4
|
|
matriz[1] = 9,8,7,6,5,4,3,2,1,10,11,12,13
|
|
|
|
Esto quiere decir que:
|
|
el elemento 9 del array hpr esta en el cluster 1
|
|
el elemento 8 del array hpr esta en el cluster 1
|
|
...
|
|
el elemento 6 del array hpr esta en el cluster 2
|
|
...
|
|
el elemento 11 del array hpr esta en el cluster 4
|
|
|
|
*/
|
|
consensus.HierarchicalClustering = function HierarchicalClustering(hpr,numElements){
|
|
var stringData="";
|
|
var preferencesArray=[];
|
|
var numElements=Math.round(numElements);
|
|
var prefR='preferences =c(';
|
|
|
|
for(var i=0;i<hpr.length;i++){
|
|
prefR+=Math.round(hpr[i]*100)/100;
|
|
if(i!=hpr.length-1){
|
|
prefR+=',';
|
|
|
|
}
|
|
}
|
|
prefR+=');';
|
|
|
|
rengine = ase.evalCode('R', prefR);
|
|
|
|
var distance = 'd = dist(preferences,method="euclidean");';
|
|
rengine = ase.evalCode('R', distance);
|
|
|
|
var clusters='clusters = hclust(d,method="ward.D")';
|
|
rengine = ase.evalCode('R', clusters);
|
|
|
|
var cut = 'groups = cutree(clusters,k='+numElements+')';
|
|
rengine = ase.evalCode('R', cut);
|
|
|
|
var elementsCl = 'elementsCl<-groups[clusters$order]';
|
|
rengine = ase.evalCode('R', elementsCl);
|
|
|
|
var arrayECluster=consensus.transformResultsInteger('elementsCl',hpr.length);
|
|
var elementsO = 'clusters$order';
|
|
var elementsOrder = consensus.transformResultsInteger(elementsO,hpr.length);
|
|
|
|
var result=[];
|
|
result[0]=[];
|
|
result[1]=[];
|
|
for(var i=0;i<hpr.length;i++){
|
|
result[0][i]=arrayECluster[i]-1;
|
|
result[1][i]=elementsOrder[i]-1;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
consensus.transformResultsInteger = function transformResultsInteger(funcR,numE) {
|
|
var fin;
|
|
var stringData = "";
|
|
var fl;
|
|
var preferenceArray = [];
|
|
for(var r = 1; r <= numE; r++) {
|
|
fin = funcR+'['+ r +']';
|
|
rengine = ase.evalCode('R', fin);
|
|
stringData = "" + rengine;
|
|
stringData = stringData.replace("[INT* ", "");
|
|
stringData = stringData.replace("]", "");
|
|
stringData = stringData.replace("(", "");
|
|
stringData = stringData.replace(")", "");
|
|
|
|
fl= Math.round(parseFloat(stringData));
|
|
preferenceArray.push(fl);
|
|
}
|
|
return preferenceArray;
|
|
}
|
|
|
|
|
|
|
|
|
|
consensus
|
|
</code>
|
|
</snippet> |