/** @return Zwraca wartość jeżeli nastąpiła poprawa stanu */
  protected float getR_stan(Serwer serwer) {
    float result = 0;
    Porownanie p = serwer.getReprezentacjaStanu().compare(serwer, poprzedniStan);

    if (p == Porownanie.Lepszy) {
      result = c3;
    }

    //		if(p != Porownanie.NieMoznaPorownac) {
    //			result = c3 *  serwer.getReprezentacjaStanu().compareWspolczynnik(serwer, poprzedniStan);
    //		}

    return result;
  }
  /*
   * Średnia ważona ilości zgłoszeń
   * @see pl.wroc.pwr.iis.polling.model.ocena.ModulOceniajacy#ocenaSytuacji(pl.wroc.pwr.iis.polling.model.object.Serwer)
   */
  public double ocenaSytuacji(Serwer serwer) {
    float r_time = 0;
    for (int i = 0; i < serwer.getIloscKolejek() - 1; i++) {
      Kolejka kolejka = serwer.getKolejka(i);

      double r_time_i = 0;
      double R = kolejka.getMaxCzasOczekiwania();
      //			float M = kolejka.getSredniCzasOczekiwania();
      double M = kolejka.getCzasOczekiwania();

      if (M <= R) {
        r_time_i = c1 * M / (-3.0 * R * R) + 4.0 / 3.0 * c1;
      } else {
        r_time_i = c2 / R * M * -.5;
        //				r_time_i = -0.1*(c2*M/R);
      }

      float W = kolejka.getWaga();
      r_time += r_time_i * W;
    }
    Kolejka kolejka = serwer.getKolejka(serwer.getIloscKolejek() - 1);
    //		float M = kolejka.getSredniCzasOczekiwania();
    double M = kolejka.getCzasOczekiwania();

    maxR = Math.max(M, maxR);

    //		double d = ((-c4*M/maxR) + c4);
    double d = -M / (float) c4;

    r_time += d;

    float r_stan = getR_stan(serwer);

    // Zapisanie stanu
    this.poprzedniStan = serwer.getReprezentacjaStanu().getStan(serwer);
    return r_time + r_stan;
  }