📄 firebrigadeagent.java
字号:
numberFb++; } if (self().distance(target_Building) < MRL.Utilities.SimulatorsConstants.EXTINGUISHABLE_DISTANCE && target_Building.isBurning() && ((self().motionlessPosition() instanceof Building) || ((self().motionlessPosition() instanceof Road) && (((Road) self().motionlessPosition()).passableLines() > numberFb)) || (minPass > numberFb) || canExtinguish)) { canExtinguish = false; if (self().distance(target_Building) < MRL.Utilities.SimulatorsConstants.EXTINGUISHABLE_DISTANCE && target_Building.isBurning() && !(((self().motionlessPosition() instanceof Road) && (((Road) self().motionlessPosition()).passableLines() > numberFb)) || (minPass > numberFb))) canExtinguish = true; extinguish(target_Building); } if (self().distance(target_Building) < MRL.Utilities.SimulatorsConstants.EXTINGUISHABLE_DISTANCE && target_Building.isBurning() && !(((self().motionlessPosition() instanceof Road) && (((Road) self().motionlessPosition()).passableLines() > numberFb)) || (minPass > numberFb))) canExtinguish = true; } public void moreExtinguish() throws ActionCommandException { if (target_Building == null) return; if (target_Building.isBurning()) target_Building.isPutoutTimeSet = false; if (!(target_Building.isBurning()) && !target_Building.isPutoutTimeSet) { target_Building.timeOfPutout = time(); target_Building.isPutoutTimeSet = true; } if (time() < (target_Building.timeOfPutout + target_Building.extraExtinguishTime) && target_Building.extraExtinguishTime != 0 && target_Building.isPutoutTimeSet && self().distance(target_Building) <= SimulatorsConstants.EXTINGUISHABLE_DISTANCE) { extinguish(target_Building); } } void findNearestRefugeToSite(FireSite site) { double nearestPos = -1.0; Refuge nearestRefuge = null; Point sitePos = site.getCenter(); for (Iterator it = world.refuges.iterator(); it.hasNext(); ) { Refuge ref = (Refuge) it.next(); int x = ref.motionlessPosition().x(); int y = ref.motionlessPosition().y(); Point pos = new Point(x, y); double distanceToRefuge = sitePos.distance(pos); if (distanceToRefuge < nearestPos) { nearestPos = distanceToRefuge; nearestRefuge = ref; } } site.setDistanceToNearestRefuge(nearestPos); site.setNearestRefuge(nearestRefuge); } List<FireSite> reigniteSites = new ArrayList<FireSite>(); public void setValueForSelf(FireSite site) { if (site.isPutOff) { // If site is putoff ignore it. if (reigniteSites.contains(site)) reigniteSites.remove(site); site.setValue(Float.MAX_VALUE); return; } else if (site.isIgniteAgain) { if (!reigniteSites.contains(site)) { reigniteSites.add(site); } } if (!isSiteReachable(site)) { site.setValue(site.getTotalArea());// site.setValue(Float.MAX_VALUE);// System.out.println("Not reachable " + self().id + " time " + time() +// " disSiteToCenter " + getDistanceToCenterOfMap(site)*.00001 ); return; } float minArea = Float.MAX_VALUE; float mindistanceToCenter = Float.MAX_VALUE; float distToCenter = 10; for (int i = 0; i < fireSites.size(); i++) { if (fireSites.get(i).getTotalArea() < minArea && fireSites.get(i).getTotalArea() > 10.75) minArea = fireSites.get(i).getTotalArea(); distToCenter = getDistanceToCenterOfMap(fireSites.get(i)); if (distToCenter < mindistanceToCenter) mindistanceToCenter = distToCenter; } float areaValue = (site.getTotalArea() / minArea); int coefOfMapSize = 1; if (world.nodes.size() > 1500) coefOfMapSize = 2; float value; int X = self().position().x(); int Y = self().position().y(); int disToSite = Util.distance(X, Y, site.getCenter().x, site.getCenter().y); int tempCoef = 1; //float disCoef = 1; int distanceToCenterofMAp = getDistanceToCenterOfMap(site); if (time() <= 15) tempCoef = 2; float disCoef = (distanceToCenterofMAp / mindistanceToCenter); value = (float) (site.getNumberOfbuildings() * .2 + site.totalFieryness_Area * 0.00005 + site.getTotalArea() * .00001 + (disToSite * .00001 * tempCoef * coefOfMapSize) + (getNumberVictimInConnectedBldgsAroundSite(site) * ( -2) + distanceToCenterofMAp * .00001 * disCoef)); // coefficient of disToSite changed : .01 to .0001 value += site.sumCndValues * -1 + areaValue * .2; //System.out.println(" Time " + time() + " Self "+self().id + " numBldgs " + site.getNumberOfbuildings()*.2 + " Tota Fireness Area " + site.totalFieryness_Area*0.00005 +" TOTAREA " + site.getTotalArea() * .00001 + // " Distance to center: "+ .00001*getDistanceToCenterOfMap(site)+" Distance to self: " + disToSite*.00001 +" victim "+getNumberVictimInConnectedBldgsAroundSite(site)*(-1)+" value connected " + // site.sumCndValues*-1 /*+" num connected "+site.numConnectedBldgs*-1 */ + " AreaValue " + areaValue*2 + " Value: " + value); //System.out.flush(); site.setValue(value); } private Property X_PRP = new Property() { public Object eval(Object obj) { return new Integer(((MotionlessObject) obj).x()); } }; private Property Y_PRP = new Property() { public Object eval(Object obj) { return new Integer(((MotionlessObject) obj).y()); } }; public int getNumberVictimInDirection(int direction, FireSite site) { List positions = POSITION_PRP.collect(world.needRescueCivs); int count = 0; int mainDepthSearch = 35000; int x_DepthSearch = Math.abs((site.getMaxX() - site.getMinX()) / 3); int y_DepthSearch = Math.abs((site.getMaxY() - site.getMinY()) / 3); switch (direction) { case 0: Condition northCondition = Y_PRP.gte(site.getMaxY() - y_DepthSearch). and(Y_PRP.lte(site.getMaxY() + mainDepthSearch)). and((X_PRP.gte(site.getMinX() - x_DepthSearch)).and(X_PRP.lte(site.getMaxX() + x_DepthSearch))); count = Utils.getConditionCount(positions, northCondition); break; case 1: Condition eastCondition = X_PRP.gte(site.getMaxX() - x_DepthSearch). and(X_PRP.lte(site.getMaxX() + mainDepthSearch)). and((Y_PRP.gte(site.getMinY() - y_DepthSearch)).and(Y_PRP.lte(site.getMaxY() + y_DepthSearch))); count = Utils.getConditionCount(positions, eastCondition); break; case 2: Condition southCondition = Y_PRP.gte(site.getMinY() - mainDepthSearch).and(Y_PRP.lte( site.getMinY() + y_DepthSearch)). and((X_PRP.gte(site.getMinX() - x_DepthSearch)).and(X_PRP.lte(site.getMaxX() + x_DepthSearch))); count = Utils.getConditionCount(positions, southCondition); break; case 3: Condition westCondition = X_PRP.gte(site.getMinX() - mainDepthSearch).and(X_PRP.lte( site.getMinX() + x_DepthSearch)). and((Y_PRP.lte(site.getMaxY() + y_DepthSearch)).and(Y_PRP.gte(site.getMinY() - y_DepthSearch))); count = Utils.getConditionCount(positions, westCondition); break; } return count; } public void calculateVictimsAroundSite(FireSite site) { int victimAround = 0; int count = 0; for (int i = 0; i < 4; i++) { count = getNumberVictimInDirection(i, site); victimAround += count; } site.setNumberVictimsAround(victimAround); } public int getVictimsAroundBuilding(Building bldg) { int totalDistance = 0; int victimCount = 0; for (Iterator it = world.needRescueCivs.iterator(); it.hasNext(); ) { Humanoid hum = (Humanoid) it.next(); int distance = bldg.distance(hum); if (distance <= 20000) { victimCount++; totalDistance += distance; } } bldg.setTotalDistanceToVictims(totalDistance); return victimCount; } public final float inBlock = (float) Integer.MAX_VALUE * (float) Integer.MAX_VALUE; public boolean isTargetAccessible(Building bd) { Building bldg; bldg = (Building) bd.motionlessPosition(); Route rt; rt = Router.get(self().motionlessPosition(), Collections.singleton(bldg), RELIABILITY_COST_FUNCTION); if (rt.cost >= inBlock) return false; else return true; } private Comparator valueComparator = new Comparator() { public int compare(Object o1, Object o2) { FireSite f1 = (FireSite) o1; FireSite f2 = (FireSite) o2; if (f1.getValue() > f2.getValue()) return 1; if (f1.getValue() == f2.getValue()) return 0; return -1; } }; private Comparator distanceComparator = new Comparator() { public int compare(Object o1, Object o2) { FireSite f1 = (FireSite) o1; FireSite f2 = (FireSite) o2; if (f1.getValue() > f2.getValue()) return 1; if (f1.getValue() == f2.getValue()) return 0; return -1; } }; private Comparator fierynessComparator = new Comparator() { public int compare(Object o1, Object o2) { Building b1 = (Building) o1; Building b2 = (Building) o2; if (b1.fieryness() < b2.fieryness()) return 1; if (b1.fieryness() == b2.fieryness()) return 0; return -1; } }; public void evaluateAmountOfExtraWater(Building bd) { int Extracoef = 0; bd.extraExtinguishTime = 0; if (target.isIgniteAgain) { Extracoef = 1; } if (bd.buildingAreaTotal() > 7500) { if (bd.buildingAreaTotal() < 15000) { bd.extraExtinguishTime = 1; } else if (bd.buildingAreaTotal() < 25000) { bd.extraExtinguishTime = 2; } else if (bd.buildingAreaTotal() < 50000) { bd.extraExtinguishTime = 3; } else bd.extraExtinguishTime = 0; } bd.extraExtinguishTime = bd.extraExtinguishTime * Extracoef; } public boolean isSiteExtinguishable(FireSite site) { return site.getTotalArea() / world.fireBrigades.size() < 33000; } public List getTargetsInExtinguishDirection(int direction, FireSite site) { List targetBuildings = null; int x_DepthSearch = Math.abs((site.getMaxX() - site.getMinX()) / 3); int y_DepthSearch = Math.abs((site.getMaxY() - site.getMinY()) / 3); int y_minDistance = Util.min(35000, y_DepthSearch); int x_minDistance = Util.min(35000, x_DepthSearch); switch (direction) { case 0: Condition northCnd = Y_PRP.gte(site.getMaxY() -
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -