3

Python でのエレベーター シミュレーターのサポートが必要ですが、あまり経験がありません。ユーザーが入力した、ランダム化された出発フロアと目的フロアを持つ顧客数が存在する必要があります。今は、エレベーターが一番上まで行ってから一番下に戻るという単純な戦略をコーディングしているだけです。コードを実行すると、プログラムが無限ループします。理由がわかりません。また、建物の出力メソッドをコーディングする方法がわかりません。これは、どの顧客がどの階にいて、エレベーターが何階を訪れたかを表示したいためです。ご協力いただきありがとうございます。

import random

class Elevator(object):
    def __init__(self, num_of_floors, register_list, direction = "up", cur_floor=1):
        self.total_floors = num_of_floors
        self.reg_list = register_list
        self.floor = cur_floor
        self.direct = direction
    def move(self):
        """Moves the elevator one floor"""
        if self.total_floors == self.floor:
            self.direct = "down"
        if self.direct == "up":
            self.floor += 1
        else:
            self.floor -= 1
    def register_customer(self, customer):
        self.reg_list.append(customer)
    def cancel_customer(self, customer):
        self.reg_list.remove(customer)

class Building(object):
    def __init__(self, num_of_floors, customer_list, elevator):
        self.total_floors = num_of_floors
        self.customers = customer_list
    def run(self):
        while elevator.floor != 0:
            for customer in self.customers:
                if elevator.floor == customer.on_floor:
                    elevator.reg_list.append(customer)
                    customer.indicator = 1
                elif elevator.floor == customer.going_floor:
                    elevator.reg_list.remove(customer)
                    customer.indicator = 0
                    customer.fin = 1
            elevator.move()
                
    def output(self):
        pass

class Customer(object):
    def __init__(self, ID, num_of_floors, cur_floor=0, dst_floor=0, in_elevator=0, finished=0):
        self.ident = ID
        self.indicator = in_elevator
        self.fin = finished
        cur_floor = random.randint(1, num_of_floors)
        self.on_floor = cur_floor
        dst_floor = random.randint(1, num_of_floors)
        while dst_floor == cur_floor:
            dst_floor = random.randint(1, num_of_floors)
        self.going_floor = dst_floor
    

customer_count = int(input("How many customers are in the building?: "))
floor_count = int(input("How many floors does the building have?: "))
cus_list = []
for i in range(1, customer_count+1):
    cus_list.append(Customer(i, floor_count))
elevator = Elevator(floor_count, cus_list)
building = Building(floor_count, cus_list, elevator)
4

1 に答える 1

3

あなたの問題はここにあります:

def run(self):
    while elevator.floor != 0:
        print(elevator.floor)
        for customer in self.customers:
            print(customer)
            if elevator.floor == customer.on_floor:
                elevator.reg_list.append(customer)
                customer.indicator = 1
            elif elevator.floor == customer.going_floor:
                elevator.reg_list.remove(customer)
                customer.indicator = 0
                customer.fin = 1
        elevator.move()

lift.reg_list.append(customer) を実行すると、顧客がリストに再度追加され、サイズが大きくなります (self.customers もこの同じリストへの参照です)。そのため、「for customer in self.customers」がループします。永遠に。

"cus_list" に従ってみましょう:

elevator = Elevator(floor_count, cus_list)
building = Building(floor_count, cus_list, elevator)

class Building(object):
    def __init__(self, num_of_floors, customer_list, elevator):
        self.total_floors = num_of_floors
        self.customers = customer_list

class Elevator(object):
    def __init__(self, num_of_floors, register_list, direction = "up", cur_floor=1):
        self.total_floors = num_of_floors
        self.reg_list = register_list # <-------- THIS IS "cus_list" reference

最後にクラス Building で:

 elevator.reg_list.append(customer)

エレベーターは、ここではクラス FYI の範囲外で作成されたグローバル変数です。

修正は次のようになります

エレベーターは空っぽですよね?

class Elevator(object):
    def __init__(self, num_of_floors, register_list, direction = "up", cur_floor=1):
        self.total_floors = num_of_floors
        self.reg_list = []
于 2013-08-27T16:17:27.747 に答える