File size: 3,631 Bytes
14f2b08
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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