私は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)
など、ニーズに合わせ、エレベーターが使用されているときに何をすべきかについて、いくつかのロジックを追加するためのコードをリファクタリングするおそらく必要があります彼らは完全に動作するようにPythonのスレッドを使用することができます。インタプリタによるプリエンプティブスレッディングを使用しているということは、ここでは問題になりません。 – spectras
あなたのやり方によって異なります。 –
確かに、物事は必然的にもっと困難にすることは可能です。 – spectras