diff --git a/AMOEBAonAMAK/src/agents/context/Context.java b/AMOEBAonAMAK/src/agents/context/Context.java index 7dcef4ead3be7e9d26671174392e869eae04e123..41d7af9ecdc65f0d8a1386e2126fa79c9ad424c9 100644 --- a/AMOEBAonAMAK/src/agents/context/Context.java +++ b/AMOEBAonAMAK/src/agents/context/Context.java @@ -66,6 +66,7 @@ public class Context extends AmoebaAgent { public static final int errorsBeforeAugmentation = 5; public boolean fusionned = false; + public boolean isInNeighborhood = false; public Context(AMOEBA amoeba) { super(amoeba); @@ -218,7 +219,7 @@ public class Context extends AmoebaAgent { //expand(); - this.confidence = bestNearestContext.confidence; + //this.confidence = bestNearestContext.confidence; this.localModel = getAmas().buildLocalModel(this); // this.formulaLocalModel = ((LocalModelMillerRegression) // bestNearestContext.localModel).getFormula(bestNearestContext); @@ -932,6 +933,34 @@ public class Context extends AmoebaAgent { } } } + + + private Percept getPerceptWithLesserImpactOnContext(ArrayList<Percept> percepts) { + + Percept perceptForAdapation = null; + double minDistanceToFrontier = Double.MAX_VALUE; + double distanceToFrontier; + + for (Percept pct : percepts) { + if (!ranges.get(pct).isPerceptEnum()) { + + distanceToFrontier = Math.min(ranges.get(pct).startDistance(pct.getValue()), + ranges.get(pct).endDistance(pct.getValue())); + + for(Percept otherPct : percepts) { + if(otherPct != pct) { + distanceToFrontier*= this.getRanges().get(otherPct).getLenght(); + } + } + + if (distanceToFrontier < minDistanceToFrontier) { + minDistanceToFrontier = distanceToFrontier; + perceptForAdapation = pct; + } + } + } + return perceptForAdapation; + } private Percept getPerceptWithBiggerImpactOnOverlap(ArrayList<Percept> percepts, Context bestContext) { Percept perceptWithBiggerImpact = null; @@ -989,7 +1018,8 @@ public class Context extends AmoebaAgent { } private Pair<Percept, Context> getPerceptForAdaptationWithOverlapingContext(ArrayList<Percept> percepts) { - Percept perceptForAdapation = null; + Percept perceptForBigerImpactOnOverlap = null; + Percept perceptWithLesserImpactOnContext = null; Context overlapingContext = null; double minDistanceToFrontier = Double.MAX_VALUE; double distanceToFrontier; @@ -1005,29 +1035,34 @@ public class Context extends AmoebaAgent { } else { overlappingVolume = this.getOverlappingVolume(ctxt); if (overlappingVolume > maxOverlappingVolume) { - perceptForAdapation = getPerceptWithBiggerImpactOnOverlap(percepts, ctxt); + overlapingContext = ctxt; } } } } + + if(overlapingContext != null) { + perceptForBigerImpactOnOverlap = getPerceptWithBiggerImpactOnOverlap(percepts, overlapingContext); + + } + } - if (perceptForAdapation == null) { - for (Percept pct : percepts) { - if (!ranges.get(pct).isPerceptEnum()) { - - distanceToFrontier = Math.min(ranges.get(pct).startDistance(pct.getValue()), - ranges.get(pct).endDistance(pct.getValue())); - - if (distanceToFrontier < minDistanceToFrontier) { - minDistanceToFrontier = distanceToFrontier; - perceptForAdapation = pct; - } - } + + perceptWithLesserImpactOnContext = getPerceptWithLesserImpactOnContext(percepts); + if(perceptForBigerImpactOnOverlap != null) { + + if(perceptForBigerImpactOnOverlap == perceptWithLesserImpactOnContext) { + return new Pair<Percept, Context>(perceptForBigerImpactOnOverlap, overlapingContext); } + } + + return new Pair<Percept, Context>(perceptWithLesserImpactOnContext, overlapingContext); + + - return new Pair<Percept, Context>(perceptForAdapation, overlapingContext); + } public boolean containedBy(Context ctxt) { @@ -1238,14 +1273,21 @@ public class Context extends AmoebaAgent { public void shrinkRangesToJoinBorders(Context bestContext) { Percept perceptWithBiggerImpactOnOverlap = getPerceptWithBiggerImpactOnOverlap(getAmas().getPercepts(), bestContext); + + Percept perceptWithLesserImpactOnContext = getPerceptWithLesserImpactOnContext(getAmas().getPercepts()); if (perceptWithBiggerImpactOnOverlap == null) { this.destroy(); } else { + if(perceptWithBiggerImpactOnOverlap == perceptWithLesserImpactOnContext) { + ranges.get(perceptWithBiggerImpactOnOverlap).adapt(perceptWithBiggerImpactOnOverlap.getValue(), true, bestContext); + }else { + ranges.get(perceptWithLesserImpactOnContext).adapt(perceptWithLesserImpactOnContext.getValue(), true, bestContext); + } - ranges.get(perceptWithBiggerImpactOnOverlap).adapt(perceptWithBiggerImpactOnOverlap.getValue(), true, bestContext); + } } diff --git a/AMOEBAonAMAK/src/agents/head/Head.java b/AMOEBAonAMAK/src/agents/head/Head.java index 2a82381fd87df5290162571370e3a7f12f51f3e5..625e54154606cc659fe13c5b5be460b9c237c084 100644 --- a/AMOEBAonAMAK/src/agents/head/Head.java +++ b/AMOEBAonAMAK/src/agents/head/Head.java @@ -138,6 +138,7 @@ public class Head extends AmoebaAgent { for (Context ctxt : activatedNeighborsContexts) { + ctxt.isInNeighborhood = true; neighborhoodVolumesSum += ctxt.getVolume(); for (Percept pct : ctxt.getRanges().keySet()) { @@ -1575,6 +1576,7 @@ public class Head extends AmoebaAgent { for (Context context : activatedContexts) { currentDistanceToModelWithVolume = context.getLocalModel().distance(context.getCurrentExperiment())/context.getVolume(); + getEnvironment().trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("DISTANCE / VOLUME ", context.getName(), ""+currentDistanceToModelWithVolume))); if (currentDistanceToModelWithVolume < distanceToModel) { bc = context; distanceToModel = currentDistanceToModelWithVolume; @@ -2013,6 +2015,9 @@ public class Head extends AmoebaAgent { public void clearAllUseableContextLists() { activatedContexts.clear(); + for (Context ctxt : activatedNeighborsContexts) { + ctxt.isInNeighborhood = false; + } activatedNeighborsContexts.clear(); } diff --git a/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Launcher.java b/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Launcher.java index e45a609046f00935391259c8c64c99004e27b526..3c0ec95825723b5a2eb231d653e20edd38585f97 100644 --- a/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Launcher.java +++ b/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Launcher.java @@ -75,7 +75,8 @@ public class F_N_Launcher extends Application implements Serializable { File file = new File("resources/twoDimensionsLauncher.xml"); backupSystem.load(file); - amoeba.saver = new SaveHelperImpl(amoeba); + amoeba.saver = new SaveHelperImpl(amoeba, amoebaUI); + amoeba.allowGraphicalScheduler(true); amoeba.setRenderUpdate(true); amoeba.data.learningSpeed = learningSpeed; diff --git a/AMOEBAonAMAK/src/gui/ContextRendererFX.java b/AMOEBAonAMAK/src/gui/ContextRendererFX.java index a57e7828e5c88c39c31a04aa007c8e9f93801f6e..f43ea2895ae147bbeeaa4c4affdb49cace739491 100644 --- a/AMOEBAonAMAK/src/gui/ContextRendererFX.java +++ b/AMOEBAonAMAK/src/gui/ContextRendererFX.java @@ -47,7 +47,12 @@ public class ContextRendererFX extends RenderStrategy { private void setColorWithCoefs() { Double[] c = ContextColor.colorFromCoefs(context.getFunction().getCoef()); - drawable.setColor(new Color(c[0], c[1], c[2], 90d / 255d)); + if(context.isInNeighborhood) { + drawable.setColor(new Color(c[0], c[1], c[2], 255d / 255d)); + }else { + drawable.setColor(new Color(c[0], c[1], c[2], 90d / 255d)); + } + } private void setColorWithPrediction() { diff --git a/AMOEBAonAMAK/src/kernel/World.java b/AMOEBAonAMAK/src/kernel/World.java index 5fe709fea42dfd30530f773a93033cd64684e139..c065a4d45e09c4096d630031b43138dc24c51056 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.DEBUG; + public static TRACE_LEVEL minLevel = TRACE_LEVEL.INFORM; private AMOEBA amoeba;