Excel如何設置動態求和 Excel設置動態求和方法
1024
2025-03-31
哲學家就餐問題:
哲學家就餐問題是典型的同步問題,該問題描述的是五個哲學家共用一張圓桌,分別坐在五張椅子上,在圓桌上有五個盤子和五個叉子(如下圖),他們的生活方式是交替的進行思考和進餐,思考時不能用餐,用餐時不能思考。平時,一個哲學家進行思考,饑餓時便試圖用餐,只有在他同時拿到他的盤子左右兩邊的兩個叉子時才能進餐。進餐完畢后,他會放下叉子繼續思考。請寫出代碼來解決如上的哲學家就餐問題,要求代碼返回“當每個哲學家分別需要進食 n 次”時這五位哲學家具體的行為記錄。
測試用例:
輸入:n = 1 (1<=n<=60,n 表示每個哲學家需要進餐的次數。)
預期輸出:
[[4,2,1],[4,1,1],[0,1,1],[2,2,1],[2,1,1],[2,0,3],[2,1,2],[2,2,2],[4,0,3],[4,1,2],[0,2,1],[4,2,2],[3,2,1],[3,1,1],[0,0,3],[0,1,2],[0,2,2],[1,2,1],[1,1,1],[3,0,3],[3,1,2],[3,2,2],[1,0,3],[1,1,2],[1,2,2]]
思路:
輸出列表中的每一個子列表描述了某個哲學家的具體行為,它的格式如下:
output[i] = [a, b, c] (3 個整數)
a 哲學家編號。
b 指定叉子:{1 : 左邊, 2 : 右邊}.
c 指定行為:{1 : 拿起, 2 : 放下, 3 : 吃面}。
如 [4,2,1] 表示 4 號哲學家拿起了右邊的叉子。所有自列表組合起來,就完整描述了“當每個哲學家分別需要進食 n 次”時這五位哲學家具體的行為記錄。
代碼實現
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899import queueimport threadingimport timeimport random??class CountDownLatch:??def __init__(self, count):????self.count = count????self.condition = threading.Condition()??def wait(self):????try:??????self.condition.acquire()??????while self.count > 0:????????self.condition.wait()????finally:??????self.condition.release()??def count_down(self):????try:??????self.condition.acquire()??????self.count -= 1??????self.condition.notifyAll()????finally:??????self.condition.release()??class DiningPhilosophers(threading.Thread):??def __init__(self, philosopher_number, left_fork, right_fork, operate_queue, count_latch):????super().__init__()????self.philosopher_number = philosopher_number????self.left_fork = left_fork????self.right_fork = right_fork????self.operate_queue = operate_queue????self.count_latch = count_latch????def eat(self):????time.sleep(0.01)????self.operate_queue.put([self.philosopher_number, 0, 3])????def think(self):????time.sleep(random.random())????def pick_left_fork(self):????self.operate_queue.put([self.philosopher_number, 1, 1])????def pick_right_fork(self):????self.operate_queue.put([self.philosopher_number, 2, 1])????def put_left_fork(self):????self.left_fork.release()????self.operate_queue.put([self.philosopher_number, 1, 2])????def put_right_fork(self):????self.right_fork.release()????self.operate_queue.put([self.philosopher_number, 2, 2])????def run(self):????while True:??????left = self.left_fork.acquire(blocking=False)??????right = self.right_fork.acquire(blocking=False)??????if left and right:????????self.pick_left_fork()????????self.pick_right_fork()????????self.eat()????????self.put_left_fork()????????self.put_right_fork()????????break??????elif left and not right:????????self.left_fork.release()??????elif right and not left:????????self.right_fork.release()??????else:????????time.sleep(0.01)????print(str(self.philosopher_number) + ' count_down')????self.count_latch.count_down()??if __name__ == '__main__':??operate_queue = queue.Queue()??fork1 = threading.Lock()??fork2 = threading.Lock()??fork3 = threading.Lock()??fork4 = threading.Lock()??fork5 = threading.Lock()??n = 1??latch = CountDownLatch(5 * n)??for _ in range(n):????philosopher0 = DiningPhilosophers(0, fork5, fork1, operate_queue, latch)????philosopher0.start()????philosopher1 = DiningPhilosophers(1, fork1, fork2, operate_queue, latch)????philosopher1.start()????philosopher2 = DiningPhilosophers(2, fork2, fork3, operate_queue, latch)????philosopher2.start()????philosopher3 = DiningPhilosophers(3, fork3, fork4, operate_queue, latch)????philosopher3.start()????philosopher4 = DiningPhilosophers(4, fork4, fork5, operate_queue, latch)????philosopher4.start()??latch.wait()??queue_list = []??for i in range(5 * 5 * n):????queue_list.append(operate_queue.get())??print(queue_list)
Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。