EP3 - Terceiro Exercício-Programa - Parte A

EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -
Número de respostas: 55

Bom dia, pessoal!

O Enunciado do Terceiro Exercício-Programa - Parte A está disponível no PACA. Essa primeira parte do EP3 não é complicada, mas terá um prazo mais curto do que os anteriores: a data de entrega é 3a-feira 11/6 até as 23:55. A segunda parte do EP3 será divulgada até o dia 11/6 e terá também um pouco menos de 2 semanas de prazo (até domingo 24/6 às 23:55). Ao todo o EP3 nos ocupará por 25 dias.

Certifiquem-se de baixar o pdf do enunciado e também os arquivos mundo.py e personagemNUSP.py para começarem a trabalhar no EP imediatamente. Não se preocupem nesse momento em lerem ou entenderem o arquivo mundo.py, pois ele será usado +/- como um executável (no terminal, digite "python3 mundo.py").

Dúvidas, como sempre, podem ser resolvidas no fórum, nas aulas, nos plantões de monitoria, etc.

Boas implementações!

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Rogério Marcos Fernandes Neto -

Olá, professor/monitores!

Lendo enunciado do EP3 não ficou muito claro para mim qual a necessidade de declarar duas vezes as variáveis globais do módulo "PersonagemNUSP". Poderia explicar isso um pouco mais detalhadamente?

Em resposta à Rogério Marcos Fernandes Neto

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Boa noite, Rogério!

De fato não existe uma necessidade de declará-las mais de uma vez. A opção por declarar as variáveis fora da funções está associada apenas à clareza do código: como elas pertencem ao módulo e não às funções, parece mais lógico explicitar a presença delas ali, bem como trazer sua documentação detalhada. Dentro das funções existe uma necessidade real de declarar essas variáveis, do contrário a função criaria uma variável local com o mesmo nome, o que geraria alguns erros bem difíceis de detectar.

Alternativamente, elas poderiam ser declaradas apenas nas funções (ainda que de fato não "pertencessem" a nenhuma função).

Ficou claro?

Abraços, 

Marcelo 

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Caio Túlio de Deus Andrade -

Professor/Monitores , fiquei com uma dúvida no enunciado : é dito no pdf que a função 'agir' possui um erro na hora de avaliar se o movimento é possível, pelo visto quando o personagem colide com um muro. Por causa disso, no NUSP.py, quando o personagem colide com um muro, o programa registra que o personagem se moveu e registra as casas anteriores como visitadas. No entanto, temos a seguinte mensagem no terminal quando há uma colisão : " Você bateu num muro e talvez não esteja mais na sala em que pensa estar... ", então fiquei meio em duvida se o programa deve registrar que o personagem "muda" de sala ao colidir com um muro (devido a essa mensagem no terminal), ou se o programa não deve registrar movimento do personagem (devido ao comentário no enunciado sobre o erro da função)

Em resposta à Caio Túlio de Deus Andrade

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Bom dia, Caio!

Talvez o que não tenha ficado claro é que a visualização do mundo que aparece no terminal, bem como a frase "Você bateu num muro..." estão sendo geradas pela personagem e não pelo mundo. Em outras palavras, a visualização do labirinto corresponde àquilo que a personagem acredita, mas ao sentir um impacto ela atualiza erroneamente sua posição para a sala à frente, que é justamente a que está lacrada por um muro, e esse é o erro da parte que está feita e que precisa ser corrigido. A frase "Você bateu..." só está colocada ali para alertar vocês desse erro, e deve ser removida quando o erro desaparecer (isso está escrito no código personagemNUSP.py). Como dica, se no início da simulação você escolher as ações "E" e depois "A", sua correção deve garantir que a personagem permaneça na posição (0,0) (pois a posição (0,1) é um muro "M").

Teoricamente, a interação da personagem com o mundo seria completamente silenciosa: o mundo passa percepções para a personagem através do argumento da função planejar() e a personagem passa intenções de ação no mundo através do valor de retorno da função agir. Os únicos print()'s que existem no mundo.py estão direcionados não à personagem mas ao "usuário", que comanda a personagem na versão interativa do jogo: tanto as mensagens de final de jogo quanto as mensagens de "não ter flecha" ou "não haver personagens para compartilhar" servem apenas para o usuário acompanhar o que está acontecendo. Em particular essas duas últimas são situações que nem devem ocorrer na estratégia automática que vocês irão implementar, afinal a personagem é capaz de consultar quantas flechas tem antes de decidir atirar, e é capaz de perceber se há outras personagens na sala antes de pedir um compartilhamento.

Abraços,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por João Pedro Turri -

Tenho algumas dúvidas sobre como será o mundo utilizado na segunda parte do exercício, pois isso influencia a implementação do personagem:

1) É possível haver mais de uma ameaça do mesmo tipo adjacente a uma sala? Imagine que eu sinta uma brisa em uma sala com mais de uma sala adjacente não-visitada, e já tenha informações suficientes para concluir que em uma determinada sala adjacente há um poço. Eu posso assumir que as demais salas adjacentes não-visitadas não possuem poços, ou não?

2) O número de Wumpus sempre é igual ao número de personagens? Se uma única flecha for desperdiçada, não há condições de vitória?

3) Eu posso assumir que o personagem sempre vai iniciar o jogo numa sala sem ameaças imediatamente adjacentes? Porque em caso contrário sempre haveria pelo menos 25% de chance de perder o jogo logo na primeira rodada, independente de qualquer estratégia, não?

Em resposta à João Pedro Turri

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Olá, João Pedro! Boas perguntas...

1) É possível haver mais de uma ameaça do mesmo tipo adjacente a uma sala? Imagine que eu sinta uma brisa em uma sala com mais de uma sala adjacente não-visitada, e já tenha informações suficientes para concluir que em uma determinada sala adjacente há um poço. Eu posso assumir que as demais salas adjacentes não-visitadas não possuem poços, ou não?

Não. As percepções de brisa e fedor não possuem intensidades, não recebemos múltiplos "F"s ou "B"s se há mais de um poço ou Wumpus nas salas adjacentes. Mas isso não significa que não possa haver dois ou mais poços ou dois ou mais Wumpus adjacentes a uma mesma sala. Eu não diria que essa sua dúvida tem a ver com a parte B, mas tem a ver com considerar que o mundo é desconhecido, e que qualquer sala pode em princípio ter qualquer um dos símbolos "M", "P" ou "W".

2) O número de Wumpus sempre é igual ao número de personagens? Se uma única flecha for desperdiçada, não há condições de vitória?

A personagem não sabe nada sobre o número de Wumpus. O enunciado também não diz nada sobre o número de Wumpus. No mundo de exemplo há 1 Wumpus e 2 personagens, mas isso também não quer dizer nada. Esse tipo de conhecimento (ou a falta dele) não deveria influenciar a estratégia de sobrevivência da personagem.

Por outro lado, a vida de uma personagem vale muito mais do que a sua possibilidade de matar um Wumpus, não apenas do ponto de vista humanitário mas também por seu valor comunitário. O fato dela poder mapear o mundo e compartilhar seu conhecimento com outras personagens é motivação suficiente para mantê-la sempre viva, na esperança de que coletivamente o mundo seja libertado de todos os Wumpus.

3) Eu posso assumir que o personagem sempre vai iniciar o jogo numa sala sem ameaças imediatamente adjacentes? Porque em caso contrário sempre haveria pelo menos 25% de chance de perder o jogo logo na primeira rodada, independente de qualquer estratégia, não?

Você não pode supor isso, e sua conclusão está certa, se ela nascer numa sala com ameaças adjacentes sua única opção de primeiro passo já será uma ação arriscada (que ela está autorizada a dar, pois ela não teria conhecimento de salas livres e não-visitadas). Ela poderia até ficar girando na esperança de ser encontrada por outra personagem que lhe apontasse um caminho de saída. É possível que em alguns mundos nem existam salas sem ameaças adjacentes, e ainda assim sejam mundos onde se pode sobreviver e mesmo matar todos os Wumpus. De qualquer modo, isso não seria uma preocupação da personagem. Mesmo que uma personagem nascesse num poço ou na boca de um Wumpus, ela nem chegaria a receber percepções ou ter a oportunidade de agir, então sua brevíssima vida seria uma experiência completamente indolor.

Abraços,

Marcelo

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Caio Túlio de Deus Andrade -

Fiquei com uma outra Dúvida : 

Se estou na seguinte situação : 

Percepção : [F]

---------------------------------------------------------------------

     |    X^V        |     P?       |         V          |         P?

 ---------------------------------------------------------------------

     |        V        |            |             V           |

-----------------------------------------------------------------------

Ou seja, a casa à direita do personagem foi previamente marcada como uma candidata a ter um poço. Porque a percepção acusa um Wumpus por perto, meu programa deveria representar na matriz nas casas a frente, a esquerda e a direita um possível Wumpus (" W? "). No entanto, isso iria apagar a informação de existir possivelmente um poço a direita do personagem. Isso é uma situação possível? Se sim, devo sobrescrever a informação, ou dar um jeito de manter as duas informações?

Em resposta à Caio Túlio de Deus Andrade

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Olá, Caio!

Você deve manter todas as anotações. Vou citar o enunciado: "Cada entrada mundo[i][j] é uma lista de anotações/rótulos correspondentes às informações encontradas ou deduzidas pela personagem sobre o conteúdo da sala (i,j)". Ou seja, no caso que você mencionou, você deveria atualizar o valor daquelas posições à direita (mundo[i][(j+1)%N]) e à esquerda (mundo[i][(j-1)%N]) para

[ "P?", "W?" ]

e analogamente para a posição atrás da personagem (que nesse caso está em baixo, mundo[(i+1)%N][j]) que deveria ser atualizada para

[ "V", "W?" ]

além da posição à frente da personagem, que não está no seu desenho mas estaria na posição mundo[(i-1)%N][j], que deveria ganhar um "W?".

Existem situações onde uma anotação deve ser eliminada: por exemplo ao chegarmos numa sala (i,j) sem percepções, podemos marcar como livres as casas adjacentes, mesmo que elas tenham recebido algum rótulo "P?" ou "W?" anteriormente (que agora sua personagem descobriu que não se aplicam). Nesse caso, esses rótulos que não se aplicam poderiam ser eliminados.

Abraços,

Marcelo

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Caio Túlio de Deus Andrade -

Ah sim, entendi!

Aliás, eu estava dando uma olhada no código de criação da matriz mundo, e tem esse trecho : 

for i in range(N):
    mundo.append([[]]*N)
 
Podemos mudar a forma que a matriz é inicializada? Pois dessa forma podemos ter um erro de referenca ao mexer no conteudo do mundo. Podemos mudar para algo do tipo : 

for i in range(N) : 
    linha = []
       for j in range(N) : 
          linha.append([])
      mundo.append(linha)

?
Em resposta à Caio Túlio de Deus Andrade

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Olá, Caio! (LEIAM COM ATENÇÃO, ESSA MENSAGEM INTERESSA A TODOS!)

> Podemos mudar a forma que a matriz é inicializada?

SIM!! Que bom que você detectou esse erro (não-intencional)! No código original todas as listas vazias de uma mesma linha eram referências para um mesmo objeto, assim se alguém fizesse por exemplo

mundo[0][0].append("W")

isso iria marcar Wumpus em toda a linha 0... surpreso

Assim, peço a todos por favor que substituam as linhas

    for i in range(N):
        mundo.append([[]]*N) # começa com listas vazias
 
da função inicializa() no arquivo personagemNUSP.py pelo código sugerido pelo Caio:
 
    for i in range(N) :
        linha = []
        for j in range(N) :
            linha.append([]) # começa com listas vazias
        mundo.append(linha)

Coincidentemente, o mesmo erro aparecia na inicialização do mundoCompartilhado no arquivo mundo.py, mas ele não tinha esse efeito colateral (de uma marcação aparecer em várias casas) por causa de um outro erro no compartilhamento das informações... um erro acabou compensando o outro... ainda que isso provavelmente não afetasse nada do trabalho de vocês na parte A, sugiro que baixem também a versão atualizada do arquivo mundo.py que está disponível no PACA (para poderem usar o código certo como ponto de partida na parte B).
 
Abraços,
 
Marcelo
 
Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Olás! (ATENÇÃO: ESSA MENSAGEM TEM 3 INFORMAÇÕES IMPORTANTES...)

Uma dica importante que eu dei na aula de ontem foi resolverem o exercício 2 dos Exercícios Complementares no Caderno de Exercícios. O problema de ajudar o rato a encontrar o queijo é extremamente parecido com o problema que a nossa personagem no Mundo de Wumpus enfrentará quando chegar num "beco sem saída" (ou seja, numa sala que é adjacente a 3 salas "arriscadas", marcadas com "W?" ou "P?") e precisar voltar no caminho conhecido para visitar uma sala livre e que ainda não foi visitada. Na adaptação entre os dois problemas, considere que a sala que você quer visitar é o queijo, que as salas visitadas são as posições brancas no problema do ratinho, e que qualquer sala não visitada é uma posição preta (como se fossem paredes, para garantir que a personagem só vai passar por lugares seguros, já visitados). Ao resolver o problema do ratinho, adapte também a geometria do labirinto para tratá-lo como um toro, ou seja, considere as bordas do tabuleiro como passagens/ligações - entre as extremidades esquerda e direita e entre a parte superior e inferior. Não se esqueçam também que nossa personagem só devolve uma ação simples (girar/andar/etc) por vez, e que durante esse caminho outras situações inesperadas podem aparecer (como a oportunidade de compartilhar informações com outra personagem). Como eu mencionei na aula de ontem, essa é certamente a parte mais sofisticada da estratégia da personagem exigida pelo enunciado da parte A.

Em relação às outras exigências do enunciado, que são bem mais simples, recomendo que tratem aquelas listas de requisitos das duas funções como pequenos exercícios separados, e que mantenham anotações sobre o que já está implementado/testado e o que falta implementar. Como o enunciado deixa claro, a personagem de vocês não precisa ser uma exímia jogadora de Wumpus: basta cumprir os requisitos formais estabelecidos. Que isso não sirva de desestímulo a implementações sofisticadas e mirabolantes (estamos todos curiosos para ver os códigos uns dos outros após o prazo de entrega!), mas simplesmente que sirva para estabelecer uma estratégia de implementação: primeiro a obrigação, depois a diversão! piscando

Finalmente, mas não menos importante, devido à HackathonUSP que ocorrerá nesse final de semana e contará com a participação de vários de vocês, a entrega da parte A do EP3 está sendo reprogramada para o dia 13/6, 4a-feira, até 23:55 impreterivelmente.

Boas implementações!

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por João Gabriel Loureiro de Lima Lembo -

Professor, na sua resposta você disse que uma das posições deveria ser atualizada para ["V", "W?"]. No entanto, eu não poderia deixar apenas como ["V"], já que o personagem já visitou aquela sala, e portanto saberia que não existe a possibilidade de haver um Wumpus?

 

Desde já, obrigado.

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Raphael Ribeiro da Costa e Silva -

Podemos criar outras funções para tarefas repetitivas?

Em resposta à Raphael Ribeiro da Costa e Silva

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Oi, Raphael!

> Podemos criar outras funções para tarefas repetitivas?

Quantas quiserem! Funções, variáveis, etc.

Abraço,

Marcelo

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Rogério Marcos Fernandes Neto -

Boa noite, professor e monitores.

 Fiquei com dúvida quanto a um pequeno aspecto de nossa implementação. Obrigatoriamente, quando possível, o nosso personagem deve compartilhar informações com a personagem que se encontra na mesma sala. Atualmente, para efetuar tal ação, basta reconhecer que a personagem "Dummy" se encontra na mesma sala e compartilhar as informações. Entretanto, para partes futuras do EP3, o que devemos utilizar para que nosso personagem reconheça qualquer outra personagem que esteja presente na sala e não só a Dummy?

Em resposta à Rogério Marcos Fernandes Neto

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Boa noite, Rogério!

A ideia é que cada personagem terá um nome, e esse nome será "percebido" por quem quer que esteja na mesma sala que ela. Assim, qualquer string que não seja "I", "F" ou "B" ou "U" no vetor de percepções pode ser interpretado como um nome de personagem, com a qual podemos compartilhar informações.O trecho do enunciado que diz isso é: "Se outra personagem estiver na mesma sala, ela lhe dirá seu nome (diferente de “F”/“B”/“I”/“U”)."

Note que o enunciado obriga a personagem a usar o compartilhamento sempre que possível, mas não obriga a personagem a aceitar a informação compartilhada como "necessariamente verdadeira"; assim, a forma exata com que sua personagem utilizará esse conhecimento externo é uma parte livre (não-especificada) da estratégia que você irá implementar. Quem olhar o código da Dummy verá que tudo o que ela compartilha é "verdade", mas isso não precisa ser verdade para qualquer personagem (mesmo uma personagem não-maliciosa poderia ter feito alguma inferência errônea sobre a posição de poços, Wumpus, etc).

Abraço,

Marcelo

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Davi Lo -

Boa noite,

Em relaçao à este detalhe, entende-se a partir do enunciado que a açao 'Compartilhar' deve ser realizada sempre que possível. e esta açao deve ser feita dentro da funçao agir() do personagemNUSP.py.

Contudo, nao seria possível usar a variável lista 'percepçao' dentro de agir(), já que é argumento de outra funçao (planejar() ). Alguma sugestao ou iluminaçao divina?

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Antônio Carlos Santos de Lima -

Aparentemente, ao ir a uma casa já visitada, o personagem caiu em um poço. Isso é aceitável?

Em resposta à Antônio Carlos Santos de Lima

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Joao Mauad Seckler -

Provavelmente você não corrigiu o bug da respresentacao do mundo em personagemNUSP.py. De maneira que, ao atingir um muro, o personagem acha que andou para a sala desse muro, mas ele não andou. Assim, essa representação está defasada em relação à "realidade"(a representacao de mundo.py). 

 

Para verificar se é esse o erro, convém ativar a variável debug em mundo.py e comparar as duas representações, para ver onde e quando surge um erro de defasagem

 

Abraço,

Joao

Em resposta à Joao Mauad Seckler

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Boa noite, Antônio e João!

Sim, é isso mesmo! Em outras palavras, sua personagem caiu num poço porque havia de fato um poço lá, e isso significa que sua personagem não podia ter visitado aquela casa. Simplesmente o mapeamento que ela fazia do mundo estava errado, e isso provavelmente se deve ao bug original que tinha que ser consertado (isso é a primeira coisa e a mais importante a ser feita).

Abraços,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A Varieaveis globais

por Cainã Setti Galante -

Professor e monitores eu gostaria de saber se podemos declerar mais varaveis globais e se podemos mudar as que ja existem, como por exemplo aumentar o numero de dimenções do mapa?

Em resposta à Cainã Setti Galante

Re: EP3 - Terceiro Exercício-Programa - Parte A Varieaveis globais

por Marcelo Queiroz -

Oi, Cainã!

> Professor e monitores eu gostaria de saber se podemos declerar mais varaveis globais e se podemos mudar as que ja existem, como por exemplo aumentar o numero de dimenções do mapa?

Tem uma coisa que não está muito clara no enunciado: apesar da variável "mundo" ser acessada nesse momento apenas pela personagem para construir sua representação pessoal, e não pelo gerenciador central (mundo.py), queremos permitir o compartilhamento entre quaisquer personagens na parte B, e para isso é necessário seguirmos um protocolo bem definido. Assim, ao invés de considerar uma "sugestão" usar a variável mundo jeito que está proposto (uma matriz de NxN onde cada entrada mudo[i][j] é uma lista de strings curtas do tipo "W?", "L", etc...), o melhor é tratar esse formato como parte obrigatória da especificação.

Abraço,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Cainã Setti Galante -

Professor e Monitores.

Eu gostaria de saber se é permitido o uso de uma escolha aleatoria quando não há casas seguras disponiveis?

 

Em resposta à Cainã Setti Galante

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Olá de novo!

> Eu gostaria de saber se é permitido o uso de uma escolha aleatoria quando não há casas seguras disponiveis?

Bom, o enunciado deixa algumas coisas claras: mesmo quando não há salas seguras na adjacência da posição atual, se você tem conhecimento de uma sala livre (e portanto segura) não-visitada, você precisa explorá-la antes de fazer qualquer movimento arriscado. Isso entendido, sua pergunta permanece: se a lista de salas livres e não-visitadas for vazia, o que fazer? Outro ponto do enunciado diz que não devem ser tomadas decisões aleatórias: isso significa que sua personagem deve estabelecer algum critério: talvez ela prefira arriscar cair num poço do que na boca do Wumpus? talvez ela prefira andar em frente do que ter que girar e depois andar? talvez ela prefira ir para a esquerda do que para a direita? (antes de entrarmos em discussões políticas, lembrem-se que o mundo não tem norte fixo... boca aberta).

Abraço,

Marcelo

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Tomás Eugenio -

As personagens vão ser simuladas em diferentes mundos? Se uma personagem com um bom algoritmo poderia sempre morrer em um mundo especifico por causa dos seus criterios para escolha de caminhos quando todos são igualmente perigosos.

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Leonardo Alves Pereira -

Olá!

Queria saber se no caso de haver um muro e a personagem for na direção deste, o movimento não deve ser registrado ou se ela deve se mover e em seguida voltar à posição anterior.

Obrigado!

Em resposta à Leonardo Alves Pereira

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Olá, Leonardo!

Se há um muro à frente, é impossível a personagem se deslocar para aquela sala. Se ela anotar na sua representação do mundo que ela está onde não está, para depois de receber um impacto corrigir essa representação, ela provavelmente vai prejudicar outras personagens que compartilhem essa informação errada. Assim o ideal seria atualizar a posição apenas quando o movimento fosse real, e não apenas pretendido. Lembre-se que as ações devolvidas pela função agir são "pretendidas": você pode tentar andar e não conseguir, bem como você pode tentar atirar uma flecha sem possuir uma flecha (mas você não consegue enganar o mundo, que sabe onde estão os muros e quantas flechas você tem).

Abraço,

Marcelo

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Antônio Carlos Santos de Lima -

Olá, professor.

Quando tentei atualizar a posição do jogador apenas após a percepção, o mundo é impresso na primeira vez com o jogador na posição [1,0] e com o [0,0] marcado com um "V". Isso é normal?

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Tomás Eugenio -

Se os outputs do print são apenas para depuração, não é preciso ter acentos ou caracteres especiais no código?

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Pedro Gigeck Freire -

Boa noite!

Uma vez que todos os prints tem objetivos de interagir com um usuário controlando a personagem, não é necessário nenhum print para nosso personagem programado, certo?
Assim questiono se devo tirar todos os prints (tanto do mundo quanto das percepções), ou se devo deixá-los lá (e ao executar o código são gerados vááários prints insanamente) (talvez para auxiliar a correção?)

Agradecido e já peço desculpas adiantadas se a resposta tiver escrita em algum lugar que eu deixei passar xD

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Antônio Carlos Santos de Lima -

Através da ação "C", o meu personagem também compartilha o mundo dele ou apenas recebe o mundo de um outro personagem que está na mesma sala? Se o meu personagem também compartilha através dessa ação, como enviar o meu mundo ao outro personagem?

 

Em resposta à Antônio Carlos Santos de Lima

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Bom dia, pessoal! Vou responder várias dúvidas nesse e-mail:

Antônio: Quando tentei atualizar a posição do jogador apenas após a percepção, o mundo é impresso na primeira vez com o jogador na posição [1,0] e com o [0,0] marcado com um "V". Isso é normal?

Pedro: Assim questiono se devo tirar todos os prints (tanto do mundo quanto das percepções), ou se devo deixá-los lá (e ao executar o código são gerados vááários prints insanamente) (talvez para auxiliar a correção?)

Os prints todos são apenas para efeito de depuração de vocês, não fazem parte da especificação. Mas eles são muito úteis! No módulo personagemNUSP.py esses print's estão sempre dentre de "if __DEBUG__", então o melhor jeito de removê-los seria mudar o valor da variável __DEBUG__ para False no início do código. No mundo.py tanto faz o que você mude, pois esse arquivo não deve ser entregue.

Sobre a posição inicial do jogador, Antônio, deve haver algo errado no seu código, pois independentemente da primeira ação, havia um trecho desses de depuração na função planejar() que imprime o mundo conhecido pela personagem, e na primeira chamada essa função teria que produzir a personagem na posição (0,0), sem nenhuma casa visitada. A função planejar() não poderia ter atualizado a posição antes da função agir() devolver "A".

Leonardo: Estou em dúvida se ao visitar uma sala livre devo marcar "VL" ou apenas "V".

Não existe um símbolo "VL" no enunciado, e isso pode impedir outras personagens de entender sua marcação, pois muitos códigos farão perguntas do tipo: if "L" in mundo[i][j]:...). Você deve marcar uma sala livre como "L" e uma sala visitada como "V", lembrando que esses são itens dentro de uma lista mundo[i][j]. Ou seja, ao constatar que a sala está livre, o valor de mundo[i][j] seria ["L"], e após a visita se tornaria ["L", "V"].

Antônio: Através da ação "C", o meu personagem também compartilha o mundo dele ou apenas recebe o mundo de um outro personagem que está na mesma sala?

Apenas recebe informação: pense na ação "C" como "solicitar Compartilhamento". Mas lembre que quem gerencia essa transferência de conhecimento é o mundo, que é o único elemento do código com acesso a todas as personagens. Será responsabilidade da outra personagem solicitar também o compartilhamento se quiser receber informações suas. Na parte B do EP3 esse mecanismo de transferência ficará mais claro (por exemplo, o que fazer se houver 3 ou mais personagens na mesma sala e uma solicitar o compartilhamento.

Abraços,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Joao Mauad Seckler -

Boa noite!

No módulo personagemNUSP.py esses print's estão sempre dentre de "if __DEBUG__", então o melhor jeito de removê-los seria mudar o valor da variável __DEBUG__ para False no início do código. No mundo.py tanto faz o que você mude, pois esse arquivo não deve ser entregue.

Tentando entender a orientação, eu coloquei dentro de um bloco if __DEBUG__ todo o trecho referido pela documentação como "trecho de ilustração". Mas estava dentro do trecho de ilustração linhas que atualizam a orientação e a posição da personagem:

 pos[0] = (pos[0]+ori[0])%len(mundo)
 pos[1] = (pos[1]+ori[1])%len(mundo)
 ...

Atribuindo False à __DEBUG__ e rodando "python mundo.py", o código entra em loop infinito e não dá resposta.

Fiquei com essa dúvida: essa atualização faz parte só da representação da personagem ou ela faz parte do mecanismo do mundo? Relendo a proposta agora ficou me parecendo que ela não faz parte da representação do mundo, que só se comunica com a personagem chamando inicializa(), agir() e planejar() e através de mundoCompartilhado, nFlechas e o return de agir(), mas que, por outro lado, se a personagem não guardar para si mesma sua posição e orientação, ela vai ficar sem saber essas coisas, pois o mundo não vai lhe contar isso de qualquer jeito.

Está certo o que estou assumindo? Segundo essa linha esse trecho que atualiza "posicao" e "orientacao" não é exatamente de ilustração, mas da estrutura da representação da personagem, e portanto deve ficar fora de um bloco de debug, confere?

Abraços,

João

 

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Antônio Carlos Santos de Lima -

Olá, professor.

Obrigado por responder às minhas perguntas.

No enunciado do EP3a, está escrito: "se não sinto nem fedor (“F”) nem brisa (“B”), posso concluir que as salas vizinhas estão livres (“L”)". E se, em alguma casa vizinha, houver um muro ainda não detectado, já que um muro é detectado apenas quando um personagem tenta acessar uma sala murada?

Em resposta à Antônio Carlos Santos de Lima

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Bom dia a todos! Segue mais uma série de respostas:

Antônio Carlos: No enunciado do EP3a, está escrito: "se não sinto nem fedor (“F”) nem brisa (“B”), posso concluir que as salas vizinhas estão livres (“L”)". E se, em alguma casa vizinha, houver um muro ainda não detectado, já que um muro é detectado apenas quando um personagem TENTA acessar uma sala murada?

Salas livres significam que estão "livres de perigos", e isso inclui as salas cujas entradas estão lacradas com muros. Tentar entrar em uma sala lacrada e sentir um impacto não põe a vida da personagem em risco. Você deve marcar as salas que você sabe que não possuem perigo e que você não visitou com "L" para ser capaz de voltar para ela e explorá-la alguma hora, mesmo que seja para descobrir que tem um muro. Quando você tentar entrar e sentir o impacto, pode atualizar a informação que possui dele, acrescentando um "M" e um "V" à lista de anotações. Você pode tirar o "L" também, mas isso não é obrigatório (não está especificado).

João Gabriel: Professor, na sua resposta você disse que uma das posições deveria ser atualizada para ["V", "W?"]. No entanto, eu não poderia deixar apenas como
["V"], já que o personagem já visitou aquela sala, e portanto saberia que não existe a possibilidade de haver um Wumpus?

Sim, você poderia deixar só o "V". Talvez minha resposta tenha ficado confusa pois eu estava ilustrando um único raciocínio: (*) se sinto "F" posso concluir "W?" nas salas vizinhas. O raciocínio que você ilustra é outro: (**) se visitei uma sala, sei que ela não possui perigos (e posso apagar "P?" e "W?" se estiverem lá). Os raciocínios podem ser encadeados de várias maneiras diferentes, e possivelmente com resultados diferentes (por exemplo se fizéssemos (**) antes de (*) nesse caso o "W?" iria permanecer lá).

As duas perguntas anteriores se referem a como usar exatamente a lista de anotações, e como atualizá-la. Várias dessas questões não estão especificadas, o que deixa vocês livres para decidir o que fazer. Por exemplo me pareceria conveniente marcar com "V" uma sala que tem um muro, pois se em algum raciocínio você quisesse varrer a vizinhança e checar as salas já visitadas, poderia escrever uma condição simples (if "V" in mundo[i][j]) ao invés de uma condição composta (if "V" in mundo[i][j] and "M" in mundo[i][j]). Isso depende de você interpretar "V" como "já entrei lá" ou "já tentei entrar lá".

Davi: Contudo, nao seria possível usar a variável lista 'percepçao' dentro de agir(), já que é argumento de outra funçao (planejar() ). Alguma sugestao ou iluminaçao divina?

Alessandro: Cria uma variável global booleana...

Essa é uma possibilidade. Outra é transferir suas percepções para a lista mundo[i][j], nesse caso você ainda seria capaz de "perceber" (ou mais propriamente "lembrar de ter percebido") a presença da outra personagem na função agir().

Abraços,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Antônio Carlos Santos de Lima -

Assim como os outros personagens, o Wumpus pode se mover no toro?

Em resposta à Antônio Carlos Santos de Lima

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Olás! Mais algumas respostas:

Bento: É possível nascer em uma casa que contenha ameaças?

Sim, e isso é irrelevante para a personagem, e portanto para a parte A. Veja essa mensagem.

Tomás: As personagens vão ser simuladas em diferentes mundos? Se uma personagem com um bom algoritmo poderia sempre morrer em um mundo especifico por causa dos seus criterios para escolha de caminhos quando todos são igualmente perigosos.

Sim, a cada execução do jogo o mundo será criado de forma aleatória. Sua personagem não deve pressupor nada sobre o mundo. Veja essa mensagem.

Antônio Carlos: Assim como os outros personagens, o Wumpus pode se mover no toro?

Não! Esses animais temíveis não possuem meios de locomoção. Que lástima que isso escapou ao enunciado... e que sorte que você perguntou! Isso de certo modo ficou implícito em todas as partes do texto que mencionavam inferências sobre a localização de Wumpus, marcações do tipo "W?", etc.

Abraços,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Antônio Carlos Santos de Lima -

A estratégia obrigatoriamente deve fazer com que o personagem encontre o(s) Wumpus e atire nele(s)? Ou a estratégia pode ser uma tentativa de fazer isso?

A primeira opção parece exigir uma estratégia muito sofisticada.

Em resposta à Antônio Carlos Santos de Lima

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Boa noite!

João: Está certo o que estou assumindo? Segundo essa linha esse trecho que atualiza "posicao" e "orientacao" não é exatamente de ilustração, mas da estrutura da representação da personagem, e portanto deve ficar fora de um bloco de debug, confere?

Toda a estratégia da personagem deve estar fora de blocos __DEBUG__. Aquele trecho estava dentro do __DEBUG__ para chamar a atenção de vocês de que era algo sobre o qual vocês teriam que pensar e mexer. Aquela atualização de posição, como expliquei, nem deveria estar na função agir(), mas na função planejar().

Eduardo: Oi professor, onde está o link de entrega do EP3? não consigo encontrá-lo

Será colocado no ar em tempo para a entrega, que ficou para o dia 13/6.

Antônio Carlos: A estratégia obrigatoriamente deve fazer com que o personagem encontre o(s) Wumpus e atire nele(s)? Ou a estratégia pode ser uma tentativa de fazer isso?

Nada na especificação obriga a personagem a encontrar o Wumpus, ou a usar a flecha. As funções devem satisfazer as listas de requisitos formais.

Abraços,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Caio Túlio de Deus Andrade -

Boa tarde, pessoal.


Ao pedir para o Dummy compartilhar informações comigo, ocorre o seguinte erro : o programa faz .append com as informações coletadas pela dummy, de forma que, se eu anotei na minha madriz uma duvida do tipo "a sala (2,2) pode ter um poço"(, ou seja, coloco 'P?' na dada ), e o Dummy já passou por lá e sabe que a casa está livre, acontece que a casa (2,2) da minha matriz fica com conteudo 'P?L', ou seja, as informações coletadas pelo dummy não sobrescrevem minhas informações sobre uma posição, e sim são acrescentadas. Como posso lidar com isso? Tendo em vista que a informação do Dummy é certeira.

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Pedro Gigeck Freire -

Boa noite!

1) Não entendi direito a diferença desses dois tópicos das especificações da função planejar:
● incorporar os dados da percepção (“F”/”B”) à representação do mundo;
● incorporar as inferências correspondentes (“W?”/”P?”) para as salas vizinhas de “F”/”B” (quando já não forem “V”/”L”), bem como marcar com “M” os muros encontrados;

incorporar os dados da percepção  (“F”/”B”) não seria o mesmo que marcar "W?"/"P?" nas salas vizinhas?

2) Meu personagem deve obrigatoriamente saber deduzir quando casas P? ou W? são definitivamente P ou W (envolvendo prováveis varreduras de muito mais casas a cada nova percepção para tais deduções) ?

3) Dois personagens podem nascer na mesma casa? 

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Leandro Rodrigues da Silva -

Boa noite, Professor.

Algo que não ficou muito claro pra mim, e dei uma lida no paca pra ver se não havia nenhuma pergunta parecida, é:

Ao escolher os movimentos do meu personagem, digamos que eu queria que ele vá para a casa "atrás" dele. Devo fazê-lo girar e andar ou simplesmente posso definir a posição para a casa atrás dele?

Obrigado.

Em resposta à Leandro Rodrigues da Silva

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Eduardo Brancher Urenha -

Leandro, acho que se voce fizer isso, o seu personagem vai estar pensando que está atras, mas na verdade não vai ter mudado de lugar. Quem processa os movimentos dele é o módulo mundo.py, e esse módulo precisa que você gire e depois ande para processar o movimento.

Em resposta à Marcelo Queiroz

Sucesso e Fracasso e Nota

por Robson Shimohara -

Professor, na maioria das vezes, meu bot mata o Wumpus, mas têm vezes que ele dispara a flecha e erra. Meu programa está errado ou é assim mesmo? Perco nota por isso?

Em resposta à Robson Shimohara

EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Bom dia, pessoal!

Caio: as informações coletadas pelo dummy não sobrescrevem minhas informações sobre uma posição, e sim são acrescentadas. Como posso lidar com isso? Tendo em vista que a informação do Dummy é certeira.

Ao solicitar o compartilhamento nossa personagem recebe a informação das outras através do atributo mundoCompartilhado. Nada é acrescentado à nossa própria representação do mundo, cuja responsabilidade de atualização/organização/gerenciamento é nossa. Não sei se sua dúvida se refere à maneira como as informações estão impressas na tela (pelo código de __DEBUG__): o que você enxerga alí é uma justaposição do que está nas variáveis mundo e mundoCompartilhado. E cuidado com a representação: não existe anotação do tipo "P?L", isso seria apenas a visualização de uma lista mundo[i][j] cujo conteúdo deveria ser [ "P?", "L" ]. Quanto à última frase, muito cuidado! Você pode saber que a Dummy não mente, mas sua personagem não teria como saber isso. Além do mais, não faria nenhum sentido implementar estratégias específicas para a Dummy, que não estará no mundo da parte B do EP3.

Pedro: 1) incorporar os dados da percepção  (“F”/”B”) não seria o mesmo que marcar "W?"/"P?" nas salas vizinhas? 2) Meu personagem deve obrigatoriamente saber deduzir quando casas P? ou W? são definitivamente P ou W? 3) Dois personagens podem nascer na mesma casa?

1) Não são o mesmo: um "F" ou "B" permite deduzir os correspondentes "W?" ou "P?", mas um "W?" sozinho não permite concluir nem onde há "F"'s nem onde estariam os outros "W?"'s. um "B" é uma informação perene, o "F" dura enquanto existir um Wumpus ao lado, e os "W?" e "P?" podem desaparecer assim que você passar em outro ponto do tabuleiro e puder concluir que aquelas salas são livres.

2) Não! Isso é bem complicado. Se um dia estudarem IA, provavelmente estudarão os modelos lógicos para resolverem esse tipo de inferência.

3) Se não há nada dizendo que não no enunciado, então podem. Mas isso não deveria alterar uma linha do seu código...

Leandro: Ao escolher os movimentos do meu personagem, digamos que eu queria que ele vá para a casa "atrás" dele. Devo fazê-lo girar e andar ou simplesmente posso definir a posição para a casa atrás dele?

Só existem 5 ações disponíveis; ir para trás só é possível corrigindo a orientação (dois "D"'s ou dois "E"'s seguidos) e avançando ("A"). O que você propõe (definir a posição) não tem efeito nenhum no mundo real, nem na posição real da sua personagem. Se ainda não está claro o que é a representação pessoal e o que é o mundo real, ligue o __DEBUG__ do mundo.py pra ver como as coisas são "de fato". O mundo sempre sabe onde sua personagem está, pra que lado está olhando e quantas flechas tem, independentemente das variáveis internas da personagem.

Robson: na maioria das vezes, meu bot mata o Wumpus, mas têm vezes que ele dispara a flecha e erra. Meu programa está errado ou é assim mesmo? Perco nota por isso?

Muito legal que sua personagem consegue eliminar a Wumpus muitas vezes. Isso não é uma exigência do enunciado, e certamente não entraria no critério de correção. Apenas os requisitos formais são obrigatórios.

Abraços,

Marcelo

 

Em resposta à Marcelo Queiroz

Nota

por Robson Shimohara -

Professor, acho que meu programa está funcionando 100% agora. O bot nunca morre e sempre acerta o Wumpus! Se eu não tirar uma boa nota neste EP, eu não sei mais o que fazer...

Em resposta à Robson Shimohara

Re: Nota

por Marcelo Queiroz -

Robson: Professor, acho que meu programa está funcionando 100% agora. O bot nunca morre e sempre acerta o Wumpus! Se eu não tirar uma boa nota neste EP, eu não sei mais o que fazer...

Estarei torcendo por isso!

Abraço,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Matheus Koiti Ito -

Professor, a Parte A influencia na nota da Parte B? Ou é possível ir bem na Parte B mesmo tendo implementado um código horrível na Parte A?

Em resposta à Matheus Koiti Ito

Re: EP3 - Terceiro Exercício-Programa - Parte A

por Marcelo Queiroz -

Boa noite, Matheus!

A avaliação das duas partes é totalmente independente! Capriche na parte B!

Abraço,

Marcelo