public code v1

This commit is contained in:
2026-05-22 11:14:29 +02:00
parent 427197ec5a
commit b8141736eb
28859 changed files with 575079 additions and 0 deletions
@@ -0,0 +1,319 @@
package afryca.consensusmodel.fen2015;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import afryca.ase.RunnableScript;
import afryca.consensumodel.addon.E4DIAddon;
import afryca.consensusmodel.ConsensusModelMulticriteria;
import afryca.consensusmodel.definition.EResultElements;
import afryca.decisionmatrix.DecisionMatrix;
import afryca.domain.fuzzyset.FuzzySet;
import afryca.structure.Structure;
import afryca.structure.pair.Pair;
import afryca.twotuple.TwoTuple;
public class Fen2015 extends ConsensusModelMulticriteria {
private static final String CONSENSUS_MODEL_NAME = "F. Zou et al. (2015)"; //$NON-NLS-1$
private static final String ZITA = "zita"; //$NON-NLS-1$ //
private static final String LAMBDA = "lambda"; //$NON-NLS-1$
private static final String MAX_ROUNDS = "h_max"; //$NON-NLS-1$
private static final String ALPHA = "alpha"; //$NON-NLS-1$
private Integer zita;
private Float lambda;
private Float alpha;
private Integer h_max;
private FuzzySet blts;
private Integer round;
private Integer currentConsensus;
private DecisionMatrix collective;
private ArrayList<Structure> twoTuplePreferencesDM;
private Map<Integer, List<Map<Pair<Integer, Integer>, Integer>>> betas;
private Structure[] preferencesArray;
@Override
protected void setModelConfiguration() {
}
@Override
protected void obtainConfigurationValues() {
zita = Math.round((Float) configuration.getValue(ZITA));
lambda = (Float) configuration.getValue(LAMBDA);
alpha = (Float) configuration.getValue(ALPHA);
h_max = (Integer) configuration.getValue(MAX_ROUNDS);
betas = new HashMap<>();
round = 0;
transformValuationToTwoTuple();
}
@SuppressWarnings("unchecked")
private void transformValuationToTwoTuple() {
List<Structure> preferencesDM = new ArrayList<Structure>();
for (int i = 0; i < numberOfCriteria * numberOfExperts; i++) {
preferencesDM.add(preferences[i]);
}
ArrayList<Structure> unifiedValuations = (ArrayList<Structure>) ((RunnableScript) E4DIAddon.aseService.createExecutionBuilder().setFunction("Unification")
.putVariable("preferences", preferencesDM).putVariable("blts", getBLTS(preferencesDM)).execute()).getResult();
twoTuplePreferencesDM = (ArrayList<Structure>) ((RunnableScript) E4DIAddon.aseService.createExecutionBuilder().setFunction("Disunification").putVariable("preferences", unifiedValuations)
.execute()).getResult();
}
private FuzzySet getBLTS(List<Structure> preferencesDM) {
return (FuzzySet) E4DIAddon.aseService
.createFragmentBuilder()
.putVariable("preferences", preferencesDM.toArray()) //$NON-NLS-1$
.setCode("unification.getBLTS(preferences)") //$NON-NLS-1$
.setOutputType(FuzzySet.class.getName())
.eval()
.getResult();
}
@Override
protected void preFirstSaveRoundResults() {
computeDistanceDegrees();
Integer currentConsensus = getMinimunDegreeOfSimilarity();
preSaveRoundResult(1, preferencesArray, obtainVisualizeValues(), (float) currentConsensus);
result.put(EResultElements.initial_consensus_degree, currentConsensus);
result.put(EResultElements.maxround, h_max);
result.put(EResultElements.consensus_threshold, zita);
result.put(EResultElements.consensus_model, CONSENSUS_MODEL_NAME);
}
@Override
protected void preSaveRoundResults() {
Integer currentConsensus = getMinimunDegreeOfSimilarity();
preSaveRoundResult(round + 1, preferencesArray, obtainVisualizeValues(), (float) currentConsensus);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private void computeDistanceDegrees() {
DecisionMatrix dm1, dm2;
Integer beta;
Map<Pair<Integer, Integer>, Integer> bValue;
List<Map<Pair<Integer, Integer>, Integer>> b;
betas.clear();
for (int q = 0; q < numberOfExperts; ++q) {
for (int i = 0; i < numberOfCriteria; ++i) {
dm1 = (DecisionMatrix) twoTuplePreferencesDM.get(q * numberOfCriteria + i);
for (int j = 0; j < numberOfAlternatives; ++j) {
beta = 0;
for (int k = 0; k < numberOfExperts; ++k) {
dm2 = (DecisionMatrix) twoTuplePreferencesDM.get(k * numberOfCriteria + i);
beta += computeLambda((TwoTuple) dm1.getValue(0, j), (TwoTuple) dm2.getValue(0, j));
}
if (betas.get(q) != null) {
bValue = new HashMap<>();
bValue.put(new Pair(i, j), beta);
b = betas.get(q);
b.add(bValue);
} else {
bValue = new HashMap<>();
bValue.put(new Pair(i, j), beta);
b = new ArrayList<>();
b.add(bValue);
betas.put(q, b);
}
}
}
}
}
private Integer computeLambda(TwoTuple valuation1, TwoTuple valuation2) {
if (computeSimilarityDegrees(valuation1, valuation2) >= alpha) {
return 0;
} else {
return 1;
}
}
private Integer getMinimunDegreeOfSimilarity() {
Integer beta, betaMax = -1;
for (Integer expert : betas.keySet()) {
List<Map<Pair<Integer, Integer>, Integer>> bValues = betas.get(expert);
for (Map<Pair<Integer, Integer>, Integer> bValue : bValues) {
for (Pair<Integer, Integer> pair : bValue.keySet()) {
beta = bValue.get(pair);
if (beta > zita) {
if (beta > betaMax) {
betaMax = beta;
}
}
}
}
}
if (betaMax == -1) {
currentConsensus = zita.intValue();
betaMax = zita.intValue();
} else {
currentConsensus = betaMax;
}
return betaMax;
}
private DecisionMatrix computeAggregation() {
Structure[] preferecesAux = new Structure[preferences.length - 1];
List<Structure> preferencesDM = new ArrayList<Structure>();
for (int i = 0; i < preferecesAux.length; i++) {
try {
preferecesAux[i] = (Structure) preferences[i].clone();
preferencesDM.add((Structure) preferences[i].clone());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
blts = getBLTS(preferencesDM);
Object[][] collective = (Object[][]) ((RunnableScript) E4DIAddon.aseService.createExecutionBuilder().setFunction("arithmeticAggregationLPR").putVariable("preferences", preferecesAux)
.putVariable("alternatives", numberOfAlternatives).putVariable("criteria", numberOfCriteria).putVariable("experts", numberOfExperts).execute()).getResult();
if ((collective != null)) {
DecisionMatrix result = new DecisionMatrix(numberOfCriteria, numberOfAlternatives);
for (int i = 0; i < numberOfCriteria; i++) {
for (int j = 0; j < numberOfAlternatives; j++) {
result.setDomain(i, j, blts);
}
}
result.prepareStructureForPreferences(collective);
return result;
}
return new DecisionMatrix(numberOfCriteria, numberOfAlternatives);
}
private Float computeSimilarityDegrees(TwoTuple valuation1, TwoTuple valuation2) {
return (float) valuation1.similarityMeasure(valuation2);
}
@Override
protected void consensusRound() {
computeDistanceDegrees();
Integer betaMax = getMinimunDegreeOfSimilarity();
if (betaMax > zita && round < h_max) {
Map<Integer, List<Pair<Integer, Integer>>> expertsToRecommend = getExpertsToRecommend(betaMax);
collective = computeAggregation();
Float delta1, delta2;
for (Integer expert : expertsToRecommend.keySet()) {
List<Pair<Integer, Integer>> pairsToChange = expertsToRecommend.get(expert);
for (Pair<Integer, Integer> pairToChange : pairsToChange) {
delta1 = (float) ((TwoTuple) twoTuplePreferencesDM.get(expert * numberOfCriteria + pairToChange.getLeft()).getValue(0, pairToChange.getRight())).calculateInverseDelta();
delta2 = (float) ((TwoTuple) collective.getValue(pairToChange.getLeft(), pairToChange.getRight())).calculateInverseDelta();
TwoTuple twoTupleModified = new TwoTuple(blts);
twoTupleModified.calculateDelta((float) (Math.pow(delta1, lambda) * Math.pow(delta2, 1 - lambda)));
((DecisionMatrix) twoTuplePreferencesDM.get(expert * numberOfCriteria + pairToChange.getLeft())).setValue(0, pairToChange.getRight(), twoTupleModified);
}
}
round++;
}
}
private Map<Integer, List<Pair<Integer, Integer>>> getExpertsToRecommend(Integer betaMax) {
Integer beta;
Map<Integer, List<Pair<Integer, Integer>>> result = new HashMap<>();
for (Integer expert : betas.keySet()) {
List<Map<Pair<Integer, Integer>, Integer>> bValues = betas.get(expert);
for (Map<Pair<Integer, Integer>, Integer> bValue : bValues) {
for (Pair<Integer, Integer> pair : bValue.keySet()) {
beta = bValue.get(pair);
if (beta == betaMax) {
if (result.get(expert) == null) {
List<Pair<Integer, Integer>> expertP = new ArrayList<>();
expertP.add(pair);
result.put(expert, expertP);
} else {
List<Pair<Integer, Integer>> expertP = result.get(expert);
expertP.add(pair);
}
}
}
}
}
return result;
}
@Override
protected void posSaveRoundResults() {
posSaveRoundResult(preferencesArray, obtainVisualizeValues(), (float) currentConsensus, null);
}
@Override
protected boolean mustBeCarriedOutAnotherRound() {
return (round < h_max) && (currentConsensus > zita);
}
@Override
protected void saveExecutionResults() {
this.configuration.setValue(PREFERENCES, preferencesArray);
result.put(EResultElements.number_of_rounds_required, round);
result.put(EResultElements.consensus_degree_achieved, (float) currentConsensus);
}
@Override
protected void groupPreferencesByCriteria() {
computeDistanceDegrees();
getMinimunDegreeOfSimilarity();
collective = computeAggregation();
preferencesArray = new Structure[numberOfExperts+1];
DecisionMatrix dmExpert, dmByCriterion;
for (int k = 0; k < numberOfExperts; ++k) {
dmExpert = new DecisionMatrix(numberOfCriteria, numberOfAlternatives);
for (int i = 0; i < numberOfCriteria; ++i) {
dmByCriterion = (DecisionMatrix) twoTuplePreferencesDM.get(k * numberOfCriteria + i);
for (int col = 0; col < numberOfAlternatives; ++col) {
dmExpert.setValue(i, col, dmByCriterion.getValue(0, col));
dmExpert.setDomain(i, col, dmByCriterion.getDomain(0, col));
}
}
preferencesArray[k]=dmExpert;
}
preferencesArray[numberOfExperts]=collective;
}
@Override
protected Float[][][] obtainVisualizeValues() {
Float[][][] preferencesGroupVisualization=new Float[preferencesArray.length][numberOfCriteria][numberOfAlternatives];
for (int k = 0; k < preferencesArray.length; k++) {
for (int i = 0; i < numberOfCriteria; i++) {
for (int j = 0; j < numberOfAlternatives; j++) {
preferencesGroupVisualization[k][i][j] = ((TwoTuple) preferencesArray[k].getValue(i,j)).calculateInverseDelta();
}
}
}
return preferencesGroupVisualization;
}
}