Вероятностное моделирование - PullRequest
0 голосов
/ 15 января 2019

Меня попросили смоделировать, работает ли принтер через каждый час в течение одного дня (то есть 24 часа). Если принтер работает после часа, то он имеет 90% вероятности работы и 10% вероятности поломки в конце следующего часа.

Если сломано, то с вероятностью 50% сработает или будет сломано в следующий час.

Предположим, что случайное равномерное распределение и первый час работы принтера.

Мой код на Python ниже:

Chance = []
Status = []
for i in range(24):
    Chance.append(random.uniform(0,1))
Chance[0] = 1
Chance

for i in Chance:
    if i > 0.1:
        Status.append('Working')
    else:
        Status.append('Broken')
Chance, Status

Моя проблема в том, что я не могу смоделировать текущее событие на основе предыдущего события, то есть, если предыдущее событие прервано, как я могу настроить вероятность текущего события на 0,5.

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Вы должны определить свою таблицу вероятностей раньше, например:

                 |              NEXT STATE                |
                 |    WORKING        |      BROKEN        |
CURRENT| WORKING |      0.9          |        0.1         |
STATE  |---------|-------------------|--------------------| 
       | BROKEN  |      0.5          |        0.5         |

Чтобы можно было очень легко изменить значение. Вы даже можете легко добавить новое состояние. Используйте это так:

import random

# The table above
table = [[.9,.1],[.5,.5]]

def simulate():
    # 0 means working, 1 means broken
    current_state = 0
    # Initialise variable
    next_state = current_state

    for i in range(24):
        # Get a number between 0 and 1
        chance = random.uniform(0, 1)

        # Given my current state (line 0 or 1), what chance do I have
        # to work the next hour ?
        if chance <= table[current_state][0]:
            # The chance variable has more chance to be under if the number
            # in the table is high.
            next_state = 0
        else:
            # BROKEN
            next_state = 1
        current_state = next_state
        print("Current state " + ("Working" if current_state == 0 else "Broken"))

if __name__ == "__main__":
    simulate()
0 голосов
/ 15 января 2019

С этим сценарием:

import random

broken_probability = 0
for i in range(24):
    if random.randrange(100) > broken_probability:
        status = 'Working'
        broken_probability += 10
    else:
        status = 'Broken '
        broken_probability = 50

    print('Hour: {} - Status: {} - Broken Probability: {}'.format(str(i).zfill(2), status, broken_probability))

Я получил следующие результаты:

Hour: 00 - Status: Working - Broken Probability: 10
Hour: 01 - Status: Working - Broken Probability: 20
Hour: 02 - Status: Broken  - Broken Probability: 50
Hour: 03 - Status: Broken  - Broken Probability: 50
Hour: 04 - Status: Broken  - Broken Probability: 50
Hour: 05 - Status: Broken  - Broken Probability: 50
Hour: 06 - Status: Working - Broken Probability: 60
Hour: 07 - Status: Broken  - Broken Probability: 50
Hour: 08 - Status: Broken  - Broken Probability: 50
Hour: 09 - Status: Working - Broken Probability: 60
Hour: 10 - Status: Broken  - Broken Probability: 50
Hour: 11 - Status: Broken  - Broken Probability: 50
Hour: 12 - Status: Working - Broken Probability: 60
Hour: 13 - Status: Broken  - Broken Probability: 50
Hour: 14 - Status: Broken  - Broken Probability: 50
Hour: 15 - Status: Working - Broken Probability: 60
Hour: 16 - Status: Working - Broken Probability: 70
Hour: 17 - Status: Broken  - Broken Probability: 50
Hour: 18 - Status: Broken  - Broken Probability: 50
Hour: 19 - Status: Broken  - Broken Probability: 50
Hour: 20 - Status: Broken  - Broken Probability: 50
Hour: 21 - Status: Working - Broken Probability: 60
Hour: 22 - Status: Broken  - Broken Probability: 50
Hour: 23 - Status: Working - Broken Probability: 60
0 голосов
/ 15 января 2019

Вы должны запомнить состояние принтера на предыдущем шаге (час) и настроить порог для расчета случайного двоичного вывода:

status = []
lastStatus = True # Assume it was working

for i in range(24):
    threshold = 0.1 if lastStatus else 0.5
    lastStatus = random.uniform(0, 1) > threshold
    status.append('Working' if lastStatus else 'Broken')
...