2017-10-31 12 views
0

몇 시간 동안이 작업을 수행하는 방법에 대해 생각해 왔지만 막혔습니다.주어진 시간에 대기열에있는 사람의 수를 생각해 보면 도착 및 출발 시간의 매트릭스가 있습니까?

고객의 도착 시간과 함께 매트릭스 A, 고객의 출발 시간과 함께 매트릭스 D가 있습니다. 예 : 도착 매트릭스의 시간은 한 고객이 그 시간에 도착한 것을 의미하고, 출발 매트릭스의 시간은 한 고객이 출발했다는 것을 의미합니다.

t = 1..800에서 1 간격으로 매장 고객 수를 그래프로 표시하려고합니다. 그러나 고객의 도착 시간과 출발 시간은 임의의 변수로 결정됩니다. 임의의 간격으로 증가하는 타임 스텝으로 실행되는 시뮬레이션이므로 시뮬레이션 시간에 주어진 시간 간격으로 고객 수를 저장하는 것이 어렵다는 것을 알고 있습니다.

도착 행렬과 출발 시간 행렬이 주어진 간격으로 일정한 간격으로 고객의 수와 함께 행렬 N을 채울 수있는 방법이 있어야한다고 생각하지만, 내 인생에서 그게 무엇인지 생각할 수는 없다. . 누군가 올바른 방향으로 나를 가리킬 수 있습니까?

+0

https://stackoverflow.com/questions/45972684/get-a-list-of-overlapping-time-ranges-from-a-set-of-appointments/45973161#45973161 – MBo

+0

답장을 보내 주셔서 감사합니다. 나는 도착/출발 시간의 매트릭스를 반복하는 것에 대해 여전히 혼란 스럽다 - 나는 오버랩을 찾고있는 것이 아니라 주어진 시간에 상점의 고객 수를 계산하는 방법을 찾고있다. –

+0

큐 길이 값이 발생할 때 모든 큐 길이 값을 플로팅하는 것이 아니라 단위 시간 틱에서만 플로팅하려는 이유가 있습니까? 후자는 실제로 더 흥미 롭습니다. – pjs

답변

1

도착 및 출발은 "이벤트"이며 배열에는 해당 이벤트의 시간이 포함됩니다. 기본 논리는 다음 이벤트의 시간을 찾고 해당 이벤트와 연관된 업데이트를 수행하는 것입니다. 도착한 경우 대기열 길이가 증가합니다. 출발의 경우 대기열 길이가 감소됩니다.

a = [1.1, 2.9, 5.1, 6.5] 
d = [3.5, 5.2, 7.2, 8.0] 

queue = 0 
a_index = 0 
d_index = 0 
print(0, ':', queue) 

while a_index < len(a) and d_index < len(d): 
    if a[a_index] < d[d_index]: # did an arrival come first? 
     queue += 1 
     print(a[a_index], ':', queue) 
     a_index += 1 
    else: 
     queue -= 1 
     print(d[d_index], ':', queue) 
     d_index += 1 

# ran out of elements in one of the arrays, 
# iterate through remainder of the other 

while a_index < len(a): 
    queue += 1 
    print(a[a_index], ':', queue) 
    a_index += 1 

while d_index < len(d): 
    queue -= 1 
    print(d[d_index], ':', queue) 
    d_index += 1 

당신이 정수 시간 만 인쇄하려면 : 다음은 시간이 변경 될 때마다 큐 길이를 출력하는 아이디어 (지정하지 않았기 때문에 Python3) 오히려 무차별 구현 , 이들을 이벤트로 설정하십시오.

a = [1.1, 2.9, 5.1, 6.5] 
d = [3.5, 5.2, 7.2, 8.0] 

queue = 0 
a_index = 0 
d_index = 0 
print_time = 1 
max_time = 10 
print(0, ':', queue) 

while a_index < len(a) and d_index < len(d): 
    if a[a_index] < d[d_index] and a[a_index] <= print_time: 
     queue += 1 
     a_index += 1 
    elif d[d_index] <= print_time: 
     queue -= 1 
     d_index += 1 
    else: 
     print(print_time, ':', queue) 
     print_time += 1 

while a_index < len(a): 
    if a[a_index] <= print_time: 
     queue += 1 
     a_index += 1 
    else: 
     print(print_time, ':', queue) 
     print_time += 1 

while d_index < len(d): 
    if d[d_index] <= print_time: 
     queue -= 1 
     d_index += 1 
    else: 
     print(print_time, ':', queue) 
     print_time += 1 

while print_time <= max_time: 
    print(print_time, ':', queue) 
    print_time += 1 

이러한 것들은 분명히 강화 될 수 있지만 접근 방법을 전달합니다.

이벤트 수가 적은 경우 우선 순위 큐에 이벤트를 발생 시간순으로 배치 한 후 이벤트를 하나씩 꺼내어 적절한 이벤트로 전달하는 것이 좋습니다 어떤 이벤트 유형이 발생했는지에 기초한 상태 전이 로직. 이 접근 방식의 논리는 this paper에 설명되어 있습니다. 이 논문은 Java로 아이디어를 구현하지만, Python3 구현과 데모 큐 모델은 here을 사용할 수 있습니다.