📄 eambulancecenter.java
字号:
package MRL.Ambulance;import yab.agent.object.*;import yab.agent.*;import java.util.*;import MRL.Utilities.*;public class EAmbulanceCenter extends AmbulanceCenter implements ConstantConditions { public EAmbulanceCenter(int id,DisasterSpace world){ super(id,world); } public final Map <AmbulanceTeam , Map <Building , Integer>> ambulanceTeamAccessibleBldgs = new HashMap(); public final Map <Building , Map <Building , Integer> > buildingHasAccessAmbulanceTeams = new HashMap(); private final List ambulanceTeams = world.ambulanceTeams; public void initATs(){ AmbulanceTeam at; for(Iterator it = ambulanceTeams.iterator();it.hasNext();){ at = (AmbulanceTeam) it.next(); initAT(at); } } private void initAT(AmbulanceTeam at){ Map accessibleBldgs = new HashMap(); ambulanceTeamAccessibleBldgs.put(at,accessibleBldgs); Map checkResult = new HashMap(); atCheckResultMap.put(at,checkResult); atCheckTimeMap.put(at,0); } private void initBuilding(Building bldg){ final Map hasAccessATs = new HashMap(); buildingHasAccessAmbulanceTeams.put(bldg,hasAccessATs); } public void updateAccessiblity(){ Collection hums = world.needRescueCivs; List poses = POSITION_PRP.collect(hums); Object obj; Building bldg; AmbulanceTeam at; for(Iterator it = poses.iterator();it.hasNext();){ obj = it.next(); if(obj == null || !(obj instanceof Building)){ continue; } bldg = (Building) obj; for(Iterator it2 = ambulanceTeams.iterator();it2.hasNext();){ at = (AmbulanceTeam) it2.next(); isBldgAccessibleForAt(at,bldg); } } } private final Map <AmbulanceTeam , Integer> atCheckTimeMap = new HashMap() ; private final Map <AmbulanceTeam , Map <Building , Boolean> > atCheckResultMap = new HashMap(); public boolean isBldgAccessibleForAt(AmbulanceTeam at , Building bldg){ Map accessibleBldgs = ambulanceTeamAccessibleBldgs.get(at); if(accessibleBldgs.containsKey(bldg)) return true; Map checkResult= atCheckResultMap.get(at); Integer lastTimeChecked = atCheckTimeMap.get(at); if( lastTimeChecked == time()){ if(checkResult.containsKey(bldg)) return ((Boolean)checkResult.get(bldg)).booleanValue(); } else checkResult.clear(); Node start = HumanoidAgent.outsidePosition(at); if(start != null){ atCheckTimeMap.remove(at); atCheckTimeMap.put(at,time()); checkResult.remove(bldg); Route rt = Router.get(start , Collections.singleton(bldg),HumanoidAgent.RELIABILITY_COST_FUNCTION);// if(rt.cost >= IN_BLOCKS){// checkResult.put(bldg,false);// return false;// }// else if(rt.cost < NOT_SEEN_RD){ accessibleBldgs.put(bldg,time()); if(! buildingHasAccessAmbulanceTeams.containsKey(bldg)) initBuilding(bldg); Map hasAccessAts = buildingHasAccessAmbulanceTeams.get(bldg); hasAccessAts.put(at,time()); checkResult.put(bldg,true); return true; } else { checkResult.put(bldg,false); return false; } } else{ System.err.println(this + " , Invalid Start Position For : " + at + " In Time : " + time()); checkResult.put(bldg,false); return false; } } public Collection getHasAccessAmbulanceTeams(Building bldg){ return buildingHasAccessAmbulanceTeams.get(bldg).keySet(); } public Collection getAccessibleBuildingsForAT(AmbulanceTeam at){ return ambulanceTeamAccessibleBldgs.get(at).keySet(); } public AmbulanceTeam getNearestFreeAmbulanceTeamToTarget(Collection freeAmbulances , Building bldg , boolean shouldBeAccessible){ AmbulanceTeam at,res = null; int dist , best = Integer.MAX_VALUE; for(Iterator it = freeAmbulances.iterator();it.hasNext();){ at = (AmbulanceTeam) it.next(); if(shouldBeAccessible){ if(!isBldgAccessibleForAt(at,bldg)) continue; } dist = Util.distance(at,bldg); if(dist < best){ res = at; best = dist; } } return res; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -