📄 ambulancecenteragent.java
字号:
package MRL.Ambulance;/** * Creat By Omid AmirGhiasvand: * 3 Apr 2006 * * Last Edit: * 2006-06-12 * 3:38 am * */import java.net.*;import yab.agent.*;import yab.agent.object.*;import MRL.Utilities.MessageManagement.CenterMessageManager;import java.util.*;public class AmbulanceCenterAgent extends AbstractAmbulanceCenterAgent { private CenterMessageManager messageManager; public AmbulanceCenterAgent(InetAddress address, int port) { super(address, port); messageManager = new CenterMessageManager(socket(), world); socket().akAcknowledge(self().id); } protected void hear(RealObject sender, String msg) { } protected void hearTell(RealObject sender, String msg) { } protected void hearTellBin(RealObject sender, byte[] message) { if (!(sender instanceof AmbulanceCenter)) { messageManager.importMessage(message, time(), sender); } } ////////////////////////////////////////////////////////////////////////////// private HashSet freeAmbulances = new HashSet(); private ArrayList civilianVictimSet = new ArrayList(); private ArrayList agentVictimSet = new ArrayList(); private ArrayList buridAT = new ArrayList(); private ArrayList buridPF = new ArrayList(); private ArrayList buridFB = new ArrayList(); private ArrayList targetSet = new ArrayList(); private ArrayList agentTargetSet = new ArrayList(); private HashSet tempBuriedAgentSet = new HashSet(); ////????????? private HashSet noNeedRescue = new HashSet(); private HashSet noNeedRescueAgent = new HashSet(); private Humanoid lastTarget; protected void prepareForAct() { super.prepareForAct(); updateAmbulances(); checkAgentTargetSet(); checkTargetSet(); rescueVictim(); messageManager.sendMessages(); } private void updateAmbulances() { freeAmbulances.clear(); for (Iterator it = world.ambulanceTeams.iterator() ; it.hasNext();) { AmbulanceTeam at = (AmbulanceTeam)it.next(); if (at.buriedness()==0) { if (at.myAssignedTarget == null) { freeAmbulances.add(at); at.setTimeToGetFree(0); } else { updateTimeToGetFree(at); } } } } /** * * ????????????????????????????????????????????????????????????????????? */ private void updateTimeToGetFree(AmbulanceTeam at ) { if (at.myAssignedTarget!=null) { at.setTimeToGetFree((int) java.lang.Math.ceil(at.myAssignedTarget. buriedness() /at.myAssignedTarget.ambulanceAssigned.size())+3); } } public void act() throws ActionCommandException { super.act(); if (time()==3) System.out.println(" MRL MRL MRL MRL MRL MRL MRL MRL MRL MRL MRL "); } private void checkAgentTargetSet() { if (agentTargetSet.isEmpty()|| freeAmbulances.isEmpty()) return; updateAgentTargetSet(); if (agentTargetSet.isEmpty()) return; for (Iterator it = agentTargetSet.iterator();it.hasNext();) { Humanoid tar = (Humanoid)it.next(); if (tar.ambulanceAssigned.size() <3 && tar.buriedness()>=12) assingAmbulancesToBuridAgent(tar); } } private void updateAgentTargetSet() { HashSet finishedTarget = new HashSet(); for (Iterator it = agentTargetSet.iterator() ; it.hasNext();) { Humanoid hum = (Humanoid )it.next(); if (hum.buriedness()<=3*hum.ambulanceAssigned.size()) finishedTarget.add(hum); } agentTargetSet.removeAll(finishedTarget); noNeedRescueAgent.addAll(finishedTarget); }//////////////////////////////////////////////////////////////////////////////////////////// private void checkTargetSet() { if (targetSet.isEmpty()|| freeAmbulances.isEmpty()) return; updateTargetSet(); if (lastTarget!= null) { updateHumanoidProperty(lastTarget); if (lastTarget.ambulanceAssigned.size()<lastTarget.getNoOfAmbulanceThatNeededToRescueMe()) { assignAmbulance(lastTarget); } } if (freeAmbulances.isEmpty()) return; for(Iterator it = targetSet.iterator(); it.hasNext();) { Humanoid tar = (Humanoid)it.next(); updateHumanoidProperty(tar); if (tar.ambulanceAssigned.size() <tar.getNoOfAmbulanceThatNeededToRescueMe()) { assignAmbulance(tar); } } } private void updateTargetSet() { HashSet finishedTarget = new HashSet(); for (Iterator it = targetSet.iterator() ; it.hasNext();) { Humanoid hum = (Humanoid )it.next(); if (hum.buriedness()<=3*hum.ambulanceAssigned.size()) finishedTarget.add(hum); } targetSet.removeAll(finishedTarget); noNeedRescue.addAll(finishedTarget); } private void assignAmbulance(Humanoid target) { if (freeAmbulances.isEmpty()) return; while(target.getNoOfAmbulanceThatNeededToRescueMe()>target.ambulanceAssigned.size() && !freeAmbulances.isEmpty() ) { AmbulanceTeam at =selectAmbulanceToAssign(target); if (at==null) { break; } else { messageManager.reportTarget(at,target); at.myAssignedTarget=target; freeAmbulances.remove(at); target.ambulanceAssigned.add(at); at.setTargetAssignmentTime(time()); } } }/////////////////////////////////////////////////////////////////////////////////////////// private AmbulanceTeam selectAmbulanceToAssign(Humanoid tar) { if (freeAmbulances.isEmpty() ) return null; List res = new ArrayList(); for (Iterator it = freeAmbulances.iterator() ; it.hasNext();) { AmbulanceTeam at = (AmbulanceTeam)it.next(); if (isAccesibleFromTo(at,tar.motionlessPosition())){ res.add(at); }// else// System.out.println("** AT :"+at.id +" CAN'T ACCESS TARGET :"+tar.id + " IN TIME:"+time()); } if(res.isEmpty()) return null; else{ List poses = POSITION_PRP.collect(res); Route rt = Router.get(tar.motionlessPosition(),poses,MOVING_COST_FUNCTION); MotionlessObject mo = rt.end; res = POSITION_PRP.equal(mo).extract(res); return (AmbulanceTeam) res.iterator().next(); } } private void rescueVictim() { if (!freeAmbulances.isEmpty()) { updateBuridAgent(); rescueAgentsTargets(); updateBuridCivilian(); rescueCivilianTargets(); } } private void updateBuridAgent() { if (world.buriedAgents.isEmpty()) return; agentVictimSet.clear(); agentVictimSet.addAll(world.buriedAgents); agentVictimSet.removeAll(agentTargetSet); agentVictimSet.removeAll(noNeedRescueAgent); } private void updateBuridCivilian() { civilianVictimSet.clear(); for (Iterator it = world.civilians.iterator();it.hasNext();) { Humanoid hum = (Humanoid)it.next(); if (hum.position()==null) continue; if ((hum.motionlessPosition() instanceof Building) && hum.assigned==false ) { Building bld = (Building)hum.motionlessPosition(); if ((hum.needRescue()|| hum.needLoad() )&& !bld.isBurned() &&(!bld.isBurning()|| hum.buriedness()<5 )) { updateHumanoidProperty(hum); // if (hum.getTimeToDead()< 600-time()) civilianVictimSet.add(hum); } } } civilianVictimSet.addAll(tempBuriedAgentSet); civilianVictimSet.removeAll(noNeedRescue); civilianVictimSet.removeAll(targetSet); Collections.sort(civilianVictimSet,timeToDeadComparator);// System.out.println(" ");// System.out.println(" TIME FOR UPDATE >>>>"+ time()+" Number Of Victim:"+civilianVictimSet.size()+" Number of Civilian:"+world.civilians.size() );// for (Iterator it = civilianVictimSet.iterator() ; it.hasNext();)// {// Humanoid hum = (Humanoid)it.next();// System.out.println("* Civ ID:"+hum.id + " HP:"+hum.hp()+" Buridness:"+hum.buriedness()+" TTD Injured:"+TimeToDeathFromInjury(hum) +" Real Time To Dead:"+hum.getTimeToDead() +" Buridness:"+hum.buriedness()+ " Is Rescueable:"+isRescueable(hum)+ " Time:"+hum.hearTime()); //System.out.println(" Injured ID:"+ hum.id +" Heared Time:"+hum.hearTime() +" Time:"+hum.time() +" HP:"+hum.hp() + " Buridness:"+hum.buriedness() );//// } } private Comparator timeToDeadComparator = new Comparator() { public int compare(Object o1, Object o2) { Humanoid h1 = (Humanoid) o1; Humanoid h2 = (Humanoid) o2; if (h1.getTimeToDead() > h2.getTimeToDead()) return 1; if (h1.getTimeToDead() == h1.getTimeToDead()) return 0; return -1; } }; private void updateHumanoidProperty(Humanoid hum) { int timeToDeadFromFire = 301; int timeToDeadFromInjured = 301; hum.calDistanceToNearestFire(world.burningBuildings); if (time() < 48) { timeToDeadFromInjured = hum.lifespan(); } else { timeToDeadFromInjured = TimeToDeathFromInjury(hum); } timeToDeadFromFire = TimeToDeathFromFire(hum); if (timeToDeadFromFire < timeToDeadFromInjured && hum.distanceToNearestFireSite < 30000 && world.burningBuildings.size()>=8) { hum.setTimeToDead(timeToDeadFromFire); } else { hum.setTimeToDead(timeToDeadFromInjured); } hum.updateNoOfAmbulanceThatNeededToRescueMe(world.ambulanceTeams.size()); } private void rescueAgentsTargets() { if (agentVictimSet.isEmpty()|| freeAmbulances.isEmpty()) return; Humanoid agentTarget = (Humanoid)selectAgentTargets(agentVictimSet); if (agentTarget!= null) { assingAmbulancesToBuridAgent(agentTarget); agentTargetSet.add(agentTarget); agentVictimSet.remove(agentTarget); rescueAgentsTargets(); } else { return; } } private Humanoid selectAgentTargets(ArrayList victimAgent) { Humanoid target; buridAT.clear(); buridFB.clear(); buridPF.clear();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -