📄 firebrigadeagent.java
字号:
package MRL.FireBrigade;import java.net.*;import java.util.*;import java.util.List;import java.awt.*;import yab.agent.*;import yab.agent.object.*;import MRL.Utilities.*;import MRL.Utilities.Partitioning.Partition;import MRL.Utilities.MessageManagement.AgentMessageManager;import MRL.Utilities.MessageManagement.AgentNoStationMessageManager;// Authors : Maziar Sharbafi & Saeed Ansaripublic class FireBrigadeAgent extends AbstractFireBrigadeAgent { private ArrayList<Building> fires = new ArrayList<Building>(); private ArrayList<FireSite> fireSites = new ArrayList<FireSite>(); private FireSite target = null; //addedf by saeed private Building target_Building = null; private int myWaitingTime; private boolean amISearching = false; private List<FireBrigade> unBuriedAgents = new ArrayList<FireBrigade>(); private MotionlessObject currentPosition; private MotionlessObject lastPosition; private int lastMoveTime = 0; protected static final Condition BURNING_CND = FIERYNESS_PRP.gte(1).and(FIERYNESS_PRP.lte(8)); protected static final Condition ACCESSABLE_BUILDINGS_TO_GO = (FIERYNESS_PRP.gte(4).and( FIERYNESS_PRP.lte(8))).or(FIERYNESS_PRP.eq(0));// protected EFireBrigade self() {// return super.self(); //To change body of overridden methods use File | Settings | File Templates.// } //saeed 85-2-3 public FireBrigadeAgent(InetAddress address, int port) { super(address, port); world.setBuildingConnections(); Collections.sort(world.fireBrigades, Util.idComparator); partition(); if (world.fireStations.isEmpty()) messageManager = new AgentNoStationMessageManager(socket(), world); else messageManager = new AgentMessageManager(socket(), world); socket().akAcknowledge(self().id); } protected void partition() { int partIndx = world.fireBrigades.indexOf(self()); int totParts = world.partitioner.getPartitions().size(); if (partIndx >= totParts) partIndx = random.nextInt(totParts); Partition part = world.partitioner.getPartition(partIndx); world.setSearchingPartition(part); } protected void hear(RealObject sender, String msg) { //do nothing; } protected void hearTellBin(RealObject sender, byte[] message) { if (sender.id != self().id)// if ( (messageManager instanceof AgentMessageManager && sender instanceof FireStation )// || messageManager instanceof AgentNoStationMessageManager) messageManager.importMessage(message, time(), sender); } protected void hearTell(RealObject sender, String msg) { //do nothing } protected void prepareForAct() { super.prepareForAct(); fires.clear(); fires = BURNING_CND.extract(world.buildings); updatePositionSettings(); updateFireSites(); setValueOfSites(); // added by saeed messageManager.sendMessages(); } private void updatePositionSettings() { if (currentPosition == null) { currentPosition = self().motionlessPosition(); lastPosition = currentPosition; } else { lastPosition = currentPosition; currentPosition = self().motionlessPosition(); } if (currentPosition != lastPosition) lastMoveTime = time(); } private boolean firstTime = true; private boolean sitereignit = true; protected void act() throws ActionCommandException { super.act(); areSitesFinished(); moveToRefugeIfDamagedOrTankIsEmpty(); extinguishLastPutOutSite();// extinguishPutOutBuildings(); moreExtinguish();// selectReachableSites();// System.out.println("amIsearching self " + self().id + " " + amISearching ); selectFireSite(); selectTarget(); extinguishTarget(); moveForExtinguish();// if (target == null) System.err.println("null self " + self().id + " time " + time() );// System.out.println("amIseraching true before " + self().id + " " + time() ); amISearching = true;// System.out.println("amIseraching true after " + self().id + " " + time() ); searchCivilians(true); checkAndReportCivilians(); restAtRefuge(); } protected void updateFireSites() { ArrayList newFires = new ArrayList(); for (Iterator it = world.buildings.iterator(); it.hasNext(); ) { Building build = (Building) it.next(); if ((build.time() > time() - 2 || build.hearTime() > time() - 2) && build.fieryness() > 0) newFires.add(build); } for (Iterator it = fireSites.iterator(); it.hasNext(); ) { FireSite fs = (FireSite) it.next(); fs.updateCauseFieriness(); } for (Iterator it = newFires.iterator(); it.hasNext(); ) { Building fire = (Building) it.next(); boolean isForPriviousSites = false; ArrayList sitesContainThis = new ArrayList(); for (int j = 0; j < fireSites.size(); ++j) { int test = ((FireSite) fireSites.get(j)).addFire(fire); if (test != -1) { isForPriviousSites = true; sitesContainThis.add(new Integer(j)); } } if (!isForPriviousSites) { fireSites.add(new FireSite(fire)); } if (sitesContainThis.size() > 0) { FireSite firstSite = (FireSite) fireSites.get(((Integer) sitesContainThis.get(0)).intValue()); for (int j = 1; j < sitesContainThis.size(); ++j) { int idx = ((Integer) sitesContainThis.get(j)).intValue(); firstSite.mergeWith((FireSite) fireSites.get(idx)); } for (int j = sitesContainThis.size() - 1; j > 0; --j) { int idx = ((Integer) sitesContainThis.get(j)).intValue(); fireSites.remove(idx); } } } } //added by saeed private void moveToRefugeIfDamagedOrTankIsEmpty() throws ActionCommandException { int requiredWater = 10000; if (target != null) { Building nearestRefuge = (Building) distancePrp.min(world.refuges); if (self().distance(nearestRefuge) <= 140000) { if (target.getTotalArea() <= 9050) requiredWater = 5000; else requiredWater = 15000; } } int fbCount = 0; if (self().motionlessPosition() instanceof Refuge) { for (int i = 0; i < world.fireBrigades.size(); i++) { FireBrigade fb = (FireBrigade) world.fireBrigades.get(i); if (fb.motionlessPosition() == self().motionlessPosition() && fb.isVisible()) fbCount++; } requiredWater = 16000 - fbCount * 1000; requiredWater = Util.max(requiredWater, 10000); if (self().waterQuantity() < requiredWater) rest(); } if ((self().damage() > 0 && self().hp() < 5000) || self().waterQuantity() == 0) { restAtRefuge(); } } private void setValueOfSites() { for (Iterator it = fireSites.iterator(); it.hasNext(); ) { FireSite site = (FireSite) it.next(); site.updateSite(world); calculateVictimsAroundSite(site); setValueForSelf(site); } } boolean areSitesFinished = true; public void selectFireSite() { if (!fireSites.isEmpty() && firstTime) { firstTime = false; amISearching = false;// System.err.println("set to false " + self().id + " " + time() ); } if (areSitesFinished) { target = null; return; } if (!reigniteSites.isEmpty()) { Collections.sort(reigniteSites, valueComparator); FireSite igniteSite = null;// world.sortByID(world.fireBrigades); sortAgentDistanceToSite(reigniteSites.get(0));// int myIndex = world.fireBrigades.indexOf(self()); int myIndex = firebrigadesAssignedToDistance.indexOf(self()); int extraWaiting = 0; if (world.nodes.size() > 1000 && world.nodes.size() < 1500) extraWaiting = 1; else if (world.nodes.size() > 1500) extraWaiting = 2; switch (myIndex) { case 0: myWaitingTime = 0; break; case 1: igniteSite = reigniteSites.get(0); if (igniteSite.getTotalArea() <= 15000) myWaitingTime = 3; else myWaitingTime = 2; if (amISearching) myWaitingTime = 0; break; case 2: igniteSite = reigniteSites.get(0); if (igniteSite.getTotalArea() <= 25000) myWaitingTime = 6; else myWaitingTime = 4; if (amISearching) myWaitingTime = 0; break; case 3: if (reigniteSites.size() == 1) { igniteSite = reigniteSites.get(0); if (igniteSite.getTotalArea() <= 35000) myWaitingTime = 8 + extraWaiting; else myWaitingTime = 6 + extraWaiting; } if (amISearching) myWaitingTime = 0; break; case 4: if (reigniteSites.size() == 1) { igniteSite = reigniteSites.get(0); if (igniteSite.getTotalArea() <= 45000) myWaitingTime = 10 + extraWaiting; else myWaitingTime = 8 + extraWaiting; } else { target = reigniteSites.get(1); return; } if (amISearching) myWaitingTime = 0; break; case 5: if (reigniteSites.size() == 1) { igniteSite = reigniteSites.get(0); if (igniteSite.getTotalArea() <= 50000) myWaitingTime = 12 + extraWaiting; else myWaitingTime = 10 + extraWaiting; } else { target = reigniteSites.get(1); return; } if (amISearching) myWaitingTime = 0; break; case 6: if (reigniteSites.size() == 1) { igniteSite = reigniteSites.get(0); if (igniteSite.getTotalArea() <= 45000) myWaitingTime = 13 + extraWaiting; else myWaitingTime = 11 + extraWaiting; } else { target = reigniteSites.get(1); return; } if (amISearching) myWaitingTime = 0; break; case 7: if (reigniteSites.size() == 1) { igniteSite = reigniteSites.get(0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -