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();
    }
Beispiel #2
0
    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);
    }