⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ambulanceteamagent.java

📁 2004年robotcup世界冠军源代码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
      }  }  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 + -