📄 ambulanceteamagent.java
字号:
} } else if (mlpos() instanceof Road ) { if (myLastPlace==mlpos() ) { searchTheMap(); } } else if(mlpos() instanceof Node) { if (myLastPlace==mlpos() ) { searchTheMap(); } } myLastPlace=mlpos(); } public void rescueVictim() throws ActionCommandException { if (self().mySelectedTarget != null) { if (mlpos() == self().mySelectedTarget.motionlessPosition()) { if (self().mySelectedTarget.isVisible()) { if (setMyType==false &&self().mySelectedTarget.buriedness()<=6*myWorkGroup().size()) setLoaderAndMainAT2(myWorkGroup()); if (self().mySelectedTarget.needRescue()) { if (startRescueTime==-1) startRescueTime=time(); if (self().mySelectedTarget.buriedness()<myWorkGroup().size()) { if (mainAT==true) rescue(self().mySelectedTarget); else { // System.err.println(" I am not main at:"+self().id +" In time:"+time()); self().mySelectedTarget=null; setMyType=false; } } else rescue(self().mySelectedTarget); } else if (self().mySelectedTarget.needLoad()) { System.out.println(" >>> I am AT:"+self().id +" Target Need Load:"+self().mySelectedTarget+" In Time:"+time() +" I am Loader:"+loaderAT ); if (loaderAT == true) { mainAT=false; loaderAT=false; setMyType=false; startRescueTime=-1; noNeedRescue.add(self().mySelectedTarget); load(self().mySelectedTarget); } else { setMyType=false; mainAT=false; startRescueTime=-1; noNeedRescue.add(self().mySelectedTarget); victimSet.remove(self().mySelectedTarget); self().mySelectedTarget = null; moveOrselect(); } } else { // no need rescue and no need load startRescueTime=-1; noNeedRescue.add(self().mySelectedTarget); victimSet.remove(self().mySelectedTarget); self().mySelectedTarget = null; moveOrselect(); } } else { // System.err.println("Invisible Target "); startRescueTime=-1; noNeedRescue.add(self().mySelectedTarget); victimSet.remove(self().mySelectedTarget); self().mySelectedTarget = null; moveOrselect(); } } else { moveOrselect(); } } else { // i have no target moveOrselect(); } } public void moveOrselect() throws ActionCommandException { if (victimSet.isEmpty()) { return; } if (self().mySelectedTarget != null) { if (mlpos() == self().mySelectedTarget.motionlessPosition()) { rescueVictim(); } else { move(self().mySelectedTarget.motionlessPosition()); } } else { // i have no target self().mySelectedTarget = selectTarget(); if (self().mySelectedTarget != null) { if (self().mySelectedTarget.motionlessPosition() == mlpos()) rescueVictim(); else move(self().mySelectedTarget.motionlessPosition()); } else { return; } } } public Humanoid selectTarget() { // updateVictim(); Iterator it = victimSet.iterator(); for (; it.hasNext(); ) { Humanoid hum = (Humanoid) it.next(); if (hum.isAccessible()) { self().mySelectedTarget = hum; break; } } for (; it.hasNext(); ) { Humanoid hum = (Humanoid) it.next(); if (hum.getvalue() < self().mySelectedTarget.getvalue() && hum.isAccessible() && isTargetAccessible(hum)) { self().mySelectedTarget = hum; } } targetSelectionTime = time(); return self().mySelectedTarget;} private void updateVictimAccessibility() { for (Iterator it =victimSet.iterator() ; it.hasNext() ;) { Humanoid hum = (Humanoid )it.next(); if (!hum.isAccessible()) { if (isTargetAccessible(hum)) { hum.setAccesible(true); hum.notAccseesibleTime=time(); } else if (time()-hum.notAccseesibleTime>=15 ) { hum.setAccesible(true); hum.notAccseesibleTime=time(); } } } } 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 needToGoRefuge() throws ActionCommandException { Collections.sort(world.refuges,distanceComparator); //??? if ((self().hp() < 5500 && self().damage() > 4) || self().damage()>=400 ) { restAtRefuge(); } if (isLoadingInjured()) { if (mlpos() instanceof Refuge ) { noNeedRescue.add( self().mySelectedTarget); noNeedRescue.add(self().myAssignedTarget); self().myAssignedTarget=null; self().mySelectedTarget=null; unload(); } else { move(world.refuges); } } else { return; } } private Comparator distanceComparator = new Comparator() { public int compare(Object o1, Object o2) { Refuge r1 = (Refuge) o1; Refuge r2 = (Refuge) o2; if (self().distance(r1) > self().distance(r2)) return 1; if (self().distance(r1) == self().distance(r2)) return 0; return -1; } }; public ArrayList myWorkGroup() { // Ambulance Team that work with me + myself ArrayList workGroup = new ArrayList(); for (Iterator it = world.ambulanceTeams.iterator();it.hasNext();) { AmbulanceTeam at = (AmbulanceTeam)it.next(); if (at.id==self().id) workGroup.add(at); if ( at.myAssignedTarget!= null && at.myAssignedTarget==self().myAssignedTarget && self().motionlessPosition()==at.motionlessPosition()&& world.updatedmovingobjects.contains(at)) { workGroup.add(at); } } return workGroup; } public int selectAmbulenceToLoadAndCarry(ArrayList workGroup) { Iterator it = workGroup.iterator(); AmbulanceTeam cond = (AmbulanceTeam) it.next(); for (; it.hasNext(); ) { AmbulanceTeam tmp = (AmbulanceTeam) it.next(); if (tmp.id < cond.id) { cond = tmp; } } return cond.id; } protected void searchTheMap() throws ActionCommandException { // System.out.println(" I am in seraching the map ..."); if (!world.unvisitedBuildings.isEmpty()) { move(world.unvisitedBuildings); } } protected void hearTellBin(RealObject sender, byte[] message) { if (sender.id != self().id) messageManager.importMessage(message, time(), sender); } protected void hearTell(RealObject sender, String msg) { //do nothing } protected void hear(RealObject sender, String msg) { // do nothing } protected void hearSay(RealObject sender, String msg) { super.hearSay(sender, msg); }///////////////////////////////////////////////////////////////////////// int TimeFiredMapUpdate = 0; HashMap NearestFiredMap = new HashMap(); private Building NearestFiredBlg(Building blg) { if (TimeFiredMapUpdate < world.time()) { TimeFiredMapUpdate = world.time(); NearestFiredMap.clear(); for (Iterator it = world.buildings.iterator(); it.hasNext(); ) { Building b = (Building) it.next(); if (b.isBurning()) { for (Iterator it2 = world.buildings.iterator(); it2.hasNext(); ) { Building bu = (Building) it2.next(); Building nbu = (Building) NearestFiredMap.get(bu); if (!NearestFiredMap.containsKey(bu) || SqrDistance(nbu, bu) > SqrDistance(b, bu)) NearestFiredMap.put(bu, bu); } //for } //if } //for } //if Building bl = (Building) NearestFiredMap.get(blg); return bl; } private long SqrDistance(Building b1, Building b2) { long dx = b1.x() - b2.x(); long dy = b1.y() - b2.y(); return dx * dx + dy * dy; } private int TimeToDeathFromFire(Humanoid injured) { if (injured.motionlessPosition() == null || !(injured.motionlessPosition() instanceof Building)) return Integer.MAX_VALUE; Building b = (Building) injured.motionlessPosition(); if (NearestFiredBlg(b) == null) return Integer.MAX_VALUE; return (int) (java.lang.Math.floor(XYDistance(b, NearestFiredBlg(b)) / 1000)); } private double XYDistance(Building b1, Building b2) { return java.lang.Math.pow(java.lang.Math.pow(b1.x() - b2.x(), 2) + java.lang.Math.pow(b1.y() - b2.y(), 2), 0.5); } private int TimeToDeathFromInjury(Humanoid injured) { int damage = injured.damage(); int hp = injured.hp(); int time=Math.max(injured.time(), injured.hearTime()); if (!(injured.motionlessPosition() instanceof Building)) { if (injured.damage()==0) return Integer.MAX_VALUE; else return (hp-(world.time()-time)*damage)/damage; } Building bu = (Building) injured.motionlessPosition(); if (bu != null && bu.isBurning()) { return 0; } int timeto_death = 0; if (damage > 0 && hp < 10000) { double alpha = 0; double newAlpha = 0.01; while (java.lang.Math.abs(alpha - newAlpha) > 1E-10) { alpha = newAlpha; double tmp = java.lang.Math.exp( -alpha * time); newAlpha = ((alpha * time + 1) * tmp - 1) / (time * tmp - (double) (10000 - hp) / damage); } if (alpha> 0) timeto_death = time - world.time() + (int) (java.lang.Math.ceil((7.0 / 8) * java.lang.Math.log(alpha * hp /damage + 1) / alpha)); else timeto_death=(hp-(world.time()-time)*damage)/damage; return timeto_death; } return Integer.MAX_VALUE / 2; } public boolean isTargetAccessible(Humanoid hum) { if(! (hum.position() instanceof Building)){ System.err.println(self() + " , Error , Humanoid's Position Not Instanceof Building : " + hum); return false; } Building bldg = (Building) hum.motionlessPosition(); return REACHABLE_C.eval(bldg); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -