From e2b05e2cc4e56b407662f19040405e6d974c5b1f Mon Sep 17 00:00:00 2001
From: BrunoDatoMeneses <bruno.dato.meneses@gmail.com>
Date: Mon, 13 Jan 2020 18:27:29 +0100
Subject: [PATCH] ADD: volume for best context selection

---
 AMOEBAonAMAK/src/agents/context/Context.java |  12 +-
 AMOEBAonAMAK/src/agents/context/Range.java   |  53 +++--
 AMOEBAonAMAK/src/agents/head/Head.java       | 235 ++++++++++---------
 AMOEBAonAMAK/src/kernel/World.java           |   2 +-
 4 files changed, 162 insertions(+), 140 deletions(-)

diff --git a/AMOEBAonAMAK/src/agents/context/Context.java b/AMOEBAonAMAK/src/agents/context/Context.java
index db891d06..7dcef4ea 100644
--- a/AMOEBAonAMAK/src/agents/context/Context.java
+++ b/AMOEBAonAMAK/src/agents/context/Context.java
@@ -119,7 +119,7 @@ public class Context extends AmoebaAgent {
 			if(getAmas().getHeadAgent().activatedNeighborsContexts.size()>0) {
 				getAmas().getEnvironment()
 				.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("Range creation by mean", this.getName(), p.getName(), getAmas().getHeadAgent().meanNeighborhoodRaduises.get(p).toString())));
-				r = new Range(this, p.getValue() - getAmas().getHeadAgent().meanNeighborhoodRaduises.get(p), p.getValue() + getAmas().getHeadAgent().meanNeighborhoodRaduises.get(p), 0, true, true, p, getAmas().getHeadAgent().meanNeighborhoodStartIncrements.get(p), getAmas().getHeadAgent().meanNeighborhoodEndIncrements.get(p));
+				r = new Range(this, p.getValue() - getAmas().getHeadAgent().minMeanNeighborhoodRaduises, p.getValue() + getAmas().getHeadAgent().minMeanNeighborhoodRaduises, 0, true, true, p, getAmas().getHeadAgent().minMeanNeighborhoodStartIncrements, getAmas().getHeadAgent().minMeanNeighborhoodEndIncrements);
 			}else {
 				r = new Range(this, p.getValue() - radiuses.getA(), p.getValue() + radiuses.getB(), 0, true, true, p);
 				getAmas().getEnvironment()
@@ -201,7 +201,7 @@ public class Context extends AmoebaAgent {
 			if(getAmas().getHeadAgent().activatedNeighborsContexts.size()>0) {
 				getAmas().getEnvironment()
 				.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("Range creation by mean", this.getName(), p.getName(), getAmas().getHeadAgent().meanNeighborhoodRaduises.get(p).toString())));
-				r = new Range(this, p.getValue() - getAmas().getHeadAgent().meanNeighborhoodRaduises.get(p), p.getValue() + getAmas().getHeadAgent().meanNeighborhoodRaduises.get(p), 0, true, true, p, getAmas().getHeadAgent().meanNeighborhoodStartIncrements.get(p), getAmas().getHeadAgent().meanNeighborhoodEndIncrements.get(p));
+				r = new Range(this, p.getValue() - getAmas().getHeadAgent().minMeanNeighborhoodRaduises, p.getValue() + getAmas().getHeadAgent().minMeanNeighborhoodRaduises, 0, true, true, p, getAmas().getHeadAgent().minMeanNeighborhoodStartIncrements, getAmas().getHeadAgent().minMeanNeighborhoodEndIncrements);
 			}else {
 				r = new Range(this, p.getValue() - radiuses.getA(), p.getValue() + radiuses.getB(), 0, true, true, p);
 				getAmas().getEnvironment()
@@ -785,7 +785,7 @@ public class Context extends AmoebaAgent {
 			this.getRanges().get(pct).setStart(Math.min(this.getRanges().get(pct).getStart(), fusionContext.getRanges().get(pct).getStart()));
 		}
 		
-		this.setConfidence(Math.max(this.getConfidence(), fusionContext.getConfidence()));
+		this.setConfidence(2*Math.max(this.getConfidence(), fusionContext.getConfidence()));
 		regressionPerformance.setPerformanceIndicator(Math.max(this.regressionPerformance.getPerformanceIndicator(), fusionContext.regressionPerformance.getPerformanceIndicator()));
 		
 		
@@ -889,7 +889,7 @@ public class Context extends AmoebaAgent {
 //			ranges.get(p).adapt(p.getValue()); 
 //		}
 
-		ranges.get(p).adapt(p.getValue());
+		ranges.get(p).adapt(p.getValue(), false, null);
 
 //		if(perceptForAdapatationAndOverlapingContext.getB()!=null) {
 //			if(testIfOtherContextShouldFinalyShrink(perceptForAdapatationAndOverlapingContext.getB(), perceptForAdapatationAndOverlapingContext.getA())){
@@ -1220,7 +1220,7 @@ public class Context extends AmoebaAgent {
 			getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList(this.getName(), "CONTAINED", ""+contain)));
 			if (!contain && !fusionned) {
 				if(ranges.get(pct).getLenght()<pct.getMappingErrorAllowedMax()) {
-					ranges.get(pct).adapt(pct.getValue());
+					ranges.get(pct).adapt(pct.getValue(), false, null);
 				}
 				
 				//ranges.get(pct).extend(pct.getValue(), pct);
@@ -1245,7 +1245,7 @@ public class Context extends AmoebaAgent {
 		} else {
 
 
-			ranges.get(perceptWithBiggerImpactOnOverlap).adapt(perceptWithBiggerImpactOnOverlap.getValue());
+			ranges.get(perceptWithBiggerImpactOnOverlap).adapt(perceptWithBiggerImpactOnOverlap.getValue(), true, bestContext);
 
 		}
 	}
diff --git a/AMOEBAonAMAK/src/agents/context/Range.java b/AMOEBAonAMAK/src/agents/context/Range.java
index a40fd60b..25ba066f 100644
--- a/AMOEBAonAMAK/src/agents/context/Range.java
+++ b/AMOEBAonAMAK/src/agents/context/Range.java
@@ -217,12 +217,12 @@ public class Range implements Serializable, Comparable, Cloneable {
 	 * @param oracleValue the oracle value
 	 * @param p           the p
 	 */
-	public void adapt(Double oracleValue, double increment) {
+	public void adapt(Double oracleValue, double increment, boolean isOverlap, Context bestContext) {
 		if (!isPerceptEnum()) {
 
 			double minIncrement = Math.min(increment, getIncrement());
 
-			staticAdapt(oracleValue, minIncrement);
+			staticAdapt(oracleValue, minIncrement, isOverlap, bestContext);
 
 			// adaptUsingAVT(c, oracleValue);
 			// adaptWithoutAVT(c, oracleValue);
@@ -235,10 +235,10 @@ public class Range implements Serializable, Comparable, Cloneable {
 		}
 	}
 
-	public void adapt(Double oracleValue) {
+	public void adapt(Double oracleValue, boolean isOverlap, Context bestContext) {
 		if (!isPerceptEnum()) {
 
-			staticAdapt(oracleValue, getIncrement());
+			staticAdapt(oracleValue, getIncrement(), isOverlap, bestContext);
 
 			// adaptUsingAVT(c, oracleValue);
 			// adaptWithoutAVT(c, oracleValue);
@@ -250,6 +250,8 @@ public class Range implements Serializable, Comparable, Cloneable {
 //			}
 		}
 	}
+	
+	
 
 	/**
 	 * Adapt without AVT.
@@ -310,11 +312,11 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 	}
 
-	private void staticAdapt(double oracleValue, double increment) {
+	private void staticAdapt(double oracleValue, double increment, boolean isOverlap, Context bestContext) {
 		if (Math.abs(end - oracleValue) < Math.abs(oracleValue - start)) {
-			adaptEnd(oracleValue, increment);
+			adaptEnd(oracleValue, increment, isOverlap, bestContext);
 		} else {
-			adaptStart(oracleValue, increment);
+			adaptStart(oracleValue, increment, isOverlap, bestContext);
 		}
 	}
 
@@ -399,15 +401,15 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 	}
 
-	private void adaptEnd(double oracleValue, double increment) {
+	private void adaptEnd(double oracleValue, double increment, boolean isOverlap, Context bestContext) {
 		world.trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("INCREMENT ON END ADAPT", context.getName(), percept.getName(), "" + increment )));
 
-		classicEndAdapt(oracleValue, increment);
+		classicEndAdapt(oracleValue, increment, isOverlap, bestContext);
 		// adaptEndWithSplitting(oracleValue, increment);
 
 	}
 
-	private void classicEndAdapt(double oracleValue, double increment) {
+	private void classicEndAdapt(double oracleValue, double increment, boolean isOverlap, Context bestContext) {
 		if (!(contains(oracleValue) == 0.0)) { // value not contained --> end range will grow (growing direction = 1)
 
 			if (lastEndDirection == -1) { // opposite direction -> negative feedback
@@ -424,7 +426,10 @@ public class Range implements Serializable, Comparable, Cloneable {
 				// endIncrement *=2;
 			}
 
+			
 			this.setEnd(end + endIncrement);
+			
+			
 		} else { // value contained --> end range will shrink (shrinking direction = -1)
 
 			if (lastEndDirection == 1) { // opposite direction -> negative feedback
@@ -441,7 +446,12 @@ public class Range implements Serializable, Comparable, Cloneable {
 				// endIncrement *=2;
 			}
 
-			this.setEnd(end - endIncrement);
+			if(isOverlap) {
+				this.setEnd(bestContext.getRanges().get(this.percept).getStart());
+			}else {
+				this.setEnd(end - endIncrement);
+			}
+			
 
 		}
 
@@ -570,16 +580,16 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 	}
 
-	private void adaptStart(double oracleValue, double increment) {
+	private void adaptStart(double oracleValue, double increment, boolean isOverlap, Context bestContext) {
 		world.trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("INCREMENT ON END ADAPT", context.getName(), percept.getName(), "" + increment )));
 
 
-		classicStartAdapt(oracleValue, increment);
+		classicStartAdapt(oracleValue, increment, isOverlap, bestContext);
 		// adaptStartWithSplitting(oracleValue, increment);
 
 	}
 
-	private void classicStartAdapt(double oracleValue, double increment) {
+	private void classicStartAdapt(double oracleValue, double increment, boolean isOverlap, Context bestContext) {
 		if (!(contains(oracleValue) == 0.0)) {
 
 			if (lastStartDirection == -1) {
@@ -635,7 +645,12 @@ public class Range implements Serializable, Comparable, Cloneable {
 //					startIncrement 
 //					);
 
-			this.setStart(start + startIncrement);
+			
+			if(isOverlap) {
+				this.setStart(bestContext.getRanges().get(this.percept).getEnd());
+			}else {
+				this.setStart(start + startIncrement);
+			}
 		}
 
 		// this.setStart(start + getIncrementDependingOnNeighboorDistances("start"));
@@ -1022,16 +1037,16 @@ public class Range implements Serializable, Comparable, Cloneable {
 		if (overlapDistance(overlappingContextRanges) > nonOverlapDistance(overlappingContextRanges)) {
 
 			if (Math.abs(end - border) > Math.abs(border - start)) {
-				adaptEnd(border, increment);
+				adaptEnd(border, increment, false, null);
 			} else {
-				adaptStart(border, increment);
+				adaptStart(border, increment, false, null);
 			}
 
 		} else {
 			if (Math.abs(end - border) < Math.abs(border - start)) {
-				adaptEnd(border, increment);
+				adaptEnd(border, increment, false, null);
 			} else {
-				adaptStart(border, increment);
+				adaptStart(border, increment, false, null);
 			}
 		}
 
diff --git a/AMOEBAonAMAK/src/agents/head/Head.java b/AMOEBAonAMAK/src/agents/head/Head.java
index 154f21ab..2a82381f 100644
--- a/AMOEBAonAMAK/src/agents/head/Head.java
+++ b/AMOEBAonAMAK/src/agents/head/Head.java
@@ -47,6 +47,10 @@ public class Head extends AmoebaAgent {
 	public HashMap<Percept, Double> meanNeighborhoodStartIncrements;
 	public HashMap<Percept, Double> meanNeighborhoodEndIncrements;
 	
+	public Double minMeanNeighborhoodRaduises = null;
+	public Double minMeanNeighborhoodStartIncrements = null;
+	public Double minMeanNeighborhoodEndIncrements = null;
+	
 
 	Queue<EndogenousRequest> endogenousRequests = new PriorityQueue<EndogenousRequest>(new Comparator<EndogenousRequest>(){
 		   public int compare(EndogenousRequest r1, EndogenousRequest r2) {
@@ -90,6 +94,10 @@ public class Head extends AmoebaAgent {
 		meanNeighborhoodEndIncrements = null; 
 		meanNeighborhoodStartIncrements = null; 
 		
+		minMeanNeighborhoodRaduises = Double.POSITIVE_INFINITY;
+		minMeanNeighborhoodStartIncrements = Double.POSITIVE_INFINITY;
+		minMeanNeighborhoodEndIncrements = Double.POSITIVE_INFINITY;
+		
 		getAmas().data.currentCriticalityPrediction = 0;
 		getAmas().data.currentCriticalityMapping = 0;
 		getAmas().data.currentCriticalityConfidence = 0;
@@ -108,6 +116,97 @@ public class Head extends AmoebaAgent {
 		/* The head memorize last used context agent */
 		lastUsedContext = bestContext;
 		bestContext = null;
+		
+		/* Neighbors */
+
+				
+		double neighborhoodVolumesSum = 0;
+		HashMap<Percept,Double> neighborhoodRangesSums = new HashMap<Percept,Double>();
+		HashMap<Percept,Double> neighborhoodStartIncrementSums = new HashMap<Percept,Double>();
+		HashMap<Percept,Double> neighborhoodEndIncrementSums = new HashMap<Percept,Double>();
+		for (Percept pct : getAmas().getPercepts()) {
+			neighborhoodRangesSums.put(pct, 0.0);
+			neighborhoodStartIncrementSums.put(pct, 0.0);
+			neighborhoodEndIncrementSums.put(pct, 0.0);
+		}
+		
+		
+		
+		if(activatedNeighborsContexts.size()>0) {
+			
+			System.out.println(activatedNeighborsContexts);
+			
+			for (Context ctxt : activatedNeighborsContexts) {
+				
+				neighborhoodVolumesSum += ctxt.getVolume();
+				
+				for (Percept pct : ctxt.getRanges().keySet()) {
+					Double oldRadiusSum = neighborhoodRangesSums.get(pct);
+					Double oldStartIncrSum = neighborhoodStartIncrementSums.get(pct);
+					Double oldEndIncrSum = neighborhoodEndIncrementSums.get(pct);
+					neighborhoodRangesSums.put(pct, oldRadiusSum + ctxt.getRanges().get(pct).getRadius());
+					neighborhoodStartIncrementSums.put(pct, oldStartIncrSum + ctxt.getRanges().get(pct).getStartIncrement());
+					neighborhoodEndIncrementSums.put(pct, oldEndIncrSum + ctxt.getRanges().get(pct).getEndIncrement());
+				}
+
+				
+			}
+	
+		meanNeighborhoodVolume = neighborhoodVolumesSum / activatedNeighborsContexts.size();
+		
+		meanNeighborhoodRaduises = new HashMap<Percept, Double>();
+		meanNeighborhoodStartIncrements = new HashMap<Percept, Double>();
+		meanNeighborhoodEndIncrements = new HashMap<Percept, Double>();
+		
+		
+		for (Percept pct : getAmas().getPercepts()) {
+			
+			
+			double meanRadius = neighborhoodRangesSums.get(pct)/activatedNeighborsContexts.size();
+			double meanStartIncrement = neighborhoodStartIncrementSums.get(pct)/activatedNeighborsContexts.size();
+			double meanEndIncrement = neighborhoodEndIncrementSums.get(pct)/activatedNeighborsContexts.size();
+			meanNeighborhoodRaduises.put(pct, meanRadius);
+			meanNeighborhoodStartIncrements.put(pct, meanStartIncrement);
+			meanNeighborhoodEndIncrements.put(pct, meanEndIncrement);
+			
+			if(meanRadius < minMeanNeighborhoodRaduises) {
+				minMeanNeighborhoodRaduises = meanRadius;
+			}
+			if(meanStartIncrement < minMeanNeighborhoodStartIncrements) {
+				minMeanNeighborhoodStartIncrements = meanStartIncrement;
+			}
+			if(meanEndIncrement < minMeanNeighborhoodEndIncrements) {
+				minMeanNeighborhoodEndIncrements = meanEndIncrement;
+			}
+			
+			
+		}
+			
+		
+			
+			
+			getAmas().getEnvironment()
+			.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "size", ""+activatedNeighborsContexts.size())));
+			getAmas().getEnvironment()
+			.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodVolume", ""+meanNeighborhoodVolume)));
+			getAmas().getEnvironment()
+			.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodRaduises", ""+meanNeighborhoodRaduises)));
+			getAmas().getEnvironment()
+			.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodStartIncrements", ""+meanNeighborhoodStartIncrements)));
+			getAmas().getEnvironment()
+			.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodEndIncrements", ""+meanNeighborhoodEndIncrements)));
+			getAmas().getEnvironment()
+			.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "minMeanNeighborhoodRaduises", ""+minMeanNeighborhoodRaduises)));
+			getAmas().getEnvironment()
+			.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "minMeanNeighborhoodStartIncrements", ""+minMeanNeighborhoodStartIncrements)));
+			getAmas().getEnvironment()
+			.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "minMeanNeighborhoodEndIncrements", ""+minMeanNeighborhoodEndIncrements)));
+		}
+			
+			
+			
+			
+
 
 		if (getAmas().data.useOracle) {
 			playWithOracle();
@@ -128,30 +227,19 @@ public class Head extends AmoebaAgent {
 			
 			int nb=0;
 			Double meanNeighborsLastPredictions = null;
-			double neighborhoodVolumesSum = 0;
-			HashMap<Percept,Double> neighborhoodRangesSums = new HashMap<Percept,Double>();
-			HashMap<Percept,Double> neighborhoodStartIncrementSums = new HashMap<Percept,Double>();
-			HashMap<Percept,Double> neighborhoodEndIncrementSums = new HashMap<Percept,Double>();
-			for (Percept pct : getAmas().getPercepts()) {
-				neighborhoodRangesSums.put(pct, 0.0);
-				neighborhoodStartIncrementSums.put(pct, 0.0);
-				neighborhoodEndIncrementSums.put(pct, 0.0);
-			}
+			
+			
+			
 			
 			
 			ArrayList<Context> usedNeighbors = new ArrayList<Context>();
 			
-			if(activatedNeighborsContexts.size()>0) { ////////////// TODO no good version
+			if(activatedNeighborsContexts.size()>0) { 
 				
 				meanNeighborsLastPredictions = 0.0;
 				for (Context ctxt : activatedNeighborsContexts) {
 					
-					neighborhoodVolumesSum += ctxt.getVolume();
-					for (Percept pct : ctxt.getRanges().keySet()) {
-						neighborhoodRangesSums.put(pct, neighborhoodRangesSums.get(pct) + ctxt.getRanges().get(pct).getRadius());
-						neighborhoodStartIncrementSums.put(pct, neighborhoodStartIncrementSums.get(pct) + ctxt.getRanges().get(pct).getStartIncrement());
-						neighborhoodEndIncrementSums.put(pct, neighborhoodEndIncrementSums.get(pct) + ctxt.getRanges().get(pct).getEndIncrement());
-					}
+					
 
 					if(ctxt.lastPrediction != null) {
 						usedNeighbors.add(ctxt);
@@ -165,27 +253,16 @@ public class Head extends AmoebaAgent {
 				else {
 					meanNeighborsLastPredictions = null;
 				}
-				meanNeighborhoodVolume = neighborhoodVolumesSum / activatedNeighborsContexts.size();
 				
-				meanNeighborhoodRaduises = new HashMap<Percept, Double>();
-				for (Percept pct : getAmas().getPercepts()) {
-					meanNeighborhoodRaduises.put(pct, neighborhoodRangesSums.get(pct)/activatedNeighborsContexts.size());
-					meanNeighborhoodStartIncrements.put(pct, neighborhoodStartIncrementSums.get(pct)/activatedNeighborsContexts.size());
-					meanNeighborhoodEndIncrements.put(pct, neighborhoodEndIncrementSums.get(pct)/activatedNeighborsContexts.size());
-				}
+				
+				
+				
 				
 				
 			}
 			
 			
-			getAmas().getEnvironment()
-			.trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodVolume", meanNeighborhoodVolume.toString())));
-			getAmas().getEnvironment()
-			.trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodRaduises", meanNeighborhoodRaduises.toString())));
-			getAmas().getEnvironment()
-			.trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodStartIncrements", meanNeighborhoodStartIncrements.toString())));
-			getAmas().getEnvironment()
-			.trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodEndIncrements", meanNeighborhoodEndIncrements.toString())));
+			
 			
 			if(meanNeighborsLastPredictions != null) {
 //				System.out.println("####################### NEIGHBORS #############################");
@@ -210,78 +287,7 @@ public class Head extends AmoebaAgent {
 			
 			
 		}
-		else {
-			
-			
-			double neighborhoodVolumesSum = 0;
-			HashMap<Percept,Double> neighborhoodRangesSums = new HashMap<Percept,Double>();
-			HashMap<Percept,Double> neighborhoodStartIncrementSums = new HashMap<Percept,Double>();
-			HashMap<Percept,Double> neighborhoodEndIncrementSums = new HashMap<Percept,Double>();
-			for (Percept pct : getAmas().getPercepts()) {
-				neighborhoodRangesSums.put(pct, 0.0);
-				neighborhoodStartIncrementSums.put(pct, 0.0);
-				neighborhoodEndIncrementSums.put(pct, 0.0);
-			}
-			
-			
-			
-			if(activatedNeighborsContexts.size()>0) {
-				
-				System.out.println(activatedNeighborsContexts);
-				
-				for (Context ctxt : activatedNeighborsContexts) {
-					
-					neighborhoodVolumesSum += ctxt.getVolume();
-					
-					for (Percept pct : ctxt.getRanges().keySet()) {
-						Double oldRadiusSum = neighborhoodRangesSums.get(pct);
-						Double oldStartIncrSum = neighborhoodStartIncrementSums.get(pct);
-						Double oldEndIncrSum = neighborhoodEndIncrementSums.get(pct);
-						neighborhoodRangesSums.put(pct, oldRadiusSum + ctxt.getRanges().get(pct).getRadius());
-						neighborhoodStartIncrementSums.put(pct, oldStartIncrSum + ctxt.getRanges().get(pct).getStartIncrement());
-						neighborhoodEndIncrementSums.put(pct, oldEndIncrSum + ctxt.getRanges().get(pct).getEndIncrement());
-					}
-
-					
-				}
 		
-			meanNeighborhoodVolume = neighborhoodVolumesSum / activatedNeighborsContexts.size();
-			
-			meanNeighborhoodRaduises = new HashMap<Percept, Double>();
-			meanNeighborhoodStartIncrements = new HashMap<Percept, Double>();
-			meanNeighborhoodEndIncrements = new HashMap<Percept, Double>();
-			
-			
-			for (Percept pct : getAmas().getPercepts()) {
-				
-				
-				
-				meanNeighborhoodRaduises.put(pct, neighborhoodRangesSums.get(pct)/activatedNeighborsContexts.size());
-				meanNeighborhoodStartIncrements.put(pct, neighborhoodStartIncrementSums.get(pct)/activatedNeighborsContexts.size());
-				meanNeighborhoodEndIncrements.put(pct, neighborhoodEndIncrementSums.get(pct)/activatedNeighborsContexts.size());
-				
-				
-			}
-				
-			
-				
-				
-				getAmas().getEnvironment()
-				.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "size", ""+activatedNeighborsContexts.size())));
-				getAmas().getEnvironment()
-				.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodVolume", ""+meanNeighborhoodVolume)));
-				getAmas().getEnvironment()
-				.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodRaduises", ""+meanNeighborhoodRaduises)));
-				getAmas().getEnvironment()
-				.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodStartIncrements", ""+meanNeighborhoodStartIncrements)));
-				getAmas().getEnvironment()
-				.trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodEndIncrements", ""+meanNeighborhoodEndIncrements)));
-			}
-			
-			
-			
-			
-		}
 		
 		
 		
@@ -295,9 +301,9 @@ public class Head extends AmoebaAgent {
 				+ "---------------------------------------- PLAY WITH ORACLE")));
 		
 		if (activatedContexts.size() > 0) {
-			//selectBestContext(); // using highest confidence
-			selectBestContextWithDistanceToModel(); // using closest distance
-			// selectBestContextWithDistanceToModel();
+			//selectBestContextWithConfidenceAndVolume(); // using highest confidence and volume
+			selectBestContextWithDistanceToModelAndVolume(); // using closest distance and volume
+			
 		} else {
 			bestContext = lastUsedContext;
 		}
@@ -494,7 +500,7 @@ public class Head extends AmoebaAgent {
 
 		logger().debug("HEAD without oracle", "Nombre de contextes activés: " + activatedContexts.size());
 
-		selectBestContext();
+		selectBestContextWithConfidenceAndVolume();
 		if (bestContext != null) {
 			getAmas().data.noBestContext = false;
 			getAmas().data.prediction = bestContext.getActionProposal();
@@ -1536,7 +1542,7 @@ public class Head extends AmoebaAgent {
 	/**
 	 * Select best context.
 	 */
-	private void selectBestContext() {
+	private void selectBestContextWithConfidenceAndVolume() {
 		if(activatedContexts != null && !activatedContexts.isEmpty()) {
 			Context bc;
 	
@@ -1544,9 +1550,10 @@ public class Head extends AmoebaAgent {
 			double currentConfidence = bc.getConfidence();
 
 			for (Context context : activatedContexts) {
-				if (context.getConfidence() > currentConfidence) {
+				double confidenceWithVolume = context.getConfidence()*context.getVolume();
+				if (confidenceWithVolume > currentConfidence) {
 					bc = context;
-					currentConfidence = bc.getConfidence();
+					currentConfidence = confidenceWithVolume;
 				}
 			}
 			bestContext = bc;
@@ -1557,20 +1564,20 @@ public class Head extends AmoebaAgent {
 	
 	
 
-	private void selectBestContextWithDistanceToModel() {
+	private void selectBestContextWithDistanceToModelAndVolume() {
 
 		Context bc;
 
 		bc = activatedContexts.get(0);
 		double distanceToModel = bc.getLocalModel().distance(bc.getCurrentExperiment());
-		double currentDistanceToModel;
+		double currentDistanceToModelWithVolume;
 
 		for (Context context : activatedContexts) {
 
-			currentDistanceToModel = context.getLocalModel().distance(context.getCurrentExperiment());
-			if (currentDistanceToModel < distanceToModel) {
+			currentDistanceToModelWithVolume = context.getLocalModel().distance(context.getCurrentExperiment())/context.getVolume();
+			if (currentDistanceToModelWithVolume < distanceToModel) {
 				bc = context;
-				distanceToModel = currentDistanceToModel;
+				distanceToModel = currentDistanceToModelWithVolume;
 			}
 		}
 		bestContext = bc;
diff --git a/AMOEBAonAMAK/src/kernel/World.java b/AMOEBAonAMAK/src/kernel/World.java
index c065a4d4..5fe709fe 100644
--- a/AMOEBAonAMAK/src/kernel/World.java
+++ b/AMOEBAonAMAK/src/kernel/World.java
@@ -34,7 +34,7 @@ public class World extends Environment {
 	
 	
 	
-	public static TRACE_LEVEL minLevel = TRACE_LEVEL.INFORM;
+	public static TRACE_LEVEL minLevel = TRACE_LEVEL.DEBUG;
 	
 	private AMOEBA amoeba;
 
-- 
GitLab