📄 ambulanceteamagent.java
字号:
/** * Creat By Omid AmirGhiasvand: * 3 Apr 2006 * * Last Edit: * 2006-06-29 * 12:34 pm * */package MRL.Ambulance;import java.net.*;import java.util.*;import yab.agent.*;import yab.agent.object.*;import yab.agent.object.Refuge;import MRL.Utilities.*;import MRL.Utilities.MessageManagement.AgentMessageManager;import MRL.Utilities.MessageManagement.AgentNoStationMessageManager;import yab.agent.*;import yab.agent.Agent.ActionCommandException;public class AmbulanceTeamAgent extends AbstractAmbulanceTeamAgent implements ConstantConditions { private boolean iDecide=false; private HashSet victimSet = new HashSet(); private boolean mainAT=false; private boolean loaderAT=false; private boolean setMyType=false; private HashSet noNeedRescue = new HashSet(); private int targetSelectionTime =-1; private int startRescueTime=-1; private MotionlessObject myLastPlace; public AmbulanceTeamAgent(InetAddress address, int port) { super(address, port);// if (!world.ambulanceCenters.isEmpty())// iDecide=true; if (world.ambulanceCenters.isEmpty()) messageManager = new AgentNoStationMessageManager(socket(), world); else messageManager = new AgentMessageManager(socket(), world); socket().akAcknowledge(self().id); } protected MotionlessObject mlpos() { return self().motionlessPosition(); } protected void prepareForAct() { super.prepareForAct(); if (time() ==3) { if (world.ambulanceCenters.isEmpty()) { iDecide=true; } } if (iDecide==false) setMyNextTargetAsTarget(); messageManager.sendMessages(); } private void setMyNextTargetAsTarget() { if (self().myAssignedTarget==null && self().tempTarget!=null ) { self().setTargetAssignmentTime(-1); self().myAssignedTarget = self().tempTarget; self().setTargetAssignmentTime(time()); self().setTargetachivementTime(-1); self().tempTarget=null; } } protected void act() throws ActionCommandException { super.act(); if (time() <=TIME_STARTING_ACTION) return; needToGoRefuge(); if (iDecide==false) { requestTargetFromCenter(); rescueTargetAssignedByCenter(); } else { rescueMySelectedTarget(); } searchCivilians(false);// if (iDecide==false)// helpOtherAmbulanceTeam(); restAtRefuge(); } private void helpOtherAmbulanceTeam() { HashSet temp = new HashSet(); if (self().myAssignedTarget==null) { System.out.println(" I AM FREE :"+ self().id + " In time:"+time() ); for (Iterator it = world.ambulanceTeams.iterator() ; it.hasNext();) { AmbulanceTeam at = (AmbulanceTeam) it.next(); if (at.myAssignedTarget!= null && at.myAssignedTarget.buriedness()>5 ) temp.add(at); } Humanoid nearestHuman; if (!temp.isEmpty()) { nearestHuman = (Humanoid) distancePrp.min(temp); System.out.println(" EXTRA TARGET SET FOR ME "+nearestHuman); self().myAssignedTarget=nearestHuman; } } } private void requestTargetFromCenter() { if (self().myAssignedTarget==null && self().buriedness()<=5) { request(); } } private void requestTargetFromCenterSooner() { int workGroup=myWorkGroup().size(); if (tempNumberOfATforLastRescue!=1&&workGroup==1 && self().myAssignedTarget.buriedness()==0) { request(); } else if (workGroup!=1&&mainAT==true && workGroup*3 >= self().myAssignedTarget.buriedness()) { request(); } else if (workGroup!=1&& mainAT==false && workGroup*4>= self().myAssignedTarget.buriedness()) { request(); } } private void request() { if (time()<=11) return; if (self().getRequestForTargetTime()==-1 ) { messageManager.reportRequestTarget(); self().setRequestForTargetTime(time()); } else if ( time() -self().getRequestForTargetTime()>=4 ) { self().setRequestForTargetTime( -1); request(); } } private void rescueTargetAssignedByCenter() throws ActionCommandException { if (self().myAssignedTarget!= null) { if (mlpos() == self().myAssignedTarget.motionlessPosition()) { if (self().myAssignedTarget.isVisible()) { if (setMyType==false &&self().myAssignedTarget.buriedness()<=5*myWorkGroup().size()) setLoaderAndMainAT(myWorkGroup()); requestTargetFromCenterSooner(); if (self().myAssignedTarget.needRescue()) { if (self().myAssignedTarget.buriedness()<myWorkGroup().size()) { if (mainAT==true) rescue(self().myAssignedTarget); else { // System.err.println(" I am not main at:"+self().id +" In time:"+time()); self().myAssignedTarget=null; setMyType=false; setMyNextTargetAsTarget(); rescueTargetAssignedByCenter(); } } else rescue(self().myAssignedTarget); } else if (self().myAssignedTarget.needLoad()) { if (loaderAT == true) { mainAT=false; loaderAT=false; setMyType=false; noNeedRescue.add(self().myAssignedTarget); load(self().myAssignedTarget); } else { setMyType=false; mainAT=false; noNeedRescue.add(self().myAssignedTarget); self().myAssignedTarget = null; setMyNextTargetAsTarget();/////////??? rescueTargetAssignedByCenter();//////////??? } } else // no need rescue and no need load { // System.out.println(" I AM AT:"+self().id +" My TARGET :"+self().myAssignedTarget.id +" IS LOST IN TIME:"+time()); noNeedRescue.add(self().myAssignedTarget); self().myAssignedTarget = null; setMyType=false; mainAT=false; loaderAT=false; setMyNextTargetAsTarget(); rescueTargetAssignedByCenter(); } } else { /// the target is lost or invisible self().myAssignedTarget = null; request(); } } else { move(self().myAssignedTarget.motionlessPosition()); } } else // i have no target that assign me by center so i going to select myself{ return; } int tempNumberOfATforLastRescue=0; private void setLoaderAndMainAT(ArrayList workGroup ) { int numberOfAmbulanceForLastRescue= self().myAssignedTarget.buriedness()%workGroup.size() ; tempNumberOfATforLastRescue=numberOfAmbulanceForLastRescue; if (numberOfAmbulanceForLastRescue==0) numberOfAmbulanceForLastRescue=workGroup.size(); if (self().myAssignedTarget instanceof Civilian) { AmbulanceTeam loader = (AmbulanceTeam)workGroup.get(0); if (self().id == loader.id) { loaderAT = true; mainAT=true; } for (int i=1 ;i<numberOfAmbulanceForLastRescue;i++) { AmbulanceTeam at = (AmbulanceTeam)workGroup.get(i); if (self().id == at.id) { mainAT = true; } } } else // plotoon target { for (int i=0 ;i<numberOfAmbulanceForLastRescue;i++) { AmbulanceTeam at = (AmbulanceTeam)workGroup.get(i); if (self().id == at.id) { mainAT = true; } } } setMyType=true; } private void setLoaderAndMainAT2(ArrayList workGroup ) { int numberOfAmbulanceForLastRescue= self().mySelectedTarget.buriedness()%workGroup.size() ; if (numberOfAmbulanceForLastRescue==0) numberOfAmbulanceForLastRescue=workGroup.size(); if (self().mySelectedTarget instanceof Civilian) { AmbulanceTeam loader = (AmbulanceTeam)workGroup.get(0); if (self().id == loader.id) { loaderAT = true; mainAT=true; } for (int i=1 ;i<numberOfAmbulanceForLastRescue;i++) { AmbulanceTeam at = (AmbulanceTeam)workGroup.get(i); if (self().id == at.id) { mainAT = true; } } } else // plotoon target { for (int i=0 ;i<numberOfAmbulanceForLastRescue;i++) { AmbulanceTeam at = (AmbulanceTeam)workGroup.get(i); if (self().id == at.id) { mainAT = true; } } } setMyType=true; }////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Agent Base Part private void rescueMySelectedTarget() throws ActionCommandException { updateMyVictimSet(); updateVictimAccessibility(); checkCondition(); rescueVictim(); } private void updateMyVictimSet() { victimSet.clear(); for (Iterator it = world.civilians.iterator();it.hasNext();) { Humanoid hum = (Humanoid)it.next(); if (hum.position() == null) continue; if ((hum.motionlessPosition() instanceof Building) ) { Building bld = (Building)hum.motionlessPosition(); if ((hum.needRescue()|| hum.needLoad() )&& !bld.isBurned() &&(!bld.isBurning()|| hum.buriedness()<5 )) { updateHumanoidProperty(hum); victimSet.add(hum); } } } victimSet.addAll(world.buriedAgents); victimSet.removeAll(noNeedRescue); //Collections.sort(civilianVictimSet,timeToDeadComparator); } private void checkCondition() throws ActionCommandException { checkmyTarget(); cheackMyPlace(); } private void checkmyTarget() throws ActionCommandException { if (self().mySelectedTarget == null) { return; } else // i have target my self { if( self().mySelectedTarget.motionlessPosition() == mlpos() ) { if (time()-startRescueTime>=3) { if (self().mySelectedTarget.isRescueAble(myWorkGroup().size())) return; else { noNeedRescue.add(self().mySelectedTarget); self().mySelectedTarget=null; rescueVictim(); } } else return; } else if ( time() - targetSelectionTime>4) { Humanoid temp; self().mySelectedTarget.setAccesible(false); self().mySelectedTarget.notAccseesibleTime=time(); self().mySelectedTarget = null; rescueVictim(); } } } private void cheackMyPlace() throws ActionCommandException { if ((mlpos() instanceof Building) && self().mySelectedTarget!= null) { Building bu = (Building)self().motionlessPosition(); if (bu.isBurned() ) ///////// { if (self().mySelectedTarget.buriedness()<=2 ) return; else { noNeedRescue.add(self().mySelectedTarget); victimSet.remove(self().mySelectedTarget); self().mySelectedTarget= null; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -