private static float CalculateResistance(float baseResist, int resistIndex, SerializableChromosome chromosome) { var effectiveResist = baseResist; var resistNegatives = new List <int> { 0, 1, 2, 3, 4, 5 }; resistNegatives.Remove(resistIndex); var resistModifier = (chromosome.Value[resistIndex] - AverageChromosomeValues(resistNegatives, chromosome)) / ushort.MaxValue; resistModifier *= 1 - Math.Abs(AverageChromosomeValues(new List <int>() { 6, 7 }, chromosome) - halfwayMax) / halfwayMax; effectiveResist += resistModifier * maxBonus * baseResist; if (effectiveResist > 0.991 || effectiveResist < 0) { var doh = 1; } return(effectiveResist); }
public static double PointValue(this EnemyTypes enemyType, SerializableChromosome chromosome) { if (!HasCalculatedMinimums) { CalculateMinimums(); } var enemyAttributes = BaseEnemy.GetGeneticAttributes(enemyType.Attributes(), chromosome); var healthPoints = enemyAttributes.MaximumHealth / minHealth; var speedPoints = enemyAttributes.EffectiveSpeed / minSpeed; var flyingPoints = enemyAttributes.IsFlying ? 1.5 : 1; var piercePoints = enemyAttributes.EffectivePiercingResist - minPierce; var bombardPoints = enemyAttributes.EffectiveBombardResist - minBombard; var chemicalPoints = enemyAttributes.EffectiveChemicalResist - minChemical; var frostPoints = enemyAttributes.EffectiveFrostResist - minFrost; var firePoints = enemyAttributes.EffectiveFireResist - minFire; var electricPoints = enemyAttributes.EffectiveElectricResist - minElectric; var resistPoints = piercePoints + bombardPoints + chemicalPoints + frostPoints + firePoints + electricPoints; var survivalPoints = healthPoints * resistPoints; var movePoints = speedPoints * flyingPoints; var pointValue = survivalPoints * movePoints; return(pointValue); }
public static BaseEnemy CreateNew(EnemyTypes enemyType, SerializableChromosome chromosome = null, bool isHorde = false) { BaseEnemy newEnemy; switch (enemyType) { case EnemyTypes.Chicken1: newEnemy = Chicken1EnemyFactory.CreateNew(); break; case EnemyTypes.Chicken2: newEnemy = Chicken2EnemyFactory.CreateNew(); break; case EnemyTypes.Chicken3: newEnemy = Chicken3EnemyFactory.CreateNew(); break; case EnemyTypes.Rabbit1: newEnemy = Rabbit1EnemyFactory.CreateNew(); break; case EnemyTypes.Rabbit2: newEnemy = Rabbit2EnemyFactory.CreateNew(); break; case EnemyTypes.Rabbit3: newEnemy = Rabbit3EnemyFactory.CreateNew(); break; case EnemyTypes.Sheep1: newEnemy = Sheep1EnemyFactory.CreateNew(); break; case EnemyTypes.Sheep2: newEnemy = Sheep2EnemyFactory.CreateNew(); break; case EnemyTypes.Sheep3: newEnemy = Sheep3EnemyFactory.CreateNew(); break; case EnemyTypes.Cow1: newEnemy = Cow1EnemyFactory.CreateNew(); break; case EnemyTypes.Cow2: newEnemy = Cow2EnemyFactory.CreateNew(); break; case EnemyTypes.Cow3: newEnemy = Cow3EnemyFactory.CreateNew(); break; case EnemyTypes.Pig1: newEnemy = Pig1EnemyFactory.CreateNew(); break; case EnemyTypes.Pig2: newEnemy = Pig2EnemyFactory.CreateNew(); break; case EnemyTypes.Pig3: newEnemy = Pig3EnemyFactory.CreateNew(); break; default: throw new ArgumentOutOfRangeException(nameof(enemyType), enemyType, null); } if (isHorde) { newEnemy.RushEndPoint(); } else { newEnemy.OnDeath += OnCreateAction; newEnemy.FollowLine(); newEnemy.SetGenetics(chromosome ?? GeneticsManager.GenerateNewChromsome()); } return(newEnemy); }
public static double Evaluate(List <double> inputList, EnemyTypes enemyType, SerializableChromosome chromosome) { var enemyAttributes = enemyType.Attributes(); var effectiveAttributes = BaseEnemy.GetGeneticAttributes(enemyAttributes, chromosome); var attributesAsInput = Enumerable.ToArray(EnemyAttributesToInput(effectiveAttributes)); for (var i = 0; i < MaxEnemies; i++) { inputList.AddRange(attributesAsInput); } var score = _machineLearningModel.Predict(inputList.ToArray()); return(score); }
public void SetGenetics(SerializableChromosome chromosome = null) { Chromosome = chromosome ?? GeneticsManager.GenerateNewChromsome(); var baseAttributes = GetBaseAttributes(); var effectiveAttributes = GetGeneticAttributes(baseAttributes, Chromosome); MaximumHealth = effectiveAttributes.MaximumHealth; HealthRemaining = MaximumHealth; EffectiveSpeed = effectiveAttributes.EffectiveSpeed; EffectivePiercingResist = effectiveAttributes.EffectivePiercingResist; EffectiveBombardResist = effectiveAttributes.EffectiveBombardResist; EffectiveChemicalResist = effectiveAttributes.EffectiveChemicalResist; EffectiveFireResist = effectiveAttributes.EffectiveFireResist; EffectiveFrostResist = effectiveAttributes.EffectiveFrostResist; EffectiveElectricResist = effectiveAttributes.EffectiveElectricResist; }
private static float CalculateSpeed(float baseSpeed, SerializableChromosome chromosome) { var effectiveSpeed = baseSpeed; var speedModifier = (-SumChromsomeValues(new List <int> { 0, 2, 4 }, chromosome) + SumChromsomeValues(new List <int> { 1, 3, 5 }, chromosome)) / (3 * ushort.MaxValue); speedModifier *= 1 - Math.Abs(chromosome.Value[7] - halfwayMax) / halfwayMax; effectiveSpeed += (speedModifier / 4 * maxBonus * baseSpeed); if (effectiveSpeed / baseSpeed > 1.1 || effectiveSpeed / baseSpeed < 0.9) { var doh = 1; } return(effectiveSpeed); }
private static float CalculateMaximumHealth(float baseHealth, SerializableChromosome chromosome) { var effectiveHealth = baseHealth; var healthModifier = (SumChromsomeValues(new List <int> { 0, 2, 4 }, chromosome) - SumChromsomeValues(new List <int> { 1, 3, 5 }, chromosome)) / (3 * ushort.MaxValue); healthModifier *= 1 - Math.Abs(chromosome.Value[6] - halfwayMax) / halfwayMax; effectiveHealth += (healthModifier / 2 * maxBonus * baseHealth); if (effectiveHealth / baseHealth > 1.1 || effectiveHealth / baseHealth < 0.9) { var doh = 1; } return(effectiveHealth); }
public static GeneticAttributes GetGeneticAttributes(BaseAttributes attributes, SerializableChromosome chromosome) { var effectiveAttributes = new GeneticAttributes { MaximumHealth = CalculateMaximumHealth(attributes.Health, chromosome), EffectiveSpeed = CalculateSpeed(attributes.Speed, chromosome), EffectivePiercingResist = CalculateResistance(attributes.PiercingResist, 0, chromosome), EffectiveBombardResist = CalculateResistance(attributes.BombardResist, 1, chromosome), EffectiveChemicalResist = CalculateResistance(attributes.ChemicalResist, 2, chromosome), EffectiveFireResist = CalculateResistance(attributes.FireResist, 3, chromosome), EffectiveFrostResist = CalculateResistance(attributes.FrostResist, 4, chromosome), EffectiveElectricResist = CalculateResistance(attributes.ElectricResist, 5, chromosome), IsFlying = attributes.IsFlying, }; return(effectiveAttributes); }
private static float SumChromsomeValues(IEnumerable <int> values, SerializableChromosome chromosome) { return(values.Aggregate(0f, (current, index) => current + chromosome.Value[index])); }
private static float AverageChromosomeValues(IEnumerable <int> values, SerializableChromosome chromosome) { return((float)values.Average((index) => chromosome.Value[index])); }