From 77df87dd886262cd87d32a547a837d91cae40e8d Mon Sep 17 00:00:00 2001 From: BrunoDatoMeneses <bruno.dato.meneses@gmail.com> Date: Tue, 14 Jan 2020 18:09:52 +0100 Subject: [PATCH] ADD: less context destruction on resolution --- AMOEBAonAMAK/src/agents/context/Context.java | 76 ++++++++++++++----- AMOEBAonAMAK/src/agents/head/Head.java | 5 ++ .../nDimensionsLaunchers/F_N_Launcher.java | 3 +- AMOEBAonAMAK/src/gui/ContextRendererFX.java | 7 +- AMOEBAonAMAK/src/kernel/World.java | 2 +- 5 files changed, 73 insertions(+), 20 deletions(-) diff --git a/AMOEBAonAMAK/src/agents/context/Context.java b/AMOEBAonAMAK/src/agents/context/Context.java index 7dcef4ea..41d7af9e 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 2a82381f..625e5415 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 e45a6090..3c0ec958 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 a57e7828..f43ea289 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 5fe709fe..c065a4d4 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; -- GitLab