2017-06-17 84 views
0

私はCareerCupで見た興味深い問題のためエレベーターシミュレーションをしようとしています。私の問題は、エレベーターがあるフロアから別のフロアに移動するのに時間がかかることです。今すぐただちに「訪問する」リストの次のフロアに移動します。私はエレベーターが動いている間に "ピックアップリクエスト"が来るようにプログラムする方法がわかりません。私はこれがスレッドとtime.sleep()関数を必要とするかもしれないと思う。エレベータに対してランダムな要求を行うスレッドと、すべての要求を満たすようにエレベータを持つスレッドを作成するにはどうすればよいですか?エレベーターシミュレーションのためのPythonスレッディング

import time 
from random import * 
import math 

class Elevator: 
    def __init__(self, num_floors): 
     self.going_up = False 
     self.going_down = False 
     self.docked = True 
     self.curr_floor = 0 
     self.num_floors = num_floors 
     self.floors_to_visit = [] 
     self.people_waiting = [] 

    def print_curr_status(self): 
     for i in range(self.num_floors): 
      if i == self.curr_floor: 
       print('. []') 
      else: 
       print('.') 
     print ("to_visit: ", self.floors_to_visit) 

    def handle_call_request(self, person): 
     if not self.going_up and not self.going_down: 
      self.floors_to_visit = [person.curr_floor] + self.floors_to_visit 
      self.going_up = True 
      self.docked = False 
      self.people_waiting.append(person) 
     else: 
      self.floors_to_visit.append(person.curr_floor) 
      self.people_waiting.append(person) 

    def handle_input_request(self, floor_num): 
     self.floors_to_visit.append(floor_num) 

    def go_to_next(self): 
     if not self.floors_to_visit: 
      self.print_curr_status() 
      return 
     self.curr_floor = self.floors_to_visit.pop(0) 
     for i,person in enumerate(self.people_waiting): 
      if person.curr_floor == self.curr_floor: 
       person.riding = True 
       person.press_floor_num() 
       self.people_waiting.pop(i) 
     return 


class Person: 
    def __init__(self, assigned_elevator, curr_floor): 
     self.curr_floor = curr_floor 
     self.desired_floor = math.floor(random() * 10) 
     self.assigned_elevator = assigned_elevator 
     self.riding = False 

    def print_floor(self): 
     print(self.desired_floor) 

    def call_elevator(self): 
     self.assigned_elevator.handle_call_request(self) 

    def press_floor_num(self): 
     self.assigned_elevator.handle_input_request(self.desired_floor) 


my_elevator = Elevator(20) 

while True: 
    for i in range(3): 
     some_person = Person(my_elevator, math.floor(random() * 10)) 
     some_person.call_elevator() 
    my_elevator.go_to_next() 
    my_elevator.print_curr_status() 
    time.sleep(1) 

答えて

-2

あなたは一度行く二つのスレッドを持っている必要があります。これは私がこれまで持っているものです。 1つはランダム要求、もう1つはこれらの要求を満たすためのものです。これは、単一のスレッドプログラムであるため、Pythonで行うのは難しいです。しかし、要求を待ってからファイルに要求を保存する定義済みの関数を持つことができます。次に、これらの要求に応答する別の定義済みのタスクを実行します。その後、要求が処理されると、それは他の定義された機能を実行し、別の要求を待つ。

+0

など、ニーズに合わせ、エレベーターが使用されているときに何をすべきかについて、いくつかのロジックを追加するためのコードをリファクタリングするおそらく必要があります彼らは完全に動作するようにPythonのスレッドを使用することができます。インタプリタによるプリエンプティブスレッディングを使用しているということは、ここでは問題になりません。 – spectras

+0

あなたのやり方によって異なります。 –

+0

確かに、物事は必然的にもっと困難にすることは可能です。 – spectras

0

必要なものはありません。 2つの新しい変数を導入することができます.1つはエレベータの開始時間を追跡し、もう1つはエレベータ乗車時間を追跡することです。その後、エレベーターが十分に長く動いたかどうかを確認するだけです。これを実行すると、関数time.time()が呼び出されます。それは1970年1月1日からの秒単位の時間を返します(それは重要ではない点にのみ興味があり、時間の経過とともに増加する関数が必要です)。ただし、この機能は1秒よりも正確な時間を与えることはできません。あなたのマシンでそれが不正確であると感じたら、datetimeを使うことができます。

class Elevator: 
    def __init__(self, num_floors): 
     self.start_time = 0 
     self.ride_duration = 1 
     ... 

    def call_elevator(self): 
     self.start_time = time.time() 
     self.assigned_elevator.handle_call_request(self) 

    def go_to_next(self): 
     if time.time() - self.start_time < self.ride_duration: 
      return # Do nothing. 
     else: 
      ... 

あなたは、すべてで行うことは難しいことではありません

関連する問題