• Nenhum resultado encontrado

Algoritmo 4.15 – Algoritmo da função objetiva de balanceamento de segmentos

4.5 Funções-objetivo

As funções-objetivo propostas por Liapis (2017) não foram utilizadas neste trabalho. Contudo, foram utilizadas como inspiração em alguns casos. Como nosso foco principal é a geração de barreiras houve a necessidade de uma forma diferente de calcular o fitness dos esboços. Dessa forma, para realizar o cálculo da qualidade dos esboços gerados criamos duas funções. Uma avalia a qualidade da exploração e a outra a distribuição dos

segmentosno nível. O valor de fitness final do esboço é dada pela soma das duas funções.

A função objetiva que calcula a distribuição dos recursos no esboço (Algoritmo 4.14 e Algoritmo 4.15) avalia: (1) o balanceamento de quatro tipos e segmentos; (2) se segmentos de grande recompensa e grande desafio estão em regiões mais distantes da região da entrada do nível; (3) se segmentos de grande recompensa são vizinhos dos de grande desafio na mesma região; (4) se segmentos de recompensa não estão posicionados em barreiras ou em sua vizinhança; (5) se recompensas estão em becos-sem-saída; (6) e se as chaves das barreiras estão posicionadas em segmentos do tipo desafio.

No caso do balanceamento os segmentos considerados foram: vazio, simples, desafio esparso e recompensa esparsa. Os demais itens foram desconsiderados, pois ou possuem uma quantidade obrigatória ou são paredes (não são paredes). O balanceamento aplica uma penalidade ao esboço que não possuir um nível cuja quantidade dos segmentos citados não seja equilibrados de forma proporcional ao desvio padrão da quantidade de segmentos das regiões. Portanto, efetua-se a penalidade através da subtração do desvio padrão multiplicado por 2 (fit = fit + desvio_padrao × −2). A fim de aumentar a variedade de segmentos, somamos ao fitness a quantidade de ocorrências dos segmentos simples, desafio esparso e recompensa esparsa, com um peso de 1.5 para os segmentos esparsos. A quantidade de segmentos vazios não é somada, pois possui sempre maior ocorrência, uma vez que todos os segmentos, com exceção dos obrigatórios e os de parede, são vazios dos esboços da população inicial.

Em relação à distância da região dos segmentos de grande recompensa e de grande desafio, basta somar o ID de região ao fitness do esboço, quanto maior o ID, mais distante está da região da entrada. O item 3 foi inspiração do trabalho de Liapis (2017), se segmentos dos tipos grande recompensa e grande desafio são vizinhos em uma mesma região, então acrescentam-se 2 pontos ao fitness do esboço para cada segmento de recompensa. O ideal é que segmentos de recompensa não estejam em segmentos onde as barreiras estão, mas sim em becos-sem-saída, no primeiro caso soma-se 1 ponto ao fitness do esboço e 2 no segundo para cada ocorrência. Por último, caso as chaves estejam em segmentos de desafio 1 ponto também para cada ocorrência.

Algoritmo 4.14 Algoritmo da função objetiva de controle de recursos função FuncaoRecursos(Esboco: e)

f it ← BalanceamentoDeSegmentos(e)

para cada s em e.SegmentosGrandeDeR() faça

f it ← f it+ e.regioes[pos]

fim para

para cada psgr em e.PosicoesDosSegmentosDeGrandeRecompensa() faça para cada psgc em e.PosicoesDosSegmentosDeGrandeDesafio() faça

se e.regioes[psgr] = e.regioes[psgc] e e.Vizinho(psgr,psgc) então

f it ← f it+ 2

fim se fim para fim para

para cada b em e.barreiras faça

. Se o segmento é Recompensa Esparsa ou Grande Recompensa

se e.segmento[b.pos] 6= Recompensa então se não e.Vizinho(b.pos, Recompensa) então

f it ← f it+ 1

fim se fim se

. Se o segmento é Desafio Esparso ou Grande Desafio

para cada c em e.barreias.chaves faça se e.segmento[c.pos] = Desafio então

f it ← f it+ 1

fim se fim para fim para

para cada pos em e.P osicoesDosSegmentosDeRecompensa faça se BecoSemSaida(e.regioes, pos) então

f it ← f it+ 2;

fim se fim para retorna f it fim função

Algoritmo 4.15 Algoritmo da função objetiva de balanceamento de segmentos função BalanceamentoDeSegmentos(Esboco: e) f it ←0 qsv ← e.QuantidadeDeSegmentosVazios() qss ← e.QuantidadeDeSegmentosSimples() qsde ← e.QuantidadeDeSegmentosDesafioEsparso() qsre ← e.QuantidadeDeSegmentosRecompensaEsparsa() f it ← qss+ (qsde × 1.5) + (qsre × 1.5)

media ←(qsv + qss + qsde + qsre)/4

dp ←q((qsv − m)2+ (qss − m)2+ (qsde − m)2+ (qsre − m)2)/4

f it ← f it+ (dp × −2)

retorna f it fim função

Algoritmo 4.16 Algoritmo da função objetiva da exploração função FuncaoExploracao(Esboco: e)

f it ← e.DistanciaEntreOsSegmentosDeSaida()

f it ← f it+ e.regioes[e.PosicaoSegundoSegmentoDeSaida()]

f it ← f it+ (e.regioes.DesvioPadraoDoTamanhoDasRegiões() × −3) dist ←0

para cada b1 em e.barreiras faça para cada b2 em e.barreiras faça

se b1 6= b2 então

dist ← dist+ e.Distancia(b1.posicao,b2.posicao)

fim se fim para fim para

f it ← f it+ (dist/Tamanho(e.barreiras)) dist ←0

para cada b em e.barreiras faça se Tamanho(b.chaves) > 1 então

para cada c1 em b.chaves faça para cada c2 em b.chaves faça

se c1 6= c2 então

dist ← dist+ e.Distancia(c1.posicao,c2.posicao)

fim se fim para fim para fim se f it ← f it+ (dist/Tamanho(b.chaves)) f it ← Tamanho(b.chaves) fim para f it ← e.QuantidadeDeTiposDeBarreiras() × 2 retorna f it fim função

A função objetiva que avalia o valor de fitness da exploração (Algoritmo 4.16) do nível dá maior pontuação a características que aumentam o percorrimento do jogador pelo nível. Nesse contexto, também avaliamos a qualidade das barreiras. A função objetiva de exploração calcula: (1) a distância entre os segmentos de saída; (2) se o segundo segmento de saída está em uma região distante da região de entrada do nível; (3) o balanceamento do tamanho das regiões; (4) a distância média entre as barreiras; (5) a distância média entre as chaves das barreiras; (6) a quantidade de chaves; (7) a quantidade dos tipos de barreiras.

A distância entre os segmentos de saída é calculado através da distância de Manhat- tan, o valor é somando ao fitness. O valor do ID da região do segmento de saída é somado ao fitness, de forma que quanto mais longe da entrada, melhor. Em seguida, é calculado o desvio padrão da quantidade de segmentos das regiões para avaliar o balanceamento. Dessa vez, o desconto no valor de fitness é de três vezes o desvio padrão. A distância média das barreiras e a distância entre duas chaves são calculadas também através da distância de Manhattan, ambas são somadas ao fitness. A quantidade total de chaves é somada ao valor de fitness, pois uma maior quantidade de chaves pode fazer com que o jogador tenha que percorrer mais partes do nível. Por fim, soma-se a quantidade de tipos de barreiras multiplicada por 2 de forma a maximizar a variação dos tipos de barreiras em um mesmo nível.

Documentos relacionados