@Override
  public int getDecyzjaSterujaca(float ocenaStanu, int[] stan, int iloscAkcji) {
    int akcja = 0;

    System.out.println("Ilość akcji:" + iloscAkcji);

    // Sprawdzenie czy istnieje choć jedna niepusta kolejka
    boolean niepuste = false;
    for (int i = 0; i < serwer.getIloscKolejek(); i++) {
      if (serwer.getKolejka(i).getIloscZgloszen() > 0) {
        niepuste = true;
        //				break;

      }
      System.out.print(serwer.getKolejka(i).getIloscZgloszen() + " : ");
    }
    System.out.println();

    // Wylosowanie kolejki, jeżeli choć jedna jest niepusta
    if (niepuste) {
      do {
        akcja = generator.nextInt(iloscAkcji);
        System.out.println("Decyzja sterująca: " + akcja);
      } while (serwer.getKolejka(akcja).getIloscZgloszen() == 0);
    }

    return akcja;
  }
  @Override
  protected void konfiguracjaMetoda2(Serwer serwerBadania) {
    setParametryPodstawowe(serwerBadania);

    IStan reprezentacjaStanu;
    //		reprezentacjaStanu = new StanLiczbaSpelnionychOgraniczen();
    reprezentacjaStanu = new StanSortowanLiczbaZgloszenZOgraniczeniami();
    //		reprezentacjaStanu = new StanSortowanyCzasOczekiwaniaZOgraniczeniami();
    serwerBadania.setReprezentacjaStanu(reprezentacjaStanu);

    //		FunkcjaOceny_I fOceny = new OcenaTimeRosnacoOrginalna(c1,c2,c3);
    FunkcjaOceny_I fOceny = new OcenaTimeRosnacoOrginalna2(c1, c2, c3, C4);
    serwerBadania.setFunkcjaOceny(fOceny);
    //
    Strategia_A strategiaEzachlanna =
        new StrategiaSoftMax(
            T_START,
            T_KONIEC,
            T_ITERACJI,
            serwerBadania.getMaxStanow(),
            serwerBadania.getIloscAkcji());

    Sterownik sterownik;
    sterownik = new QLearning(strategiaEzachlanna, alfa, gamma);
    serwerBadania.setSterownik(sterownik);
  }
  /** @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;
  }
  private void setParametryPodstawowe(Serwer serwerBadania) {
    serwerBadania.setMaxZgloszen(50);
    //    	serwer1.setMaxCzasOczekiwania(200);
    serwerBadania.getKolejka(0).setMaxCzasOczekiwania(100);
    serwerBadania.getKolejka(1).setMaxCzasOczekiwania(60);
    serwerBadania.getKolejka(2).setMaxCzasOczekiwania(40);
    serwerBadania.getKolejka(3).setMaxCzasOczekiwania(Integer.MAX_VALUE);

    // Serwer za kazdym razem obsluguje tylko jedno zgloszenie
    serwerBadania.setRozkladCzasuObslugi(new RozkladJednostajnyDyskretny(1));
    //    	serwer1.setRozkladIlosciPrzybyc(new RozkladRownomierny(0,3));
    serwerBadania.getKolejka(0).setRozkladIlosciPrzybyc(new RozkladBernouliego(15));
    serwerBadania.getKolejka(1).setRozkladIlosciPrzybyc(new RozkladBernouliego(15));
    serwerBadania.getKolejka(2).setRozkladIlosciPrzybyc(new RozkladBernouliego(20));
    serwerBadania.getKolejka(3).setRozkladIlosciPrzybyc(new RozkladBernouliego(45));

    serwerBadania.setRozkladCzasuNastawy(new RozkladJednostajnyDyskretny(0));
    serwerBadania.setWaga(1);
  }