📄 firebrigadeagent.java
字号:
if (igniteSite.getTotalArea() <= 50000) myWaitingTime = 13 + extraWaiting * 2; else myWaitingTime = 11 + extraWaiting * 2; } else { target = reigniteSites.get(1); return; } if (amISearching) myWaitingTime = 0; break; case 8: if (reigniteSites.size() == 1) { igniteSite = reigniteSites.get(0); if (igniteSite.getTotalArea() <= 50000) myWaitingTime = 14 + extraWaiting * 2; else myWaitingTime = 12 + extraWaiting * 2; } else { target = reigniteSites.get(1); return; } if (amISearching) myWaitingTime = 0; break; case 9: myWaitingTime = 17 + extraWaiting * 2; if (amISearching) myWaitingTime = 0; break; default: myWaitingTime = 18 + extraWaiting * 2; if (amISearching) myWaitingTime = 0; } } FireSite site; Iterator it = fireSites.iterator(); float minValue = Float.MAX_VALUE; for (; it.hasNext(); ) { site = (FireSite) it.next(); if (site.burningBuildings().isEmpty()) site.setValue(Float.MAX_VALUE); isTargetAssigned = false; if (site.getTotalArea() < 7500 && !site.burningBuildings().isEmpty()) { sortAgentDistanceToSite(site); assignSmallSiteToAgent(site); } if (isTargetAssigned) { amISearching = false; return; } if (time() - site.burningTime < myWaitingTime) continue; if (site.getValue() < minValue) { minValue = site.getValue(); target = site; } } if (target != null) amISearching = false; } public void selectTarget() { if (target == null) { target_Building = null; return; } double value = Double.MAX_VALUE; double building_value = 0; List targets; int victimCount = 0; if (!isSiteExtinguishable(target)) { int totalVictim = 0; int direction = 0; int totalArea = 0; int numBldgsInDirection = 0; float mainValue = Float.MAX_VALUE; int maxDistance = 1; int[] distances = new int[4]; for (int k = 0; k < 4; k++) { distances[k] = getLastCoordinateInDirection(k, target); if (distances[k] > maxDistance) maxDistance = distances[k]; } int[] averageDistance = new int[4]; for (int i = 0; i < 4; i++) { totalVictim = 0; totalArea = 0; numBldgsInDirection = 0; List bldgs = getTargetsInExtinguishDirection(i, target); for (Iterator it = bldgs.iterator(); it.hasNext(); ) { Building bd = (Building) it.next(); averageDistance[i] += Util.distance(bd.x(), bd.y(), getSecureCenterOfMap().x, getSecureCenterOfMap().y); totalArea += bd.buildingAreaTotal(); numBldgsInDirection += 1; } averageDistance[i] /= bldgs.size(); int tempValue = 0; if (distances[i] / (maxDistance + 1) < 0.3) tempValue = (maxDistance / (distances[i] + 1)) * 2; totalVictim = getNumberVictimInConnectedBldgs(i, target); float dirValue = (float) (totalVictim * -6 + totalArea * 0.00001 + numBldgsInDirection * .5 + tempValue + averageDistance[i] * 0.001);// System.out.println(" self " + self().id + " time " + time() +// " Direction " + i + " Value " + dirValue +// " total vic " + totalVictim * -5 +// " totalArea " + totalArea * 0.00001 +// " numbldgDirection " +// numBldgsInDirection * .5 + " avrgDis " +// averageDistance[i] * 0.001); System.out.flush(); int tempFinal = totalArea / 15000; world.sortByID(world.fireBrigades); int indexFinal = world.fireBrigades.indexOf(self()); if ( tempFinal > indexFinal ) { System.out.println("ok go to next direction self " + self().id + " tempFinal " + tempFinal + " time " + time() ); continue; } if (dirValue < mainValue) { mainValue = dirValue; direction = i; } } target.setDirectionForExtinguish(direction); targets = getTargetsInExtinguishDirection(direction, target); extinguishBuildingsInDirection(targets); return; } else targets = target.burningBuildings(); if (targets.isEmpty()) { if (MRL.MRLConstants.FB_DEBUG_MODE) System.out.println("No target"); return; } float mapSizeCoef = 1; if (world.nodes.size() > 25000) mapSizeCoef = 0.3f; int k = 0; for (Iterator it = targets.iterator(); it.hasNext(); ) { Building bd = (Building) it.next(); sortAgentDistanceToBuilding(bd); // 18 june int index = firebrigadesAssignedToBuilding.indexOf(self()); // 18 june if ( (( bd.buildingAreaTotal() / 5000 ) < index-k )&& (bd.buildingAreaTotal() < target.getTotalArea()/10 ) ) { k+= (int)(bd.buildingAreaTotal() / 5000 ); // System.err.println("self to bedoon dir " + self().id + " time " + time() + " continue " ); continue; // 18 june } if (bd.buildingAreaTotal() <= 58752.37) { victimCount = getVictimsAroundBuilding(bd); building_value = ((time() - bd.getFireStart()) + self().distance(bd) * 0.001 * mapSizeCoef + victimCount * -5 + bd.fieryness() * bd.buildingAreaTotal() * 0.0001); } else building_value = bd.buildingAreaTotal(); if (building_value < value) { if (MRL.MRLConstants.FB_DEBUG_MODE) System.err.println("Victim Around building " + victimCount); value = building_value; target_Building = bd; } } } private Building buildingToposition; public void moveForExtinguish() throws ActionCommandException { if (target_Building == null) return; if (self().distance(target_Building) < SimulatorsConstants.EXTINGUISHABLE_DISTANCE && time() <= 15) extinguish(target_Building); //it is clear List surroundedBuildings = ACCESSABLE_BUILDINGS_TO_GO.extract( target_Building.neighbourBuildings);// List surroundedBuildings = ACCESSABLE_BUILDINGS_TO_GO.and (target_Building.distancePrp.lte(SimulatorsConstants.EXTINGUISHABLE_DISTANCE)).extract(world.buildings); List surroundedRoads = (target_Building.distancePrp.lte( SimulatorsConstants.EXTINGUISHABLE_DISTANCE)).extract(world. nodes); surroundedBuildings.removeAll(fullBuildings); Node nearestRoad; List<Building> reachableBldgs = new ArrayList<Building>(); for (int i = 0; i < surroundedBuildings.size(); i++) { Building bd = (Building) surroundedBuildings.get(i); if (REACHABLE_C.eval(bd)) reachableBldgs.add(bd); }// reachableBldgs.addAll(surroundedBuildings); world.sortByID(reachableBldgs); world.sortByID(world.fireBrigades); int index = world.fireBrigades.indexOf(self()); if (index >= reachableBldgs.size()) { //TODO go to the next target if (MRL.MRLConstants.FB_DEBUG_MODE) System.err.println("Natoonestam beram " + time() + " " + self().id); if (!surroundedRoads.isEmpty()) { nearestRoad = (Node) target_Building.distancePrp.min( surroundedRoads); if (self().motionlessPosition().id == nearestRoad.id && self().distance(target_Building) < SimulatorsConstants.EXTINGUISHABLE_DISTANCE) extinguish(target_Building); move(nearestRoad); } else { if (self().motionlessPosition().id == target_Building.entrance().id && self().distance(target_Building) < SimulatorsConstants.EXTINGUISHABLE_DISTANCE) extinguish(target_Building); move(target_Building.entrance()); } } buildingToposition = (Building) reachableBldgs.get(index); if (time() - lastMoveTime > 2 && self().motionlessPosition() != buildingToposition) {// System.err.println("more than 2 self " + self().id + " time " + time() ); move(target_Building.neighbourBuildings); } if (!reachableBldgs.isEmpty() && !REACHABLE_C.eval(buildingToposition)) { Building bldg = (Building) target_Building.distancePrp.min( reachableBldgs); if (self().motionlessPosition().id == bldg.id && self().distance(target_Building) < SimulatorsConstants.EXTINGUISHABLE_DISTANCE) extinguish(target_Building); if (REACHABLE_C.eval(bldg)) move(bldg.motionlessPosition()); else { if (!surroundedRoads.isEmpty()) { nearestRoad = (Node) target_Building.distancePrp.min( surroundedRoads); if (self().motionlessPosition().id == nearestRoad.id && self().distance(target_Building) < SimulatorsConstants.EXTINGUISHABLE_DISTANCE) extinguish(target_Building); move(nearestRoad); } else { if (self().motionlessPosition().id == target_Building.id && self().distance(target_Building) < SimulatorsConstants.EXTINGUISHABLE_DISTANCE) extinguish(target_Building); move(target_Building.entrance()); } } } else { if (self().motionlessPosition().id == buildingToposition.id && self().distance(target_Building) < SimulatorsConstants.EXTINGUISHABLE_DISTANCE) extinguish(target_Building); move(buildingToposition.motionlessPosition()); } } private boolean canExtinguish = false; public void extinguishTarget() throws ActionCommandException { if (target_Building == null) return;// System.out.println("self " + self().id + " mywaitingtime " + myWaitingTime + "" + " time " + time() +// " myTarget " + target_Building.id + " targetAgainStart " + target.burningTime// + " reigniteSize " + reigniteSites.size() ); evaluateAmountOfExtraWater(target_Building); int minPass = 0; if (self().motionlessPosition() instanceof Node) { Collection Connected_roads = ((Node) self().motionlessPosition()). getConnectedRoads(); minPass = 10; for (Iterator it = Connected_roads.iterator(); it.hasNext(); ) { Road thisroad = (Road) it.next(); if (thisroad.passableLines() < minPass) minPass = thisroad.passableLines(); } } int numberFb = 0; for (Iterator it = world.fireBrigades.iterator(); it.hasNext(); ) { FireBrigade fb = (FireBrigade) it.next(); if (self().motionlessPosition() == fb.motionlessPosition() && fb.isVisible())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -