2017-02-16 9 views
-1

Я пытаюсь использовать оператор + =, но я получаю неверные результаты. У нас есть парикмахерская в салоне, который предоставляет услуги своим клиентам. В течение каждого дня у нее есть 6 слотов для записи встреч, интервалы между каждой встречей распределены одинаково. Если ей удается записаться на слот, мы обозначим это с переменной 1, если она не может найти клиента для этого слота, то мы будем обозначать это с переменной 0.Как правильно использовать оператор python + =?

Appointments_Booked = [1, 0, 1, 1, 1] # Where 1 indicates an appointment booked and 0 no appointment booked. 

def service_time(): 
    service = random.normalvariate(5, 1) # The time the hair dresser takes to service her customers follows a normal distribution, the hair dresser takes around 5 minutes on average to service each customer 
    return service 

def wait_time(): 
    waiting_time_last_customer = 0 # The waiting time of the first customer is zero because there is no customer booked before him or her 
    interval_time_between_slots = 5 # This is how much time we have between each appointment 
    y = 0 
    for x in Appointments_Booked: 
     if x == 1: # If we have a customer booked for a slot 
      customer_service = service_time() #How long we will take to service a customer 
      waiting_time_present_customer = max((waiting_time_last_customer + customer_service) - interval_time_between_slots, 0) # This is the formula to compute the waiting time of the current customer. It essentially says that the waiting time of the current customer is simply the interval time (space) between appointments minus how much the previous customer had to wait for service and then get serviced. 
      y += waiting_time_present_customer # THIS IS WHERE I AM ENCOUNTERING PROBLEMS 
      print('waiting time =', y) 
      print('service time =', customer_service) 
     elif x == 0: 
      customer_service = 0 
      waiting_time_last_customer = 0 
      y += waiting_time_present_customer 
      print('waiting time =', y) 
      print('service time =', customer_service) 

My + = есть не делая того, что я хочу, чтобы сделать это, во-первых, я хочу, чтобы время ожидания первого клиента всегда было 0, потому что этот клиент не ждет просто потому, что перед ним нет другого клиента. Во-вторых, результаты различны для других клиентов, а также, к примеру, мой выход был:

waiting time = 1.449555339084272 #This does not make any sense because the first customer is supposed to have zero waiting time because they are first in line 
service time = 4.400365861292478 
waiting time = 0 
service time = 0 # refA 
waiting time = 0 # refA 
service time = 4.42621491273674 
waiting time = 1.0771427601173116 # The waiting time of this customer is supposed to also be zero because the service time (#refA) + waiting time(#refA) of the previous customer is zero. 
service time = 6.077142760117312 
waiting time = 1.0771427601173116 # The waiting time of this customer is also wrong because its supposed to be 2.154. The waiting time (1.077) + the service time (6.077) of the previous customer is 7.154 minus the interval 5 gives 2.154 
service time = 4.166720282779419 

Что я делаю неправильно с оператором + =, или, может быть, я делаю что-то еще не так?

ответ

1

Вы добавляете customer_service в свое время ожидания. Стандартная односерверные очереди модели говорит, что:

arrival_time(i) = arrival_time(i-1) + interarrival_time # often exponential 
begin_service_time(i) = max(arrival_time(i), end_service_time(i-1)) 
end_service_time(i) = begin_service_time(i) + customer_service(i) 

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

Вы решили дискретировать это на временные интервалы, но это не изменяет основные логические недостатки a) включая customer_service текущего клиента в ожидаемое время и b) основывая результат на времени ожидания раньше, чем время, которое они закончили.

Могут быть другие недостатки, но я прекратил проверку, учитывая, что это шоу-стопперы, и вы не указали фактический код драйвера для запуска вашей модели.

+0

Hi Pjs, я просто хотел на этот раз поблагодарить вас за то, что нашел время, чтобы заняться моей проблемой. Я очень ценю ваш вклад и время, я действительно очень благодарен за это. Я просто просматриваю вашу информацию, чтобы настроить свою программу. –

+0

Как сбросить i и пропустить через список Customer_Numbers = [1, 2, 3, 4, 5] #, где каждый элемент в списке представляет i, я пытался выполнить это упражнение более часа –

+0

Идея заключается в том, что вам не нужно поддерживать хранение в массиве для всех значений для всех клиентов. Например, как только вы найдете 'arrival_time' клиента' i', вам больше не понадобится 'arrival_time' любого из предыдущих клиентов. Следовательно, вы можете вычислить значение как 'arrival_time + = interarrival_time' без индекса. Вам по-прежнему придется выполнять итерацию по набору клиентов, но вам не нужно выделять хранилище для всех клиентов одновременно. – pjs

Смежные вопросы