Advertisement
FernandoMendes

Untitled

Nov 18th, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.86 KB | None | 0 0
  1.   /**
  2.      * Resolução do ex 3f
  3.      *
  4.      * @param p personagem que quer conquistar o local
  5.      * @param l local que quer ser conquistado
  6.      * @return uma instancia da classe conquista
  7.      */
  8.     public Conquista consegueConquistarLocal(Personagem p, Local l) {
  9.         if (!(redeLocal.checkVertex(l) || !redeAlianca.validVertex(p))) {//Verifico se o lugar existe e a personagem também
  10.             return null;
  11.         }
  12.         LinkedList<Local> lugaresConquistados = new LinkedList<>();
  13.         for (Personagem aliado : p.getAliados()) {
  14.             if (redeAlianca.getEdge(p, aliado) != null) {
  15.                 double forca_alianca = (aliado.getnPontos() + p.getnPontos()) * redeAlianca.getEdge(p, aliado).getWeight(); // (Força_alianca = forcaAliado + forcaPersonagem)*FatorCompatibilidade
  16.                 if (l.getDono() != null) {
  17.                     if (!(l.getDono().equals(p))) { //se o alidado nao for dono do local x podemos aplicar o shortPath
  18.                         double forca_necessaria = calcForcaNecessaria(p, aliado, l, lugaresConquistados); //aqui aplica-se um  método parecido com o shortestPath do exercicio 1c
  19.                         if (!(lugaresConquistados.isEmpty())) { //o metodo em cima só preenche o minimo de lugares conquistados  se o aliado nao for dono de nenhum lugar intermédio
  20.                             if (forca_alianca > forca_necessaria && forca_necessaria > 0) {
  21.                                 if(l.getDono()!= null){
  22.                                     forca_necessaria += l.getDono().getnPontos();
  23.                                 }
  24.                                 return new Conquista(aliado, lugaresConquistados,  forca_necessaria,forca_alianca);
  25.                             }
  26.                         }
  27.                     }
  28.                 }
  29.             }
  30.         }
  31.         return null;
  32.     }
  33.  
  34.     /**
  35.      * Calcula a forca necessaria
  36.      *
  37.      * @param p Personagem que quer conquistar o local
  38.      * @param aliado aliado que vai ajudar
  39.      * @param l local que se quer conquistar
  40.      * @param listaLocal lista de locais intermedios
  41.      * @return forca necessaria
  42.      */
  43.     private double calcForcaNecessaria(Personagem p, Personagem aliado, Local l, LinkedList<Local> listaLocal) {
  44.         double min = Double.MAX_VALUE;
  45.         for (Local localConq : p.getLocaisConquistados()) {
  46.             double val = shortPathConquista(aliado, localConq, l, listaLocal);
  47.             if (val < min) {
  48.                 min = val;
  49.             }
  50.         }
  51.         //Se a personagem nao tiver nenhum local então nao podemos retornar nada
  52.         if (min == Double.MAX_VALUE) {
  53.             return -1;
  54.         }
  55.         return min;
  56.     }
  57.  
  58.     /**
  59.      * Inicio do metodo do shortestPathConquista
  60.      *
  61.      * @param aliado personagem aliada a p
  62.      * @param localOrig local que partem as duas personagens
  63.      * @param localDest local que querem conquistar
  64.      * @param lista lista de lugares intermedios
  65.      * @return peso
  66.      */
  67.     private double shortPathConquista(Personagem aliado, Local localOrig, Local localDest, LinkedList<Local> lista) {
  68.         if (redeLocal.checkVertex(localOrig) && (redeLocal.checkVertex(localDest))) {
  69.             boolean[] knownVertices = new boolean[redeLocal.numVertices()];
  70.             int[] verticesIndex = new int[redeLocal.numVertices()];
  71.             double[] minDist = new double[redeLocal.numVertices()];
  72.             lista.clear();
  73.             shortestPathComPesoLocal(aliado, redeLocal.vertices.indexOf(localOrig), knownVertices, verticesIndex, minDist);
  74.             if (minDist[redeLocal.vertices.indexOf(localDest)] != Double.MAX_VALUE) {
  75.                 recreatePath(redeLocal, redeLocal.toIndex(localOrig), redeLocal.toIndex(localDest), verticesIndex, lista);
  76.                 return minDist[redeLocal.vertices.indexOf(localDest)];
  77.  
  78.             }
  79.             return -1;
  80.         }
  81.         return -1;
  82.  
  83.     }
  84.  
  85.     /**
  86.      * Determine the shortest path to all vertices from a vertex using
  87.      * Dijkstra's algorithm To be called by public short met
  88.      *
  89.      * @param <V>
  90.      * @param <E>
  91.      * @param source
  92.      * @param knownVertices
  93.      * @param verticesIndex
  94.      * @param minDist
  95.      */
  96.     private void shortestPathComPesoLocal(Personagem aliado, int sourceIdx, boolean[] knownVertices, int[] verticesIndex, double[] minDist) {
  97.         Double edge;
  98.         double pesoLocal;
  99.         double pesoPersonagemLocal;
  100.         for (int i = 0; i < redeLocal.numVertices(); i++) {
  101.             minDist[i] = Double.MAX_VALUE;
  102.             verticesIndex[i] = -1;
  103.             knownVertices[i] = false;
  104.         }
  105.         minDist[sourceIdx] = 0;
  106.         while (sourceIdx != -1) {
  107.             knownVertices[sourceIdx] = true;
  108.             for (Local l : redeLocal.directConnections(redeLocal.vertices.get(sourceIdx))) { //each vAdj of vOrig
  109.                 edge = redeLocal.getEdge(redeLocal.vertices.get(sourceIdx), l);
  110.                 pesoLocal = (double) l.getnPontos();
  111.                 pesoPersonagemLocal = 0.0;
  112.                 if (l.getDono() != null) {
  113.                     if (l.getDono().equals(aliado)) { //Aqui insere-se o parametro que um aliado nao pode ser dono de nenhum dos locais intermédios
  114.                         edge = Double.MAX_VALUE;
  115.                     } else if (!knownVertices[redeLocal.vertices.indexOf(l)] && minDist[redeLocal.vertices.indexOf(l)] > minDist[sourceIdx] + edge + pesoLocal + pesoPersonagemLocal) {
  116.                         minDist[redeLocal.vertices.indexOf(l)] = minDist[sourceIdx] + edge + pesoLocal + pesoPersonagemLocal;
  117.                         verticesIndex[redeLocal.vertices.indexOf(l)] = sourceIdx;
  118.                     } else {
  119.                         pesoPersonagemLocal = l.getDono().getnPontos();
  120.                     }
  121.                 }
  122.             }
  123.             sourceIdx = getVertMinDist(minDist, knownVertices);
  124.         }
  125.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement