import random import numpy as np class next_question_level: def calculate_current_level(self, probabilities): current_level = max(probabilities, key=probabilities.get) return current_level #standard normalisation def normalisation(self, probabilities): total = sum(probabilities.values()) normalized_probabilities = {} for key, value in probabilities.items(): normalized_probabilities[key] = value / total * 100 return normalized_probabilities def normalize_probabilities(self, probabilities): probs = probabilities.values() lowest = min(probs) highest = max(probs) dif = highest - lowest lowest = lowest - 0.05 * dif highest = highest + 0.05 * dif dif = highest - lowest for key,value in probabilities.items(): probabilities[key] = ((value-lowest)/dif) * 100 return probabilities def roulette_wheel(self, probabilities): total_prob = sum(probabilities.values()) random_num = random.uniform(0, total_prob) cumulative_prob = 0 for level, prob in probabilities.items(): cumulative_prob += prob if random_num <= cumulative_prob: return level def update_probabilities(self, user_input,curr_question_difficulty,probabilities): curr_level = self.calculate_current_level(probabilities) curr_prob = probabilities[curr_question_difficulty] if user_input == 1: if curr_level == 'easy': probabilities['easy'] -= curr_prob * 0.3 *3 probabilities['medium'] += curr_prob * 0.3 * 2 probabilities['hard'] += curr_prob * 0.3 * 1 elif curr_level == 'medium': probabilities['easy'] -= curr_prob * 0.3 * 3 probabilities['medium'] -= curr_prob * 0.3 * 2 probabilities['hard'] += curr_prob * 0.3 * 1 elif curr_level == 'hard': probabilities['easy'] -= curr_prob * 0.3 * 3 probabilities['medium'] -= curr_prob * 0.3 * 2 probabilities['hard'] += curr_prob * 0.3 * 1 else: if curr_level == 'easy': probabilities['easy'] += curr_prob * 0.3 * 3 probabilities['medium'] -= curr_prob * 0.3 * 1 probabilities['hard'] -= curr_prob * 0.3 * 2 elif curr_level == 'medium': probabilities['easy'] += curr_prob * 0.3 * 1 probabilities['medium'] += curr_prob * 0.3 * 2 probabilities['hard'] -= curr_prob * 0.3 * 3 elif curr_level == 'hard': probabilities['easy'] += curr_prob * 0.3 * 1 probabilities['medium'] += curr_prob * 0.3 * 2 probabilities['hard'] -= curr_prob * 0.3 * 3 probabilities = self.normalisation(self.normalize_probabilities(probabilities)) return probabilities def __init__(self, probability): self.probability = probability self.probability = self.normalize_probabilities(self.probability) self.probability = self.normalisation(self.probability) def level(self): self.current_question_difficulty = self.roulette_wheel(self.probability) return self.current_question_difficulty def response_to_current_question(self, correct, difficulty): self.probability = self.update_probabilities(correct, difficulty, self.probability) def get_probabilty(self): return self.probability