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; }
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; }
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); } }
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(); } } }
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; }