/** * main method of fire zone manager</br> this method call each cycle to update and determine new * fire zone * * @param time */ public void update(int time) { long t1 = System.currentTimeMillis(); log.info("size of fireSites " + getFireSites().size()); printZoneData(); if (me instanceof FireBrigadeAgent) { // log.info("move updateIslands to updater ! ", null); ((FireWorldModel) model).updateIslands(); } for (Iterator<Pair<ArrayList<SOSRealFireZone>, SOSEstimatedFireZone>> it = getFireSites().iterator(); it.hasNext(); ) { Pair<ArrayList<SOSRealFireZone>, SOSEstimatedFireZone> p = it.next(); checkEstimator(p.second()); log.info("update fireZone " + p); log.info("\tupdate estimated fireZone " + p.second()); p.second().update(time); for (SOSRealFireZone f : p.first()) { log.info("\tupdate real fireZone " + f); f.update(time); } } log.info("going to create new fireZones "); createNewZones(time); log.info("going to merge fireZones "); mergeFireZones(); printZoneData(); // if (!SOSConstant.IS_CHALLENGE_RUNNING) // log.warn("Fire Zone Updater Finished Time= " + (System.currentTimeMillis() - t1) + " ms // "); }
/** * create new fire zones by buildings that don't belong to any existence fire zones * * @param time */ private void createNewZones(int time) { for (Iterator<Building> it = model.fieryBuildings().iterator(); it.hasNext(); ) { Building b = it.next(); if (b.getSOSEstimateFireSite() == null) { SOSEstimatedFireZone estimatefz = new SOSEstimatedFireZone(lastAssignedIndex, this); lastAssignedIndex++; log.info("New Estimate Fire Zone Created " + estimatefz + "\t" + b); getFireSites() .add( new Pair<ArrayList<SOSRealFireZone>, SOSEstimatedFireZone>( new ArrayList<SOSRealFireZone>(), estimatefz)); updateNewSite(b, estimatefz); estimatefz.update(time); } if (b.getSOSRealFireSite() == null) { SOSRealFireZone realfz = new SOSRealFireZone(lastAssignedIndex, this); lastAssignedIndex++; log.info("New Real Fire Zone Created " + realfz + "\t" + b); getFireZonePair(b.getSOSEstimateFireSite()).first().add(realfz); updateNewSite(b, realfz); realfz.update(time); } } }
public ArrayList<Building> getAllRealBuilding() { ArrayList<Building> targets = new ArrayList<Building>(); for (int i = 0; i < fireSites.size(); i++) { for (SOSRealFireZone fs : fireSites.get(i).first()) { targets.addAll(fs.getAllBuildings()); } } return targets; }
/** * merge real fire zones * * @param targets * @param mergeList */ private void mergeRealFireZones( Pair<ArrayList<SOSRealFireZone>, SOSEstimatedFireZone> target, ArrayList<SOSAbstractFireZone> mergeList) { if (target == null) return; ArrayList<SOSRealFireZone> realZones = target.first(); getFireSites().remove(target); SOSRealFireZone newRealFireSite = new SOSRealFireZone(lastAssignedIndex++, this); SOSRealFireZone real; for (SOSAbstractFireZone fz : mergeList) { real = (SOSRealFireZone) fz; realZones.remove(real); for (Building b : real.getAllBuildings()) { if (!b.getSOSRealFireSite().equals(newRealFireSite)) { b.setSOSRealFireSite(newRealFireSite); newRealFireSite.addFieryBuilding(b); newRealFireSite.updateXY(b, 1); } } real.update(model.time()); } realZones.add(newRealFireSite); getFireSites() .add( new Pair<ArrayList<SOSRealFireZone>, SOSEstimatedFireZone>(realZones, target.second())); }