private static void SavingInfoToMap(int positionX_Plus, int positionY_Plus, OrientedField pole) { jestXY = punkty.Exists(element => element.x.Equals(positionX + positionX_Plus) && element.y.Equals(positionY + positionY_Plus)); if (!jestXY) { if (pole.energy == 0) { punkty.Add(new MapPoint(positionX + positionX_Plus, positionY + positionY_Plus, false, pole.height, pole.obstacle, pole.energy, 1)); } else { punkty.Insert(0, new MapPoint(positionX + positionX_Plus, positionY + positionY_Plus, false, pole.height, pole.obstacle, pole.energy, 1)); } } else { MapPoint punktTestowany = punkty.Find(element => element.x.Equals(positionX + positionX_Plus) && element.y.Equals(positionY + positionY_Plus)); punktTestowany.energy = pole.energy; } }
private static Boolean GoToField(OrientedField field) { for (int i = 0; i < field.y; i++) { OrientedField pole = GetFirstSeenField(); if(pole == null) { return false; } StepForward(pole); } if(field.x > 0) { RotateRight(); for (int i = 0; i < field.x; i++) { OrientedField pole = GetFirstSeenField(); if(pole == null) { return false; } StepForward(pole); } } else if (field.x < 0) { RotateLeft(); for (int i = 0; i < (-field.x); i++) { OrientedField pole = GetFirstSeenField(); if (pole == null) { return false; } StepForward(pole); } } else if (field.x == 0) { return true; } return true; }
/* * Metoda pobiera OreintedField, i zwraca Point. * Dzięki temu można nanieść pole na stworząną przez agenta mape. */ private static Point GetPoint(OrientedField field) { switch (Dir) { case Direction.North: return new Point(CurrentPoint.x + field.x, CurrentPoint.y + field.y); case Direction.South: return new Point(CurrentPoint.x - field.x, CurrentPoint.y - field.y); case Direction.West: return new Point(CurrentPoint.x - field.y, CurrentPoint.y + field.x); case Direction.East: return new Point(CurrentPoint.x + field.y, CurrentPoint.y - field.x); default: return new Point(0, 0); } }
/* * Zwraca dane pola (nie punktu), na które może przejść w tym momencie agent. * Zwraca null jeżeli dane pole jest przeszkodą, lub stoi na nim jakiś inny agent. */ private static OrientedField GetFirstSeenField() { OrientedField[] widzianePola = agent.Look(); foreach (OrientedField pole in widzianePola) { Point p = GetPoint(pole); Boolean isVisited = PointIsVisited(p); if (pole.x == 0 && pole.y == 0) CurrentField = pole; if (pole.agentId > 0) { //Say(); Console.WriteLine("Agent"); continue; } if (pole.x == 0 && pole.y == 1 && pole.obstacle == false) { return pole; } else if (pole.x == 0 && pole.y == 1 && (pole.obstacle == true || pole.agentId > 0)) { Console.WriteLine("przeszkoda!"); return null; } } Console.WriteLine("Nie ma nic!"); return null; }
private static OrientedField GetFirstNotVisitedField() { OrientedField fieldy = new OrientedField(); OrientedField field = new OrientedField(); OrientedField[] widzianePola = agent.Look(); field = null; fieldy = null; foreach (OrientedField pole in widzianePola) { if (pole.x == 0 && pole.y == 0) { continue; } if (pole.obstacle || pole.IsStepable() || pole.agentId > 0) { continue; } Point p = GetPoint(pole); if (!PointIsVisited(p) && field.y == 1 && field.x == 0) { return pole; } if (!PointIsVisited(p) && field.y == 1) { fieldy = pole; } if (!PointIsVisited(p)) { field = pole; } } if (fieldy != null) { return fieldy; } if (field != null) { return field; } return null; }
/* * Metoda sprawdza, czy w polu widzenia agenta znajduje się jakieś pole z energią. * Jeżeli tak, zwraca to pole. * Jeżeli nie, zwraca null. */ protected static OrientedField isEnergy() { OrientedField[] polaEnergii = agent.Look(); OrientedField pole = new OrientedField(); int energia = 0; foreach (OrientedField field in polaEnergii) { if (field.x == 0 && field.y == 0) { CurrentField = field; continue; } if (!field.IsStepable() || field.agentId > 0) { continue; } if (field.energy == -1) { Point p = GetPoint(field); if (!PointIsVisited(p)) { return field; } } if (field.energy > energia) { energia = pole.energy; pole = field; } } if (energia > 0) { return pole; } return null; }
/* * Wykonuje krok do przodu i zaopatruje agenta w energię jeżeli takowa jest dostępna na polu. */ public static void StepForward(OrientedField poleDocelowe) { if (!agent.StepForward()) { throw new NonCriticalException("Wykonanie kroku nie powiodlo sie"); } int koszt = GetMovementCost(poleDocelowe.height); // Ustawia nowy punkt układu współrzędnych, w którym znajduje się teraz agent. CurrentPoint = GetDestinationPoint(); CurrentPoint.visitedTimes++; // Dodajemy do naszej mapki CoordinateSystem.Add(CurrentPoint); energy -= Math.Abs(koszt); if (debugMode) { Console.WriteLine("pobiera energie za krok (" + Math.Abs(koszt) + ")"); } if (poleDocelowe.energy > 0) { Recharge(); } else if (poleDocelowe.energy == -1) { while (energy < worldParameters.initialEnergy - 20) { Console.WriteLine(energy); Recharge(); } if (!stableEnergyPoints.Exists(x => x.x == CurrentPoint.x && x.y == CurrentPoint.y)) { stableEnergyPoints.Add(CurrentPoint); } Console.WriteLine(stableEnergyPoints.Count); } }
private static void SavingInfoToMap(int positionX_Plus, int positionY_Plus, OrientedField pole) { jestXY = punkty.Exists(element => element.x.Equals(positionX + positionX_Plus) && element.y.Equals(positionY + positionY_Plus)); if (!jestXY) { if (pole.energy == 0) { punkty.Add(new MapPoint(positionX + positionX_Plus, positionY + positionY_Plus, false, pole.height, pole.obstacle, pole.energy, 1)); } else { punkty.Insert(0, new MapPoint(positionX + positionX_Plus, positionY + positionY_Plus, false, pole.height, pole.obstacle, pole.energy, 1)); } } else { MapPoint punktTestowany = punkty.Find(element => element.x.Equals(positionX + positionX_Plus) && element.y.Equals(positionY + positionY_Plus)); punktTestowany.energy = pole.energy; } }
/** * Metoda sprawia, że agent obraca się wokół siebie i sprawdza, które z 4 pól, na które może przejść * jest najlepsze pod względem stracenia energii. * Po znalezieniu najlepszego pola, przechodzi na nie. * Jeżeli znalezione pole to punkt, w którym agent już był, to szukamy drugiego pola. * Jeżeli wszystkie odwiedzono to wybieramy najlepsze z nich. */ private void DoBestMovement() { // Najlepszy punkt na układzie współrzędnych. Point bestPoint = new Point(0, 0); // Dane najlepszego pola wg. Atlantydy OrientedField bestField = new OrientedField(); bestField.height = 123456789; bestField.energy = 0; // Pole widziane w danym momencie. OrientedField field = new OrientedField(); OrientedField[] fields = new OrientedField[4]; field.energy = 0; field.height = -12345679; fields[0] = field = GetFirstSeenField(); if (field != null) { bestPoint = GetDestinationPoint(); bestField = field; } RotateLeft(); System.Threading.Thread.Sleep(500); fields[1] = field = GetFirstSeenField(); if (CompareFields(bestField, field) || PointIsVisited(bestPoint)) { bestPoint = GetDestinationPoint(); bestField = field; } RotateLeft(); System.Threading.Thread.Sleep(500); fields[2] = field = GetFirstSeenField(); if (CompareFields(bestField, field) || PointIsVisited(bestPoint)) { bestPoint = GetDestinationPoint(); bestField = field; } RotateLeft(); System.Threading.Thread.Sleep(500); fields[3] = field = GetFirstSeenField(); if (CompareFields(bestField, field) || PointIsVisited(bestPoint)) { bestPoint = GetDestinationPoint(); bestField = field; } if (bestField.height == 123456789) { foreach (OrientedField f in fields) { if (f != null) { bestField = f; break; } } } // Obraca agenta dopóki nie znajdziemy się w odpowiednim położeniu. while (GetDestinationPoint().x != bestPoint.x && GetDestinationPoint().y != bestPoint.y) { RotateLeft(); System.Threading.Thread.Sleep(500); } // Przejdź na najlepsze pole. StepForward(bestField); }
public void StepForward(OrientedField poleDocelowe) { if (!base.StepForward()) { Console.WriteLine("Wykonanie kroku nie powiodlo sie"); return; } int koszt = getMovementCost(poleDocelowe.height); if (energy >= koszt) { energy -= koszt; } if (poleDocelowe.energy != 0) { Recharge(); } // Ustawia nowy punkt układu współrzędnych, w którym znajduje się teraz agent. CurrentPoint = GetDestinationPoint(); // Dodajemy do naszej mapki CoordinateSystem.Add(CurrentPoint); Console.WriteLine("Roznica wysokosci: " + poleDocelowe.height); Console.WriteLine("Koszt: " + koszt); }
/** * Zwraca true jeżeli warto zmienić stare pole na nowe pole. */ public bool CompareFields(OrientedField oldfield, OrientedField newfield) { if (oldfield == null) { return true; } else if (newfield == null) { return false; } return ((getMovementCost(newfield.height) + newfield.energy) > (getMovementCost(oldfield.height) + oldfield.energy) || oldfield.energy < 0 || newfield.energy < 0); }