private void Start() { hormigas = new HormigaAco[cantidadHormigas]; for (int i = 0; i < cantidadHormigas; i++) { hormigas[i] = new HormigaAco(nido, this.gameObject.GetComponent <ACO>()); Debug.Log("Hormiga: " + i + " Creada"); } }
public Nodo EscogerCamino(Nodo nodoActual, HormigaAco hormiga) { double ruleta = Random.Range(0f, 1f); List <Nodo> vecinos = GrillaMundo.getNodosVecinos(nodoActual); double[] probabilidadLocal = new double[vecinos.Count]; double probabilidadVecinos = 0.0; Nodo nodoSiguiente = null; int indice = 0; foreach (Nodo vecino in vecinos) { if (vecino == nodoActual.nodoPadre) { indice++; continue; } probabilidadLocal[indice] = vecino.nivelDeFeromonas * getDistancia(nodoActual, vecino); probabilidadVecinos += probabilidadLocal[indice]; indice++; } indice = 0; //actualizar probabilidad de seleccion List <double> sum = new List <double>(); foreach (Nodo vecino in vecinos) { if (vecino == nodoActual.nodoPadre) { indice++; continue; } probabilidadLocal[indice] = probabilidadLocal[indice] / probabilidadVecinos; indice++; } indice = 0; foreach (Nodo vecino in vecinos) { if (vecino == nodoActual.nodoPadre) { indice++; continue; } double suma = 0; for (int i = indice; i < probabilidadLocal.Length; i++) { suma += probabilidadLocal[i]; } sum.Add(suma); } sum.Reverse(); indice = 0; foreach (Nodo vecino in vecinos) { if (vecino == nodoActual.nodoPadre) { indice++; continue; } if (indice == 0) { if (ruleta <= sum[indice]) { nodoSiguiente = vecino; nodoSiguiente.nodoPadre = nodoActual; } } else if (ruleta > sum[indice - 1] && ruleta <= sum[indice]) { nodoSiguiente = vecino; nodoSiguiente.nodoPadre = nodoActual; } indice++; } if (nodoSiguiente == null) { bool apto = false; while (!apto) { int seleccion = Random.Range(0, vecinos.Count); nodoSiguiente = vecinos[seleccion]; if (nodoSiguiente != nodoActual.nodoPadre && nodoSiguiente.walkable) { apto = true; } } } return(nodoSiguiente); }