public void RecordData() { DestroyAllAoe(); float timeUsed = Time.time - startTime; BossStatisticData bossStatsData = new BossStatisticData { timeUsed = Time.time - startTime, playerHPLeft = Mathf.Max(0, player.GetComponent <PlayerHealth>().currentHealth), attackUptimePercentages = player.GetComponent <PlayerRuleBased>().bossAttackUptime / timeUsed }; BossStatistic bossStatistic = boss.GetComponent <BossStatistic>(); bossStatistic.data.Clear(); bossStatistic.data.Add(bossStatsData); player.SetActive(false); boss.SetActive(false); ga.AnInstanceEnd(); }
public static float Fitness(BossStatisticData bossData) { float fitness = 0; if (!(bossData.timeUsed > expect_timeUsed_toBeat * 2)) { fitness += weight_timeUsed * ((expect_timeUsed_toBeat - Mathf.Abs(expect_timeUsed_toBeat - bossData.timeUsed)) / expect_timeUsed_toBeat); // expect(180) - [0-360] , low distance high fitness (if timeUsed > 2* expect ) it's 0 in this part } float divider = 0.5f + Mathf.Abs(0.5f - expect_attackUptimePercentages); fitness += weight_attackUptimePercent * (expect_attackUptimePercentages - Mathf.Abs(expect_attackUptimePercentages - bossData.attackUptimePercentages)) / divider; // expect - [0-1] int divider2 = 50 + Mathf.Abs(50 - expect_playerHP_left); fitness += weight_playerHP_left * (expect_playerHP_left - Mathf.Abs(expect_playerHP_left - bossData.playerHPLeft)) / (float)divider2; fitness += bossData.IsBeaten ? weight_isBeaten : 0; fitness = fitness / sum_weight; return(fitness); }