Ejemplo n.º 1
0
  public void loadRandomScenario(int numDist, int numPetro, boolean save, int initialState) {
    if (numDist < 1) numDist = 1;
    if (numPetro < 1) numPetro = 1;
    ArrayList distribuidores = new ArrayList();
    ArrayList petroliferes = new ArrayList();

    //		 Generem les plataformes distribuidores
    for (int i = 0; i < numDist; i++) {
      distribuidores.add(
          new PlataformaDistribuidora(PetroliUtils.getRandomIntBetween(0, PetroliUtils.MAX_EIX_X)));
    }

    // Generem les plataformes petroliferes
    for (int i = numDist; i < numDist + numPetro; i++) {
      petroliferes.add(
          new PlataformaPetrolifera(
              PetroliUtils.getRandomIntBetween(0, PetroliUtils.MAX_EIX_X),
              PetroliUtils.getRandomIntBetween(1, PetroliUtils.MAX_EIX_Y),
              PetroliUtils.getRandomIntBetween(1, 5)));
    }

    load(petroliferes, distribuidores);

    // saveInitialState("initial.pet");

    if (initialState == 2) initialState2();
    if (initialState == 3) initialState3();
    else return;
  }
Ejemplo n.º 2
0
  private void propagar(int plataforma, int quantitat, int cost) {
    //   System.out.println("Propaguem a " + plataforma + " quantitat " + quantitat + " i cost " +
    // cost);
    PlataformaConectada pcAux = (PlataformaConectada) connexions[plataforma].clone();
    // Incrementem el petroli del que disposa la plataforma
    connexions[plataforma].setPetSortida(connexions[plataforma].getPetSortida() + quantitat);
    connexions[plataforma].setCost(pcAux.getCost() + cost);
    // Calculem el petroli que es bombejar� amb el nou canvi
    if (connexions[plataforma].getPetSortida() > connexions[plataforma].getBombeig())
      connexions[plataforma].setPetBombejat(connexions[plataforma].getBombeig());
    else connexions[plataforma].setPetBombejat(connexions[plataforma].getPetSortida());

    if (connexions[plataforma].isConnected()) {
      // System.out.println("Propagarem les diferencies");
      // System.out.println("LA tuberia abans costava " + pcAux.getCostTuberia());
      connexions[plataforma].setCostTuberia(
          calculaCostTuberia(
              distancies[plataforma][(connexions[plataforma].getSortida())],
              connexions[plataforma].getPetBombejat()));
      // System.out.println("I ara, " connexions[plataforma].getCostTuberia());
      cost +=
          PetroliUtils.getCostBombeig(connexions[plataforma].getBombeig())
              - PetroliUtils.getCostBombeig(pcAux.getBombeig());
      cost += connexions[plataforma].getCostTuberia() - pcAux.getCostTuberia();

      propagar(
          connexions[plataforma].getSortida(),
          connexions[plataforma].getPetBombejat() - pcAux.getPetBombejat(),
          cost);
    }

    if (plataformes[plataforma]
        .isPlataformaDistribuidora()) { // Si arriba m�s o menys petroli a una plataforma
      // Distribuidora SEMPRE surt a compte modificar el seu
      // bombeig
      this.costTotal += connexions[plataforma].getCost() - pcAux.getCost();
      this.petroliTotal += connexions[plataforma].getPetBombejat() - pcAux.getPetBombejat();
      if (connexions[plataforma].getPetSortida() <= PetroliUtils.CONST_TIPUS_BOMBEIG_NO)
        modificarBombeig(plataforma, PetroliUtils.CONST_TIPUS_BOMBEIG_NO);
      else if (connexions[plataforma].getPetSortida() <= PetroliUtils.CONST_TIPUS_BOMBEIG_NO)
        modificarBombeig(plataforma, PetroliUtils.CONST_TIPUS_BOMBEIG_NO);
      else if (connexions[plataforma].getPetSortida() <= PetroliUtils.CONST_TIPUS_BOMBEIG_A)
        modificarBombeig(plataforma, PetroliUtils.CONST_TIPUS_BOMBEIG_A);
      else if (connexions[plataforma].getPetSortida() <= PetroliUtils.CONST_TIPUS_BOMBEIG_B)
        modificarBombeig(plataforma, PetroliUtils.CONST_TIPUS_BOMBEIG_B);
      else if (connexions[plataforma].getPetSortida() <= PetroliUtils.CONST_TIPUS_BOMBEIG_C)
        modificarBombeig(plataforma, PetroliUtils.CONST_TIPUS_BOMBEIG_C);
      else modificarBombeig(plataforma, PetroliUtils.CONST_TIPUS_BOMBEIG_D);
    }

    return;
  }
Ejemplo n.º 3
0
  public void modificarBombeig(int plataforma, int tipusBombeig) {

    // System.out.println("Modificar bombeig de plataforma");

    if ((tipusBombeig != PetroliUtils.CONST_TIPUS_BOMBEIG_A)
        && (tipusBombeig != PetroliUtils.CONST_TIPUS_BOMBEIG_B)
        && (tipusBombeig != PetroliUtils.CONST_TIPUS_BOMBEIG_C)
        && (tipusBombeig != PetroliUtils.CONST_TIPUS_BOMBEIG_D)
        && (tipusBombeig != PetroliUtils.CONST_TIPUS_BOMBEIG_NO)) return;
    // System.out.println("Actualitzem el petroli bombejat");

    PlataformaConectada aux = (PlataformaConectada) connexions[plataforma].clone();

    if (aux.getBombeig() == tipusBombeig) return;

    connexions[plataforma].setBombeig(tipusBombeig);
    connexions[plataforma].setCost(
        connexions[plataforma].getCost()
            - PetroliUtils.getCostBombeig(aux.getBombeig())
            + PetroliUtils.getCostBombeig(connexions[plataforma].getBombeig()));

    if (connexions[plataforma].getPetSortida() > connexions[plataforma].getBombeig())
      connexions[plataforma].setPetBombejat(connexions[plataforma].getBombeig());
    else connexions[plataforma].setPetBombejat(connexions[plataforma].getPetSortida());

    // Si és plataforma distribuidora, vol dir que bombejem més petroli final si es que en tenim
    if (plataformes[plataforma].isPlataformaDistribuidora()) {
      this.petroliTotal =
          this.petroliTotal - aux.getPetBombejat() + connexions[plataforma].getPetBombejat();
      this.costTotal = this.costTotal - aux.getCost() + connexions[plataforma].getCost();
    } else {
      if (!connexions[plataforma].isConnected()) return;

      connexions[plataforma].setCostTuberia(
          calculaCostTuberia(
              distancies[plataforma][(connexions[plataforma].getSortida())],
              connexions[plataforma].getPetBombejat()));
      int costPropagat =
          PetroliUtils.getCostBombeig(connexions[plataforma].getBombeig())
              - PetroliUtils.getCostBombeig(aux.getBombeig());
      costPropagat = costPropagat - aux.getCostTuberia() + connexions[plataforma].getCostTuberia();

      propagar(
          connexions[plataforma].getSortida(),
          connexions[plataforma].getPetBombejat() - aux.getPetBombejat(),
          costPropagat);
    }
  }
Ejemplo n.º 4
0
  public void intercanviar(int plataformaOrigen, int plataformaDesti) {
    // System.out.println("Intercanviem " + plataformaOrigen + " amb " + plataformaDesti);

    if (!plataformes[plataformaOrigen].isPlataformaPetrolifera()) return;
    if (!connexions[plataformaOrigen].isConnected()) return;
    if (connexions[plataformaOrigen].getSortida() == plataformaDesti) return;
    if ((plataformes[plataformaDesti].isPlataformaDistribuidora())
        || (plataformes[plataformaDesti].isPlataformaPetrolifera()
            && connexions[plataformaDesti].isConnected())) {

      //	System.out.println("L'arrel de la plat original era: " + getArrel(plataformaOrigen) );

      propagar(
          connexions[plataformaOrigen].getSortida(),
          -(connexions[plataformaOrigen].getPetBombejat()),
          -(connexions[plataformaOrigen].getCost()
              + connexions[plataformaOrigen].getCostTuberia()));

      connexions[plataformaOrigen].setPetBombejat(0);
      connexions[plataformaOrigen].setCostTuberia(0);
      connexions[plataformaOrigen].setCost(
          connexions[plataformaOrigen].getCost()
              - PetroliUtils.getCostBombeig(connexions[plataformaOrigen].getBombeig()));
      connexions[plataformaOrigen].setBombeig(0);
      connexions[connexions[plataformaOrigen].getSortida()].setNumConnex(
          connexions[connexions[plataformaOrigen].getSortida()].getNumConnex() - 1);

      // modificarBombeig(plataformaOrigen, PetroliUtils.CONST_TIPUS_BOMBEIG_NO);
      connexions[plataformaOrigen].setSortida(plataformaDesti);
      connexions[plataformaOrigen].setConnected(true);
      connexions[plataformaDesti].setNumConnex(connexions[plataformaDesti].getNumConnex() + 1);

      /*	if (plataformes[plataformaDesti].isPlataformaDistribuidora())
      	connexions[plataformaOrigen].setArrel(plataformaDesti);
      else
      	connexions[plataformaOrigen].setArrel(connexions[plataformaDesti].getArrel());*/

      for (int i = 0; i < platPropera.length; i++) {
        if (platPropera[i] == plataformaOrigen) platPropera[i] = getPlatProperaNoConectada(i);
      }

      PlataformaPetrolifera pOrigen = (PlataformaPetrolifera) plataformes[plataformaOrigen];

      propagar(
          connexions[plataformaOrigen].getSortida(), 0, connexions[plataformaOrigen].getCost());
      modificarBombeig(plataformaOrigen, PetroliUtils.CONST_TIPUS_BOMBEIG_D);
      int aux = connexions[plataformaOrigen].getSortida();
      //	System.out.println("l'arrel d'origen es " + getArrel(plataformaOrigen));
      //	System.out.println("I comprovem aux " + aux);
      while (aux != getArrel(plataformaOrigen)) {
        modificarBombeig(aux, PetroliUtils.CONST_TIPUS_BOMBEIG_D);
        aux = connexions[aux].getSortida();
      }
    }
  }
Ejemplo n.º 5
0
  public void load(ArrayList plataformesPetro, ArrayList plataformesDist) {
    if (plataformesPetro == null) return;
    else if (plataformesDist == null) return;

    numDist = plataformesDist.size();
    numPetro = plataformesPetro.size();

    plataformes = new Plataforma[numDist + numPetro];
    connexions = new PlataformaConectada[numDist + numPetro];
    // petPotencial = new int[numDist];
    platPropera = new int[plataformes.length];

    //	for (int i = 0; i < petPotencial.length; i++)
    //	petPotencial[i]=0;

    // Generem les plataformes distribuidores
    int id = 0;
    for (Iterator it = plataformesDist.iterator(); it.hasNext(); ) {
      plataformes[id] = (PlataformaDistribuidora) it.next();
      connexions[id] = new PlataformaConectada(0);
      id++;
    }

    // Generem les plataformes petroliferes
    for (Iterator it = plataformesPetro.iterator(); it.hasNext(); ) {
      plataformes[id] = (PlataformaPetrolifera) it.next();
      connexions[id] =
          new PlataformaConectada(((PlataformaPetrolifera) plataformes[id]).getPetroli());
      id++;
    }

    distancies = new int[plataformes.length][plataformes.length];

    long temps = System.currentTimeMillis();
    for (int i = 0; i < plataformes.length; i++) {
      for (int j = 0; j < plataformes.length; j++)
        distancies[i][j] =
            PetroliUtils.getDistanceBetweenTwoPlattforms(plataformes[i], plataformes[j]);
    }

    System.out.println("Temps: " + (System.currentTimeMillis() - temps));

    System.out.print("       ");
    for (int i = 0; i < plataformes.length; i++) System.out.print(i + "  ");
    System.out.println("");
    for (int i = 0; i < plataformes.length; i++) {
      System.out.print("Plat." + i + " ");
      for (int j = 0; j < plataformes.length; j++) {
        System.out.print(distancies[i][j]);
        if (distancies[i][j] < 10) System.out.print("  ");
        else System.out.print(" ");
      }

      System.out.println(" ");
    }

    System.out.println("");

    for (int i = 0; i < plataformes.length; i++) {
      plataformes[i].print();
      System.out.println("");
    }

    for (int i = 0; i < plataformes.length; i++) {
      platPropera[i] = getPlatProperaNoConectada(i);
    }

    int aux = 0;
    for (int i = 0; i < plataformes.length; i++) {
      if (i != 0) aux += distancies[0][i];
    }

    if (aux != 0 && (numPetro + numDist != 0)) mitjana_distancia = aux / (numPetro + numDist);
    else mitjana_distancia = 0;
  }