Okay,那我們剛剛的這整個 implementation 呢還有一個缺點,
這個缺點就是在這個 input process 上面,我們剛剛基本上是跳過這個 input
process 直接把題目的資訊,也就是地圖資訊還有點的個數 直接寫在程式碼裡面。
那測試的時候那麼做當然也就罷了,但實際上
這個程式如果要真的能給使用者用的話,必須要讓他,讓使用者可以輸入資訊。
對吧?所以呢我們來稍微改一下這段程式碼。
我們先看看要怎麼讓使用者輸入資訊。
左邊是我們原本的寫法,基本上就是寫死在你的程式碼裡面。
那等到你覺得演算法好像是對的了以後,我們來試著把它改成右邊這個樣子。
首先呢,請使用者輸入一個數字,一個整數,就是 number of location。
然後,接著呢我們要來準備讓使用者輸入 dst 這樣的一個二維清單。
好,所以我先給一個空清單。
接下來呢,我要跑 numLoc 這麼多次,每一次我要讓使用者輸入一串
數字,也就是五個數字,然後中間用四個空白鍵隔開,這是我跟它的約定。
好,所以呢它就會打了五個數字,中間用四個空白鍵隔開。
它一打完,我們就馬上把這段數字切開,切完了以後的東西是一個 list,對吧?而且
list 裡裝的是字串,我呢就把它 append 到 dst 裡面。
所以我 append 的是一個 list,就是我的 dst 的第一個 element 是一個 list。
好,有了 list 以後呢,先不要往下做,趕快把這個 list 從字串轉成整數。
所以我們去把這裡面的每一個我們剛剛丟進去的東西 dst[i][j],
趕快去把 dst[i][j] 裡面的那個字串拿出來,轉成整數。
然後再覆寫回去,那這樣子的迴圈一圈跑完的話, 我們就會成功地得到一條 list,就是第
i 個點 移動到其他幾個點所需要的距離,這件事情跑五圈,我們就會得到
五個 list,那麼對於我們左邊的這個情況就可以搞定啦。
但如果你剛剛說有八圈、 十圈、 二十圈,那這個不一定嘛,那我們呢就
就照樣地把它做出來,它說八圈,底下就跑八圈,它說十圈,你让它就跑十圈, 那使用者就一一輸入就可以了。
好,那我們呢 也很快地來試一下、 這個測試一下這個東西的做法。
[聲音] 好,這個地方呢,我們把剛剛寫死的地方註解掉,然後在
底下我們把剛剛這個讓使用者輸入的這一段程式碼加進去,然後我們來試試看。
那現在要輸入了,我就輸入 5 吧。
那接下來呢要輸入 25 個數字,比如說是 0、 1、 2、 3、 4 這樣,我隨便打的。
它的意思就是第 0 個點到第 0 個點距離是 0,到第 1 個點距離是 1,到第 2 個點距離是 2,依此類推。
好,那麼呢我們來試著把它打一打,那這個數字就隨便。
還挺困難的,好,那麼我在這裡呢是嘗試
把它打的就是很對稱,那如果不對稱,其實也沒有關係,我們的演算法還是照樣地會去 進行嘛。
好,打完了以後呢,噼里啪啦地結果就出來了。
那大家有興趣可以驗證一下結果的正確性,應該是沒有什麼問題。
但總之我們後面演算法並沒有改,我們改的是前面這個讓使用者 輸入的部分,那現在這樣子的話就好多了,對吧?就是
只要他願意,他打個 15×15 的,200×200 的 也做得到、 也做得到,總比寫死來得好。
好,那你就問啦,欸,老師啊, 這個每一次都要打一大堆的數字,會不會太麻煩?
如果今天程式真的要給使用者使用了, 那你總是要給他一個方法讓他輸入,這倒是沒有什麼問題。
但是呢,你自己在測試的時候,比如說你寫程式經常要測試輸入,
出錯,輸入出錯,輸入出錯,你不會想要在你 開發程式的過程中,一直打這一串數字,對吧?
像我剛剛就打了 26 個數字,而且我還要注意我有沒有打對打錯,那這件事情
如果我在開發的時候,我這個出錯,可能來來回回地要測試個十幾次、 上百次, 那豈不是浪費時間到極點。
所以呢,這裡來跟大家介紹一個好用的做法,就是你只要輸入一次,
之後你就再也不用輸入了,那你當然也有另一種比較这个偷懶的做法,就是你就複製貼上。
也就是說呢,當我們在執行程式碼的時候,在這裡
你在這裡事實上是可以複製貼上東西的,你可以,當你按右鍵的時候事實上它就是在做複- 製貼上。
那麼我們這裡呢,就教你一個比複製貼上還要好的做法。
方法如下: 首先呢,請你打開一個 plain text file,然後把你的
input 照著你在熒幕上會輸入的方式就把它輸入進去。
然後呢,給它一個檔名, 比如說叫做 in.txt 也好,叫做 TSP.in.txt 也好,都可以。
就是你幫它自己取一個檔名。
然後呢,請你打開你們家的 console,也就是 terminal,然後呢,去執行 你的 program。
但執行 program 的時候不要只打 Python,然後檔案名稱,
而是在後面再加上一個符號, 以
Windows 來說呢,就是這個串流的符號,是 <,它的意思就是
這個執行的資料來源, 請你用右手邊的這一個檔案來傳進去。
那這個時候的重點就來了,你如果把它取名為 TSP_in.txt,你就這麼打, 你如果取名為
in.txt,你就這麼打,你就打那個檔名, 當然你要確定這兩個檔案要放在一起才可以。
那這樣子呢,它就會自動把資料讀取進來。
那我們來看一下。
好,所以具體做法如下。
首先這裡,我呢有一個叫做 TSP.py
的檔案,然後呢,它底下有個 TSP_in.txt,
那我們稍微感受一下它長什麼樣子,就長這個樣子。
所以呢如果我要在 剛剛的黑白畫面下依格式輸入這樣子的資訊的話,
我就把這些資訊打起來,然後就存成一個檔名,讓我自己 知道。
好,然後我確定這兩個檔案放在同一個地方了以後, 我們呢,就去開我們的命令提示字元。
那我們首先要先切換到這個我們想切換的地方嘛,所以我們就切換。
好,於是呢,我們就移動到我們的這個資料夾底下。
那麼正常情況下呢,我們會使用 Python TSP.py,這樣子的方式來跟使用者做互動。
就比如說啦,他就說好,我三個點,我 0 1 1,1 0
1, 1 1 0,這樣子呢就完成了一次輸入,然後演算法就跑給他看嘛。
現在就是要說請你改用 < 的這個串流,然後把
TSP _in.txt,這樣子的資訊的內容
傳給它,那我們按下 enter 的時候,你就會發現,欸,結果馬上就出來了,
對吧,你不需要再手動輸入,然後等結果。
所以,以後呢你就一直這麼做就好了,你每一次這麼做它都會同樣地把資訊傳進去。
所以你可能在你還在開發的過程中,寫一寫,寫一寫,要測試,你就來執行一次。
寫一寫,寫一寫,要測試,你就來執行一次。
那這樣子的話,效率就高多了。
對於大家要寫比較複雜的程式的時候,會有很大的幫助。
好,最後的最後,講一點 remarks。
我們發現哪,我們這一個 lecture
講的東西 基本上都是在跟大家強調,就是說很多的決策
特別是數量的決策,它們可以被電腦,也可以被程式來這個 support。
那這件事情呢,就是只要我們有好的演算法, 或者是知道怎麼寫程式,就可以做。
那我們不需要 用手做這些事情,我們也不需要靠人的經驗,人的判斷什麼的。
我們有了演算法,有了程式設計的技術的話呢,我們就可以用這些東西來輔助我們的 數量決策。
那麼解決真實的問題,當然不只是寫程式這個 動作而已,寫程式這個動作必須要跟你的
domain knowledge 要配合。
比如說我們前面講了那麼多物流啊、 存貨啊、 排程啊之類的,
你如果沒有 domain knowledge 的話,就連要解什麼問題都不知道,對吧。
解的問題目標是什麼, 限制是什麼,也不知道。
所以需要有良好的產業方面的知識,或者是你的 對問題要夠了解,才能夠真的解決這個問題。
所以呢,大家如果年紀還小,
那你學的主要是解問題的方法,但大家如果年紀稍長,或者是做比較重要的工作的時候呢,
通常你的任務從解問題變成問問題了,或者說定義問題,那個又是另一個境界了。
好,雖然是呢在現在這個階段,我們如果還沒有 domain
knowledge,我們對於這個產業的問題還不是非常了解的話, 寫程式能幫助我們做這件事情嗎?可以的。
有能力寫程式 會允許我們去 implement 一個
solution,對吧? 讓我們或者是我們的夥伴,我們的夥伴工程師們
可以一起來寫一個程式,一起來開發一個系統,來解決這樣子的問題。
那麼這個情況下呢,如果擁有 domain knowledge 的人,domain knowledge 的人
跟工程師之間如果能有良好的溝通的話,當然就很棒。
但很多時候 domain knowledge 的人是完全不懂程式設計,完全不懂演算法,
而工程師呢是完全不懂 domain knowledge,如果是 這樣子的話,溝通起來當然就會非常地痛苦。
今天這件事情是雙向的,工程師最好能夠呆在一個產業裡面,略了解
這個產業知識,那產業的人最好也能夠
略了解程式設計,讓雙方的溝通可以流暢一點。
再來,如果你今天有開發的能力的話,我們事實上可以 try 很多的
solution, 對吧?你可以 try 這種 solution,try 那種 solution,看看哪一種比較好。
然後呢,再去選擇一個真的去應用到你們的場域裡面去。
那最後 大家現在如果還是學生的話,會寫程式對於你
在各個其他非程式領域的學習很多時候也有很大的幫助, 因為你現在就更可以
learning by doing 了,至少像我們剛剛介紹的這一些例子,
行銷啊,物流啊,沒有沒有行銷,不好意思,物流啊、 存貨啊、 這個排程啊等等的。
你呢 學了一個演算法,你可以試著 implement 它,learning by doing 嘛。
你呢,得到了一個問題,你沒有演算法,你可以試著想一個演算法,然後 implement
它, 你可以想好幾個,然後 implement 它,然後看看結果,然後改改演算法,然後再看看結果,
你的這個反复嘗試的動作呢,就可以幫助你把剛剛這一些 subject 都學得更好。
那在商管領域裡面,甚至包含到經濟領域裡面,有非常多的問題都是這個樣子。
生產啦、 行銷啦、 財務啦、 經濟啦等等,
都有讓你程式設計,可以協助你做 learning by doing 的地方。
那麼呢,這也算是我們這個課程的目的之一了,我們固然希望你可以 implement
solution, 或者是和某人一起,也希望你可以 try
solution,但是我們也 希望程式設計可以作為你在各個科目裡面的學習工具,
讓你可以把各個科目學得更好,也協助你在前往 產業的路上,去取得這些 domain knowledge。
如果可以這樣的話,那也就算是功德無量了。
好,那課程就暫時先到這邊,謝謝大家! [空白_錄音]
[空白_錄音]