public Path run() { Graph graph = new Graph(_xinit, new CircleNode()); //Boolean busy = false; CircleNode node = null; CircleNode newnode = null; bestSoFar = graph.getRandomNode(node); for (int iter = 0; iter < _maxiter; iter++) { node = graph.getRandomNode(node); if (node == null) { return(minimizePath(graph.traceBack(bestSoFar))); } newnode = _tactics.apply(node, _domain, graph); //or only node? if (newnode == null) { continue; } //busy = newnode.isBusy(); if (_validator.validate(newnode, node, _domain, graph)) { graph.addNode(newnode, node, newnode.getState().getAction()); if (newnode.getState().numberOfCollectibles() < bestSoFar.getState().numberOfCollectibles()) { bestSoFar = newnode; } // GOAL ACHIEVED if (newnode.getState().numberOfCollectibles() == 0) { return(minimizePath(graph.traceBack(newnode))); } } //else //{ // //busy = node.isBusy(); // //if (busy) // // graph.rollBack(node); // //busy = false; // if (node.isBusy()) // graph.rollBack(node); //} } return(minimizePath(graph.traceBack(bestSoFar))); }
public override CircleNode apply(CircleNode Xinit, InfoDomain _domain, Graph graph) { bool newState = false; CircleActions cAction = new CircleActions(); int action = 0; State s = null; while (!newState) { if (Xinit.allActionsBusy()) { graph.NonBusyNodes.Remove(Xinit); return(null); } action = cAction.getRandomAction(); switch (action) { case 0: if (!Xinit._busyActions[0]) { float[] newcoordinates = new float[4]; newcoordinates[0] = Xinit.getState().getPosX() - 32; newcoordinates[1] = Xinit.getState().getPosY(); newcoordinates[2] = 0; // this means going left newcoordinates[3] = Xinit.getState().getVelocityY(); float[] gapInfo; s = new State(newcoordinates[2], newcoordinates[3], newcoordinates[0], newcoordinates[1], 0, null, Xinit.getState().getAllCaughtCollectibles()); s.setSizeOfAgent(80); if (s.getPosX() < Xinit.getState().CurrentPlatform.minWidth()) { if ((!Xinit.getState().SpecialMoveL) && ((gapInfo = _domain.AllObstacles.isThereAGap(s, Xinit.getState().CurrentPlatform, min, max)) != null)) { s.setPosX(s.getPosX() - gapInfo[0] - s.getSizeOfAgent() / 2); s.point.x = s.getPosX(); s.CurrentPlatform = _domain.AllObstacles.getNextPlatform(s); s.point.Platform = s.CurrentPlatform; s.point.y = s.getPosY(); Xinit.getState().SpecialMoveL = true; s.point.Gap = true; } else { s.CurrentPlatform = _domain.AllObstacles.getNextPlatformRange(s, 100); s.point.Platform = s.CurrentPlatform; s.setPosY(s.CurrentPlatform.maxHeight() - radius); s.point.Fall = true; s.point.x = Xinit.getState().CurrentPlatform.minWidth() - radius; s.point.y = s.getPosY(); s.setPosX(s.point.x); Xinit.setActionBusy(0); } } else { Xinit.setActionBusy(0); s.CurrentPlatform = Xinit.getState().CurrentPlatform; s.point.Platform = s.CurrentPlatform; } this.caughtCollectible(Xinit.getState(), s); s.point.numberOfCollectibles = s.numberOfCollectibles(); if (!this.contains(s, graph)) { newState = true; } } break; case 1: if (!Xinit._busyActions[1]) { float[] newcoordinates = new float[4]; newcoordinates[0] = Xinit.getState().getPosX() + 32; newcoordinates[1] = Xinit.getState().getPosY(); newcoordinates[2] = 1; // this means going right newcoordinates[3] = Xinit.getState().getVelocityY(); float[] gapInfo; s = new State(newcoordinates[2], newcoordinates[3], newcoordinates[0], newcoordinates[1], 1, null, Xinit.getState().getAllCaughtCollectibles()); s.setSizeOfAgent(80); if (s.getPosX() > Xinit.getState().CurrentPlatform.maxWidth()) { if ((!Xinit.getState().SpecialMoveR) && ((gapInfo = _domain.AllObstacles.isThereAGap(s, Xinit.getState().CurrentPlatform, min, max)) != null)) { s.setPosX(s.getPosX() + gapInfo[0] + s.getSizeOfAgent() / 2); s.point.x = s.getPosX(); s.CurrentPlatform = _domain.AllObstacles.getNextPlatform(s); s.point.Platform = s.CurrentPlatform; s.point.y = s.getPosY(); Xinit.getState().SpecialMoveR = true; s.point.Gap = true; } else { s.CurrentPlatform = _domain.AllObstacles.getNextPlatform(s); s.point.Platform = s.CurrentPlatform; s.setPosY(s.CurrentPlatform.maxHeight() - radius); s.point.Fall = true; s.point.x = Xinit.getState().CurrentPlatform.maxWidth() + radius; s.setPosX(s.point.x); s.point.y = s.getPosY(); Xinit.setActionBusy(1); } } else { Xinit.setActionBusy(1); s.CurrentPlatform = Xinit.getState().CurrentPlatform; s.point.Platform = s.CurrentPlatform; } this.caughtCollectible(Xinit.getState(), s); s.point.numberOfCollectibles = s.numberOfCollectibles(); if (!this.contains(s, graph)) { newState = true; } } break; case 2: if (!Xinit._busyActions[2]) { float[] newcoordinates = new float[4]; newcoordinates[0] = Xinit.getState().getPosX(); newcoordinates[1] = Xinit.getState().getPosY() - 305; newcoordinates[2] = Xinit.getState().getVelocityX(); newcoordinates[3] = Xinit.getState().getVelocityY(); s = new State(newcoordinates[2], newcoordinates[3], newcoordinates[0], newcoordinates[1], 2, null, Xinit.getState().getAllCaughtCollectibles()); s.setSizeOfAgent(80); Xinit.setActionBusy(2); s.CurrentPlatform = Xinit.getState().CurrentPlatform; s.point.Platform = s.CurrentPlatform; this.caughtCollectible(Xinit.getState(), s); s.setPosY(s.getPosY() + 305); if (Xinit.getState().sizeOfCaughtCollectible() < s.sizeOfCaughtCollectible()) { s.point.DiamondAbove = true; if (Xinit.getState().getAction() == 0) { s.point.x -= 32; s.point.x -= radius; } else if (Xinit.getState().getAction() == 1) { s.point.x += 32; s.point.x += radius; } } else { continue; } s.point.y = s.getPosY(); s.point.numberOfCollectibles = s.numberOfCollectibles(); if (!this.contains(s, graph)) { newState = true; } } break; case 3: if (!Xinit._busyActions[3]) { float[] newcoordinates = new float[4]; newcoordinates[0] = Xinit.getState().getPosX(); newcoordinates[1] = Xinit.getState().getPosY() - 305; newcoordinates[2] = Xinit.getState().getVelocityX(); newcoordinates[3] = Xinit.getState().getVelocityY(); //if(newcoordinates[2] == 0) // going left // newcoordinates[0] -= 64; //else if(newcoordinates[2] == 1) // going right // newcoordinates[0] += 64; if (newcoordinates[2] == 0) // going left { newcoordinates[0] -= 384; } else if (newcoordinates[2] == 1) // going right { newcoordinates[0] += 384; } s = new State(newcoordinates[2], newcoordinates[3], newcoordinates[0], newcoordinates[1], 3, null, Xinit.getState().getAllCaughtCollectibles()); s.setSizeOfAgent(80); s.CurrentPlatform = Xinit.getState().CurrentPlatform; if (s.ReachableObstacles == null) { if (s.VisitedPlatforms == null) { s.ReachableObstacles = _domain.AllObstacles.platformsAbove(Xinit.getState(), s); s.VisitedPlatforms = new bool[s.ReachableObstacles.Count]; } else { Xinit.setActionBusy(3); return(null); } } if (s.ReachableObstacles != null) { Obstacles.Obstacle o = null; int i = 0; for (i = 0; i < s.ReachableObstacles.Count; i++) { if (!s.VisitedPlatforms[i]) { o = (Obstacles.Obstacle)s.ReachableObstacles[i]; break; } } if (o == null) { Xinit.setActionBusy(3); return(null); } else { if (s.getVelocityX() == 0) // going left { s.setPosX(o.maxWidth() - s.getSizeOfAgent() / 2); } else if (s.getVelocityX() == 1) // going right { s.setPosX(o.minWidth() + s.getSizeOfAgent() / 2); } s.setPosY(o.maxHeight() - s.getSizeOfAgent() / 2); s.point.x = s.getPosX(); s.point.y = s.getPosY(); s.point.ToPlatform = true; s.CurrentPlatform = o; s.point.Platform = s.CurrentPlatform; s.VisitedPlatforms[i] = true; Xinit.setActionBusy(3); } } else { return(null); } this.caughtCollectible(Xinit.getState(), s); s.point.numberOfCollectibles = s.numberOfCollectibles(); if (!this.contains(s, graph)) { newState = true; } } break; } } CircleNode n = new CircleNode(s); return(n); }