public AICarParms ToCarParams() { AICarParms ap = new AICarParms(resolution, maxAngle, maxRayDist, distanceFactor, angleFactor, speed, turnSpeed, dampForward, dampRight, criticalDistance, fwdCriticalDamp, completesTrack, timeToComplete); return(ap); }
public static List <AICarParms> TryToAdd(List <AICarParms> origen, AICarParms newParam, int maxItems) { List <AICarParms> tempList = origen; //Debug.Log(maxItems + " " + tempList.Count); if (maxItems > tempList.Count) { tempList.Add(newParam); return(tempList); } int indexOfWorst = 0; float timeOfWorst = 0; for (int i = 0; i < tempList.Count; i++) { if (tempList[i].timeToComplete > timeOfWorst) { indexOfWorst = i; timeOfWorst = tempList[i].timeToComplete; } } if (newParam.timeToComplete < timeOfWorst) { tempList.RemoveAt(indexOfWorst); tempList.Add(newParam); } else { } return(tempList); }
public AICarParms RandomizeParams() { int newResolution = Random.Range( MutationParams.resolutionFactorMinMax.y, MutationParams.resolutionFactorMinMax.z); int newMaxAngle = Random.Range( MutationParams.maxAngleFactorMinMax.y, MutationParams.maxAngleFactorMinMax.z); float newMaxRayDist = Random.Range( MutationParams.maxRayDistFactorMinMax.y, MutationParams.maxRayDistFactorMinMax.z); float newDistanceFactor = Random.Range( MutationParams.distanceFactorMinMax.y, MutationParams.distanceFactorMinMax.z); float newAngleFactor = Random.Range( MutationParams.angleFactorMinMax.y, MutationParams.angleFactorMinMax.z); float newSpeed = Random.Range( MutationParams.speedFactorMinMax.y, MutationParams.speedFactorMinMax.z); float turnSpeed = Random.Range( MutationParams.turnSpeedFactorMinMax.y, MutationParams.turnSpeedFactorMinMax.z); float newDampForward = Random.Range( MutationParams.dampForwardFactorMinMax.y, MutationParams.dampForwardFactorMinMax.z); float newDampRight = Random.Range( MutationParams.dampRightFactorMinMax.y, MutationParams.dampRightFactorMinMax.z); float newCriticalDistance = Random.Range( MutationParams.criticalDistanceFactorMinMax.y, MutationParams.criticalDistanceFactorMinMax.z); float fwdCriticalDamp = Random.Range( MutationParams.fwdCriticalDampFactorMinMax.y, MutationParams.fwdCriticalDampFactorMinMax.z); AICarParms newParam = new AICarParms(newResolution, newMaxAngle, newMaxRayDist, newDistanceFactor, newAngleFactor, newSpeed, turnSpeed, newDampForward, newDampRight, newCriticalDistance, fwdCriticalDamp); //parameters.Add(newParam); return(newParam); }
private AICarParms GrabFromOthers(AICarParms param) { param.resolution = succesfulParams[Random.Range(0, succesfulParams.Count)].resolution; param.maxAngle = succesfulParams[Random.Range(0, succesfulParams.Count)].maxAngle; param.maxRayDist = succesfulParams[Random.Range(0, succesfulParams.Count)].maxRayDist; param.distanceFactor = succesfulParams[Random.Range(0, succesfulParams.Count)].distanceFactor; param.angleFactor = succesfulParams[Random.Range(0, succesfulParams.Count)].angleFactor; param.speed = succesfulParams[Random.Range(0, succesfulParams.Count)].speed; param.turnSpeed = succesfulParams[Random.Range(0, succesfulParams.Count)].turnSpeed; param.dampForward = succesfulParams[Random.Range(0, succesfulParams.Count)].dampForward; param.dampRight = succesfulParams[Random.Range(0, succesfulParams.Count)].dampRight; param.criticalDistance = succesfulParams[Random.Range(0, succesfulParams.Count)].criticalDistance; param.fwdCriticalDamp = succesfulParams[Random.Range(0, succesfulParams.Count)].fwdCriticalDamp; return(param); }
public AICarParms Mutate2(AICarParms prevPara) { if (prevPara.completesTrack) { succesfulParams = TryToAdd(succesfulParams, prevPara, TopToKeep); } if (succesfulParams.Count == 0) { return(Mutate(prevPara)); } AICarParms newParam = new AICarParms(); if (Random.Range(0, 10) < ChanceToGrabFromOthers) { return(GrabFromOthers(newParam)); } return(CombineParams(succesfulParams[Random.Range(0, succesfulParams.Count)], succesfulParams[Random.Range(0, succesfulParams.Count)])); }
public static List <AICarParms> TryToAdd(List <AICarParms> origen, AICarParms newParam) { int indexOfWorst = 0; float timeOfWorst = 0; for (int i = 0; i < origen.Count; i++) { if (origen[i].timeToComplete > timeOfWorst) { indexOfWorst = i; timeOfWorst = origen[i].timeToComplete; } } if (newParam.timeToComplete < timeOfWorst) { origen.RemoveAt(indexOfWorst); origen.Add(newParam); } return(origen); }
private void ProcessCarEnded(AICarParms p) { Debug.Log("Invoked"); if (p.completesTrack) { carsRint++; carsReaching.text = carsRint.ToString(); if (p.timeToComplete < bestTimef) { bestTimef = p.timeToComplete; bestTime.text = bestTimef.ToString(CultureInfo.InvariantCulture); } } else { carsCint++; carsCrashed.text = carsCint.ToString(); } carsSpawne++; carsSpawned.text = carsSpawne.ToString(); }
public AICarParms Mutate(AICarParms previousIteration) { if (previousIteration.completesTrack) { //succesfulParams.Add(previousIteration); } else { //failedParms.Add(previousIteration); } int newResolution = Mathf.Clamp(previousIteration.resolution + Random.Range( -MutationParams.resolutionFactorMinMax.x, MutationParams.resolutionFactorMinMax.x), MutationParams.resolutionFactorMinMax.y, MutationParams.resolutionFactorMinMax.z); int newMaxAngle = Mathf.Clamp(previousIteration.maxAngle + Random.Range( -MutationParams.maxAngleFactorMinMax.x, MutationParams.maxAngleFactorMinMax.x), MutationParams.maxAngleFactorMinMax.y, MutationParams.maxAngleFactorMinMax.z); float newMaxRayDist = Mathf.Clamp(previousIteration.maxRayDist + Random.Range( -MutationParams.maxRayDistFactorMinMax.x, MutationParams.maxRayDistFactorMinMax.x), MutationParams.maxRayDistFactorMinMax.y, MutationParams.maxRayDistFactorMinMax.z); float newDistanceFactor = Mathf.Clamp(previousIteration.distanceFactor + Random.Range( -MutationParams.distanceFactorMinMax.x, MutationParams.distanceFactorMinMax.x), MutationParams.distanceFactorMinMax.y, MutationParams.distanceFactorMinMax.z); float newAngleFactor = Mathf.Clamp(previousIteration.angleFactor + Random.Range( -MutationParams.angleFactorMinMax.x, MutationParams.angleFactorMinMax.x), MutationParams.angleFactorMinMax.y, MutationParams.angleFactorMinMax.z); float newSpeed = Mathf.Clamp(previousIteration.speed + Random.Range( -MutationParams.speedFactorMinMax.x, MutationParams.speedFactorMinMax.x), MutationParams.speedFactorMinMax.y, MutationParams.speedFactorMinMax.z); float turnSpeed = Mathf.Clamp(previousIteration.turnSpeed + Random.Range( -MutationParams.turnSpeedFactorMinMax.x, MutationParams.turnSpeedFactorMinMax.x), MutationParams.turnSpeedFactorMinMax.y, MutationParams.turnSpeedFactorMinMax.z); float newDampForward = Mathf.Clamp(previousIteration.dampForward + Random.Range( -MutationParams.dampForwardFactorMinMax.x, MutationParams.dampForwardFactorMinMax.x), MutationParams.dampForwardFactorMinMax.y, MutationParams.dampForwardFactorMinMax.z); float newDampRight = Mathf.Clamp(previousIteration.dampRight + Random.Range( -MutationParams.dampRightFactorMinMax.x, MutationParams.dampRightFactorMinMax.x), MutationParams.dampRightFactorMinMax.y, MutationParams.dampRightFactorMinMax.z); float newCriticalDistance = Mathf.Clamp(previousIteration.criticalDistance + Random.Range( -MutationParams.criticalDistanceFactorMinMax.x, MutationParams.criticalDistanceFactorMinMax.x), MutationParams.criticalDistanceFactorMinMax.y, MutationParams.criticalDistanceFactorMinMax.z); float fwdCriticalDamp = Mathf.Clamp(previousIteration.fwdCriticalDamp + Random.Range( -MutationParams.fwdCriticalDampFactorMinMax.x, MutationParams.fwdCriticalDampFactorMinMax.x), MutationParams.fwdCriticalDampFactorMinMax.y, MutationParams.fwdCriticalDampFactorMinMax.z); AICarParms newParam = new AICarParms(newResolution, newMaxAngle, newMaxRayDist, newDistanceFactor, newAngleFactor, newSpeed, turnSpeed, newDampForward, newDampRight, newCriticalDistance, fwdCriticalDamp); //parameters.Add(newParam); return(newParam); }
private AICarParms CombineParams(AICarParms p1, AICarParms p2) { int newResolution = Mathf.Clamp((p1.resolution + p2.resolution) / 2 + Random.Range( -MutationParams.resolutionFactorMinMax.x, MutationParams.resolutionFactorMinMax.x), MutationParams.resolutionFactorMinMax.y, MutationParams.resolutionFactorMinMax.z); int newMaxAngle = Mathf.Clamp((p1.maxAngle + p2.maxAngle) / 2 + Random.Range( -MutationParams.maxAngleFactorMinMax.x, MutationParams.maxAngleFactorMinMax.x), MutationParams.maxAngleFactorMinMax.y, MutationParams.maxAngleFactorMinMax.z); float newMaxRayDist = Mathf.Clamp((p1.maxRayDist + p2.maxRayDist) / 2 + Random.Range( -MutationParams.maxRayDistFactorMinMax.x, MutationParams.maxRayDistFactorMinMax.x), MutationParams.maxRayDistFactorMinMax.y, MutationParams.maxRayDistFactorMinMax.z); float newDistanceFactor = Mathf.Clamp((p1.distanceFactor + p2.distanceFactor) / 2 + Random.Range( -MutationParams.distanceFactorMinMax.x, MutationParams.distanceFactorMinMax.x), MutationParams.distanceFactorMinMax.y, MutationParams.distanceFactorMinMax.z); float newAngleFactor = Mathf.Clamp((p1.angleFactor + p2.angleFactor) / 2 + Random.Range( -MutationParams.angleFactorMinMax.x, MutationParams.angleFactorMinMax.x), MutationParams.angleFactorMinMax.y, MutationParams.angleFactorMinMax.z); float newSpeed = Mathf.Clamp((p1.speed + p2.speed) / 2 + Random.Range( -MutationParams.speedFactorMinMax.x, MutationParams.speedFactorMinMax.x), MutationParams.speedFactorMinMax.y, MutationParams.speedFactorMinMax.z); float turnSpeed = Mathf.Clamp((p1.turnSpeed + p2.turnSpeed) / 2 + Random.Range( -MutationParams.turnSpeedFactorMinMax.x, MutationParams.turnSpeedFactorMinMax.x), MutationParams.turnSpeedFactorMinMax.y, MutationParams.turnSpeedFactorMinMax.z); float newDampForward = Mathf.Clamp((p1.dampForward + p2.dampForward) / 2 + Random.Range( -MutationParams.dampForwardFactorMinMax.x, MutationParams.dampForwardFactorMinMax.x), MutationParams.dampForwardFactorMinMax.y, MutationParams.dampForwardFactorMinMax.z); float newDampRight = Mathf.Clamp((p1.dampRight + p2.dampRight) / 2 + Random.Range( -MutationParams.dampRightFactorMinMax.x, MutationParams.dampRightFactorMinMax.x), MutationParams.dampRightFactorMinMax.y, MutationParams.dampRightFactorMinMax.z); float newCriticalDistance = Mathf.Clamp((p1.criticalDistance + p2.criticalDistance) / 2 + Random.Range( -MutationParams.criticalDistanceFactorMinMax.x, MutationParams.criticalDistanceFactorMinMax.x), MutationParams.criticalDistanceFactorMinMax.y, MutationParams.criticalDistanceFactorMinMax.z); float fwdCriticalDamp = Mathf.Clamp((p1.fwdCriticalDamp + p2.fwdCriticalDamp) / 2 + Random.Range( -MutationParams.fwdCriticalDampFactorMinMax.x, MutationParams.fwdCriticalDampFactorMinMax.x), MutationParams.fwdCriticalDampFactorMinMax.y, MutationParams.fwdCriticalDampFactorMinMax.z); AICarParms newParam = new AICarParms(newResolution, newMaxAngle, newMaxRayDist, newDistanceFactor, newAngleFactor, newSpeed, turnSpeed, newDampForward, newDampRight, newCriticalDistance, fwdCriticalDamp); //parameters.Add(newParam); return(newParam); }
public void EndRaceAndMutate(AICarParms newParams) { parameters = newParams; LoadValues(); transform.SetPositionAndRotation(initPos, initRot); }