Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Faça como eu fiz: utilizando cadeias de Markov

Variação 2: Abordagem Orientada a Objetos (POO)

Usando essa variação achei mais interessante para reaproveitar o código.

Organizar o modelo em uma classe torna o código reutilizável, modular e fácil de integrar a sistemas maiores (como APIs ou pipelines de dados).

import numpy as np

class PrevisorMarkovClima:
    """
    Classe para modelagem e simulação de previsão do tempo
    utilizando Cadeias de Markov discretas.
    """
    
    def __init__(self, estados: list, matriz_transicao: list):
        self.estados = estados
        self.matriz = np.array(matriz_transicao)
        self._validar_matriz()
        
    def _validar_matriz(self):
        """Valida se as probabilidades de cada linha somam aproximadamente 1.0"""
        somas_linhas = self.matriz.sum(axis=1)
        if not np.allclose(somas_linhas, 1.0):
            raise ValueError("A soma das probabilidades de cada linha da matriz deve ser igual a 1.")

    def _get_indice(self, estado: str) -> int:
        """Retorna o índice numérico do estado fornecido."""
        return self.estados.index(estado)

    def simular_trajetoria(self, estado_inicial: str, dias: int) -> list:
        """Gera uma sequência simulada de clima para N dias."""
        if estado_inicial not in self.estados:
            raise ValueError(f"Estado '{estado_inicial}' inválido. Escolha entre: {self.estados}")

        clima_atual = estado_inicial
        trajetoria = [clima_atual]

        for _ in range(dias - 1):
            idx_atual = self._get_indice(clima_atual)
            # Sorteia o próximo estado com base na linha atual da matriz
            proximo_clima = np.random.choice(self.estados, p=self.matriz[idx_atual])
            trajetoria.append(proximo_clima)
            clima_atual = proximo_clima

        return trajetoria

# ---------------------------------------------------------
# Testando a Classe
# ---------------------------------------------------------
if __name__ == "__main__":
    lista_estados = ["Ensolarado", "Nublado", "Chuvoso"]
    matriz = [
        [0.8, 0.15, 0.05],
        [0.2, 0.6, 0.2],
        [0.25, 0.25, 0.5]
    ]

    # Instanciando o modelo
    modelo_clima = PrevisorMarkovClima(lista_estados, matriz)
    
    # Gerando previsão
    previsao = modelo_clima.simular_trajetoria(estado_inicial="Ensolarado", dias=10)
    
    print("=== PREVISÃO (VERSÃO POO) ===")
    for i, dia_clima in enumerate(previsao, start=1):
        print(f"Dia {i:02d}: {dia_clima}")
1 resposta

Olá, Carlos. Tudo bem com você?

Obrigado por compartilhar sua solução para a atividade sobre cadeias de Markov. A abordagem orientada a objetos foi aplicada de forma adequada e faz sentido para esse contexto, principalmente quando existe a intenção de reutilizar o modelo em outros projetos. Sua classe separa bem as responsabilidades, incluindo a validação da matriz de transição, a obtenção do índice dos estados e a simulação da trajetória climática. Além disso, a utilização do numpy para representar a matriz e realizar o sorteio dos estados torna a implementação consistente com a proposta da atividade.

Como dica de evolução, você poderia incluir uma verificação para garantir que a matriz tenha o mesmo número de linhas e colunas que a quantidade de estados informados. Outra possibilidade seria permitir definir uma semente aleatória com np.random.seed(), facilitando a reprodução dos mesmos resultados durante testes. Por exemplo, ao utilizar a mesma semente antes da simulação, a sequência de estados gerada será sempre a mesma, o que é útil para validar o comportamento da implementação.

Quais outras funcionalidades você adicionaria a essa classe caso ela fosse utilizada em um sistema de previsão climática mais completo?

Parabéns pelo empenho na atividade e por explorar uma solução além do esperado. Continue compartilhando suas implementações. O fórum está à disposição para acompanhar seu aprendizado.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!