/coffee_roasting_DFS_BFS

以State Graph及BFS,DFS演算法模擬咖啡烘焙排程

Primary LanguageJupyter NotebookApache License 2.0Apache-2.0

coffee_roasting_DFS_BFS

以State Graph及BFS,DFS演算法模擬咖啡烘焙排程

這是我在北醫大數據班的人工智慧與深度學習的期中報告。

State Graph:問題簡述

咖啡生豆需經過適當烘焙才能轉為適合沖煮的咖啡熟豆,若要在固定時間內烘焙多款單品咖啡,就必須考量時間限制,品項多樣性及可販售價錢,那麼若轉化成以BDS及FDS來分析,哪一種的效能較好呢?

  • State space: 多款待烘焙咖啡生豆。
  • Successor function: 在指定時限內將越多款咖啡生豆烘焙成咖啡熟豆,且合計總價值最高。
  • Start state: 從零開始
  • Goal test: 時限內生產多少鍋咖啡,該組合的價值是否最高
  • Solution: 以BFS (Bread-First Search)及DFS (Depth-First Search)兩種搜尋模式開發模擬程式,試著跑出結果並比較兩者優劣。

State Graph:模型資料設定

用Jupyter Notebook開發python程式,實作BFS及DFS兩種搜索模式來計算固定時間內可烘焙出多少款咖啡及其總價值最高為何?

咖啡生豆款項:8款

咖啡項目 烘焙時間(分鐘) 價值(元) 存量(可烘次數)
衣索匹亞 16 400 3
肯亞 18 450 1
瓜地馬拉 17 380 2
哥斯大黎加 18 390 2
巴拿馬 18 450 2
巴西 16 350 3
哥倫比亞 17 380 2
曼特寧 20 330 4

程式模擬:BFS,以廣度為優先

先找出8款咖啡品項的所有排列組合,作為輪替烘焙的順序。 烘焙順序就依排定項目輪替烘焙,譬如先從衣索匹亞開烘第一鍋,再來則是換烘肯亞,以此類推。所有品項都烘完一遍,若還有時間就再從衣索匹亞烘起,以此類推。 若該品項存量用完,則直接跳至下一品項繼續。 整體烘焙時間不能超過100分鐘。(考量電腦運算時間及算力,設定較短時限) 實驗結果:

  • 運算時間:725.1162450313568 seconds
  • 最多款品項:5種(總體時間過短,還沒輪替完所有品項)
  • 最多鍋數:5鍋
  • 最高總價值:2,070元
  • 總運算組數:40,319組

程式模擬:DFS,以深度為優先

先找出8款咖啡品項的所有排列組合,作為輪替烘焙的順序。 烘焙順序就依排定項目烘焙並將該品項的存量用完才更換下一品項,譬如先從衣索匹亞開烘第一鍋,再來還是繼續烘焙衣索匹亞,直到用完該款存量才換烘肯亞,以此類推。 若該品項存量用完,則直接跳至下一品項繼續。 整體烘焙時間不能超過100分鐘。(考量電腦運算時間及算力,設定較短時限) 實驗結果:

  • 運算時間:717.8070919513702 seconds
  • 最多款品項:3種(總體時間過短,還沒輪替完所有品項)
  • 最多鍋數:6鍋
  • 最高總價值:2,450元
  • 總運算組數:40,319組

結論

如同現實情況的烘焙操作,想要在固定時限內烘焙出較多鍋數,就要採取同品項批次烘焙法,如同DFS的深挖概念。所以在做烘焙計畫時就要將多鍋數的需求品項準備好開烘,以求較高效率。 DFS vs. BFS = 717.8 sec. vs. 725.1 sec. DFS vs. BFS = 6鍋 vs. 5鍋 DFS vs. BFS = 2,450元 vs.. 2,070元

若要展示多款品項,就要循BFS概念,在固定時限內依次烘焙不同品項,效率較差但備貨款項較豐富。 BFS vs. DFS = 5款 vs. 3款