/// <summary> /// Muere el agente /// </summary> protected override void Die() { state = States.Die; GetComponent <DinasorsAnimationCorrector>().die(); defense = 0; if (gameObject.transform.Find("leaderLigth") != null) { Destroy(gameObject.transform.Find("leaderLigth").gameObject); } if (herd.Contains(gameObject)) { herd.Remove(gameObject); } foreach (GameObject go in herd) { go.GetComponent <DinoObject>().herd.Remove(gameObject); } if (isLeader == true) { Prey p = gameObject.GetComponent <Prey>(); Predator pr = gameObject.GetComponent <Predator>(); if (p != null) { List <Prey> listHerd = new List <Prey>(); foreach (GameObject go in p.herd) { listHerd.Add(go.GetComponent <Prey>()); } if (listHerd.Count > 0) { p.getNewLeader(listHerd); } else { p.isLeader = false; } } if (pr != null) { List <Predator> listHerd = new List <Predator>(); foreach (GameObject go in pr.herd) { listHerd.Add(go.GetComponent <Predator>()); } if (listHerd.Count > 0) { pr.getNewLeader(listHerd); } else { pr.isLeader = false; } } } }
public void createHerds() { elements = GameObject.FindObjectsOfType <Prey>(); int nElements = elements.Count(); int[] curCluster = new int[elements.Count()]; for (int i = 0; i < nElements; i++) { curCluster[i] = i; // We assign each element to it's cluster. Making sure this way to at least //run 1 time the assignment step } // Make sure we can create the K clusters, // If we have less than K elements then we only can create // Number of elements clusters, each cluster with 1 element. if (nElements < K) { K = nElements; } // Create K Herds, and K objects with the points where elements live // Then populate the K herds using K Means. List <List <Prey> > best = new List <List <Prey> > (); float bestMSE = 100000000.0F; List <List <Prey> > herds = new List <List <Prey> > (); List <Vector3> means = new List <Vector3> (); float minX = 1000000.0F, maxX = 0.0F, minY = 1000000.0F, maxY = 0.0F; for (int i = 0; i < nElements; i++) { Vector3 pos = elements[i].transform.position; if (pos.x < minX) { minX = pos.x; } if (pos.x > maxX) { maxX = pos.x; } if (pos.z < minY) { minY = pos.z; } if (pos.z > maxY) { maxY = pos.z; } } for (int T = 0; T < 100; T++) { herds = new List <List <Prey> > (); means = new List <Vector3> (); curCluster = new int[elements.Count()]; for (int i = 0; i < nElements; i++) { curCluster[i] = i; // We assign each element to it's cluster. Making sure this way to at least //run 1 time the assignment step } for (int i = 0; i < K; i++) { herds.Add(new List <Prey>()); means.Add(new Vector3( (float)Random.Range((int)minX, (int)maxX), 15.0F, (float)Random.Range((int)minY, (int)maxY) ) ); } float MSE = 0.0F; float MSEPREV = 1.0F; int epoch = 0; while (Mathf.Abs(MSE - MSEPREV) > EPS && epoch < 100000) //Each time we find a change on the assignment { MSEPREV = MSE; MSE = 0.0F; epoch++; //Empty the clusters for (int i = 0; i < K; i++) { herds [i] = new List <Prey> (); } //We iterate to create the K clusters for (int i = 0; i < nElements; i++) //For each element { int bestCluster = 0; // Keep the bestCluster for (int j = 1; j < K; j++) // For each cluster { if (distance(elements [i].transform.position, means [j]) < distance(elements [i].transform.position, means [bestCluster])) //bestCluster { bestCluster = j; } } if (curCluster [i] != bestCluster) { curCluster [i] = bestCluster; // Assign Cluster maps ;) herds [bestCluster].Add(elements [i]); // Add the element to the cluster. } else { herds[curCluster[i]].Add(elements[i]); } } // Now update the clusters for (int i = 0; i < K; i++) { float newX = 0; float newY = 0; float newZ = 0; for (int j = 0; j < herds[i].Count; j++) { newX += herds [i] [j].transform.position.x; newY += herds [i] [j].transform.position.y; newZ += herds [i] [j].transform.position.z; } int tot = herds [i].Count == 0 ? 1 : herds [i].Count; //Avoid division by 0; means[i] = new Vector3(newX / (float)tot, means[i].y, newZ / (float)tot); for (int j = 0; j < herds[i].Count; j++) { MSE += distance(herds[i][j].transform.position, means[i]); } } } if (MSE < bestMSE) { bestMSE = MSE; best = herds; for (int i = 0; i < nElements; i++) { elements[i].herdid = curCluster[i]; } } } herds = best; //Finally we iterate each of the final clusters and select the leader of the elements. for (int i = 0; i < K; i++) { if (herds[i].Count == 0) { continue; } Prey element = herds[i][0]; List <GameObject> herdList = new List <GameObject>(); for (int j = 0; j < herds[i].Count; j++) { herdList.Add(herds[i][j].gameObject); } for (int j = 0; j < herds[i].Count; j++) { herds[i][j].herd = herdList; } element.getNewLeader(herds[i]); } }