Как я могу исправить этот счетчик, который я написал, чтобы узнать количество заблокированных звонков? - PullRequest
0 голосов
/ 23 октября 2019

Для чего предназначен мой код:

Имитация 100 голосовых вызовов, которые происходят по сети N каналов, и расчет уровня обслуживания (то есть процент заблокированных вызовов)в течение 60 минут.

Мой код:

import numpy as np
import pandas as pd

#Uniformly distributed start times
startTimes = np.random.randint(0,60,100)
startTimes.sort()

#Average call time for 100 people 
callDuration = np.random.poisson(20, 100)

channelCounter = 0;
blockedCounter = 0;

endTimes = np.add(callDuration, startTimes)

numberChannels = 1

for x in range(0,60): 

    for y in range(0, startTimes.size):

        if startTimes[y] == x: 
            if channelCounter < numberChannels:
                channelCounter=channelCounter+1

            elif channelCounter == numberChannels: 

                blockedCounter = blockedCounter + 1

        if (endTimes[y] == x):
            if channelCounter >= 1:
                channelCounter=channelCounter-1

Мой подход:

Я генерирую равномерное распределение в 100 времен начала звонка, начинаяот 0 до 60 минут.

Я генерирую случайное распределение Пуассона 100 длительностей вызовов для среднего времени вызова 20 минут.

Я установил переменную моего счетчика канала и заблокированные переменные счетчика на 0.

Наконец, я создаю другой массив, состоящий из суммы времени начала вызова + средней продолжительности вызова, чтобы получить время окончания вызова.

Логика псевдокода за приращением заблокированного счетчика выглядит следующим образом:

if number of channels occupied < number channels available:
    put a call through 
else if number of channels occupied == number channels available ( ie full):
    call is dropped so counter incremements 

if a call that is ongoing finishes: 
    decrement number of channels occupied 

Мой заблокированный счетчик не увеличивается, как я ожидаю. У меня есть смутное представление о том, что идет не так, но я не знаю, как это исправить. С текущими значениями, которые я ввожу, я должен ожидать увидеть значение около 95 для заблокированного счетчика. Однако я получаю значение, которое колеблется около 70-75.

Если кто-нибудь заметит, где я ошибаюсь, я был бы очень признателен!

Снимок экрана с данными, с которыми я работаю

1 Ответ

0 голосов
/ 23 октября 2019

Хорошо, ваша проблема в том, что вы принимаете ЛЮБОЕ значение endTime, которое происходит в данную минуту в качестве знака освобождения канала. Принимая во внимание, что некоторые из них были фактически заблокированы. Именно поэтому вы увеличиваете общее количество незаблокированных звонков. Вам скорее всего нужно вычислить количество неперекрывающихся интервалов <<code>startTime, endTime> (при условии, что возможные максимальные пересекающиеся вызовы в данную минуту равны numberChannels И приоритет порядка вызовов)

При условии, чтоодин канал, который вы можете сделать:

minute=0
nonBlockedCounter=0

while(minute<=60):
    minute = min(startTimes[minute<=startTimes])
    if(minute>=0):
        nonBlockedCounter+=1
        minute=endTimes[startTimes==minute][0]
blockedCounter=100-nonBlockedCounter
print(blockedCounter)

Чаще всего выход составляет около 96-97.

...