追蹤者

2019年6月30日 星期日

用 Python 做商管程式設計(一) Week 5e

05-e01 旅行者問題
Logistics and transportation 物流與運輸
Travelling salesperson problem(TSP)
定義 : 從某點出發,經過每個點恰好一次,且回到原點,找最短距離。


greedy 走法 :
在一開始先往距離最近點出發,
在每一個點都往尚未走過且最近的點移動,
重複直到走回原點。

05-e02 TSP實作
---code
# set up the distance matrix
numLoc  = 5
dst = [[0, 9, 6, 7, 4],
              [9, 0, 5, 9, 6],
     [6, 5, 0, 3, 1],
     [7, 9, 3, 0, 4],
     [4, 6, 1, 4, 0]]

origin = 0
# tour : a list that will contain the solution
# tourLen : the total distance of the solution
# unvisited : a list that contains those unvisited locations at any time
tour = [origin]
tourLen = 0
unvisited = []

for i in range(numLoc):
unvisited.append(i)

unvisited.remove(origin)

# print(tour,tourLen,unvisited)

cur = origin
for i in range(numLoc-1):
# find the next location to visit
next = -1
minDst = 999
for j in unvisited:
if dst[cur][j] < minDst:
next = j
minDst = dst[cur][j]
# update tour, unvisited, tourLen, cur
tour.append(next)
cur = next
unvisited.remove(next)
tourLen += minDst
print(tour,tourLen)
#back to origin
tour.append(origin)
tourLen += dst[cur][origin]
#print
print(tour,tourLen)

---
05-e03 用檔案輸入資料
同上TSP,使用者自己輸入距離
code 部分 numLoc , dst 做修正
---code
numLoc = int(input())
dst = []
for i in range(numLoc):
dst.append(input().split()) #空格切開,以list形式append
for j in range(numLoc):
dst[i][j] = int(dst[i][j])
---
用檔案輸入
同目錄下新增一個檔案 : TSP_in.txt
輸入測試檔案,例如:
3
0 3 8
3 0 5
8 5 0

打開cmd ,移動到該目錄,python xxx.py < TSP_in.txt
" < " 這個符號,即可讓檔案讀入右方檔案資料



用 Python 做商管程式設計(一) Week 5d

05d-01 存貨政策與自動訂補貨
(Q,R) policy
定義 : 若現貨量 I < Q 則 補貨R件
(s,S) policy
定義 : 若現貨量 I < s  則 補貨至 S 件

Optimizing the (Q,R) policy
    決定 Q 和 R
考量下列 costs
- Inventory cost :  買東西堆在庫房而浪費掉的投資機會
- Ordering cost : 處理貨物的成本
- Shortage cost : 因為沒有賣出去而損失的銷售

例題:
Q = 30 ,一單位貨品買入價1000元,年利率 7.3%,
一次訂貨成本 200,一個顧客來卻缺貨虧 2元,
過去20天需求量如下,20天前的存貨量 為 20件。
求 R 使得總成本最小?
---  code (此程式並沒有加入訂貨成本)
# past sales 
salesStr = "14,23,26,17,17,12,24,19,10,18,22,31,19,16,22,28,20,27,20,32"
sales = salesStr.split(',')
for i in range(len(sales)):
sales[i] = int(sales[i])

#given information 
stgCost = 2
invCost = 1000*0.073/365
Q = 30
I = 20

#finding the best R
bestR = 0
costOfBestR = 1000000000
for R in range(Q):
totalStgCost = 0
totalInvCost = 0

#finding the total cost of this R 
for s in sales:
I -=s
if I < 0 :
totalStgCost += -I * stgCost
I += Q
elif I < R:
I += Q
totalInvCost += I * invCost

#update bestR when necessary
totalCost = totalStgCost + totalInvCost
if totalCost < costOfBestR:
bestR = R
costOfBestR = totalCost
print(R, totalStgCost, totalInvCost, totalCost)
print(bestR)
---

2019年6月28日 星期五

找工作建議

1.想想我是誰? 瞭解自己:

人天天都跟自己相處在一起,但可能這一輩子最不了解的就是自己。

把每天自己完成的事是值得鼓勵/開心的事寫下來,另一邊寫今天不開心/做不好的事,

從中去分析自己的優點/缺點/喜歡的/討厭的。


例如:

O:我今天跟朋友一起聚餐,跟很熟悉的朋友在一起的那種無拘束感真好~ (分析: 我喜歡無拘束感) 。

X:預定今天要寫的心得還是沒寫。 (分析: 做事情總是拖延)


2.我想要甚麼? 我的人生價值觀/工作價值觀/我的座右銘 :

從你有記憶開始回想,你喜歡看的卡通是甚麼卡通? 甚麼電影吸引我? 甚麼樣的書我覺得好看?  小時候在做甚麼事的時候最開心?
對甚麼有興趣? 也回想一下小時候,作文"我的志願"/"我的夢想",長大了變成喜歡甚麼,為何有此轉折/改變。


例如: 我喜歡看超人卡通,我喜歡看警匪片,心理學的書很吸引我,小時候學畫畫/作陶藝/玩樂高時最開心,
對學甚麼東西都很有興趣,我的志願好像是甚麼總統/警察/老師/太空人之類的。



超人卡通/警匪片: 公平/正義

心理學: 喜歡觀察人/探究人心/想幫助別人

小時候學畫畫/作陶藝/玩樂高: 喜歡有自主意見的操縱感/完成一樣作品的滿足感。

對學甚麼東西都很有興趣:有好奇心/喜歡新鮮感/喜歡不同的挑戰

老師:教育為重。總統/警察:服務人民,對社會有貢獻。太空人:一個很稀奇的職業,喜歡探索未知。


結論:我想要,一個可以幫助人/對社會有貢獻/能夠發揮自己所能/有新鮮感多變化的工作。



我的人生價值觀:做一個有用的人且對社會有貢獻

我的工作價值觀:工作時間有自由度/有自主性/用自己的能力創造價值

我的座右銘:人有無限的可能



(以上的概念都可能重複,而重覆性越高,代表你的志向越明確)



3.尋找搭配自己熱誠興趣的工作:

從上述,我找到了一個工作頗適合,觀護人。


觀護人算是一個講求公平正義的職業。對於被觀護人有好奇心,想觀察他/幫助他解決困難融入社會,如果幫到忙會很有成就感,
也算是對社會有貢獻。 不同的人帶來不同的新鮮感,不一樣性格的人有著不一樣的挑戰。


4.瞭解如何從事這樣職業,這項職業需要具備甚麼能力?

EX.如何考觀護人/需要具備哪些能力?

觀護人為司法四等特考,需要考許多的科目,涵蓋的範圍有法律/心理/社工,是個相對其他公職考試不容易考的職務,
且每年徵求的人數不多。要具備 同理心/觀察力/整合力/口說能力等.... 要讀的書是哪些等....


5.確認目標:我真的要做這個嗎? 我能勝任嗎? 做這項工作的優點缺點? 挑戰和困難? 現實與理想?

(略)

如果沒確認此目標,就在重新找一個。


6.再重新尋找/不斷尋找/持續思考



     人生本來就是這樣在一個不確定的情況下尋找人生的答案。答案,要自己尋找。

偉人也不是一出生就知道自己要做甚麼,有成就的人也是一步一步的了解自己到完成目標。

     有空就思考,我想學的東西/我有興趣的東西/我的理想/我的夢想/我覺得此生一定要做的事等,各自列出一個表,
你可以從中去定自己的目標。找到目標之後就設個大目標>中目標>小目標。

大目標是一個狀態,例如,考上研究所。

中目標是一個方向,例如,考研究所要讀書,要讀甚麼甚麼書....等。

小目標就是可執行/有可行性的方法,例如, 一天讀九小時,分成早中晚,各時段3HR,哪一個小時讀啥科目等





阿魏之獨門方法: 刪去法



如果想不到甚麼事情自己最喜歡,那就倒過來,寫出自己不喜歡的。

例如: 我不喜歡跟別人推銷東西>>>不適合做業務/直銷

        我不喜歡天天重複做同樣的事情>>> 適合有挑戰/有新鮮感/多變化的工作



以上是綜合我看過的書和個人經驗和大家分享,在尋找自己時我發現最有用的就是書和自己。

我覺得夢想就像是在一張白色圖畫紙上繪圖,在紙上構想你的夢想是如何如何,

如果不去執行/努力,終究就只是一張圖畫紙!

套一位歌手說的,謝和弦:"夢想只是一個名詞,你要想辦法把他變成動詞。"


方法歸方法,如果不去思考和執行,建議永遠都只是紙上談兵。

真的還是自己要有決心去思考和尋找,共勉之~~~~~

2019年6月27日 星期四

用 Python 做商管程式設計(一) Week 5b

05-b01 作業管理與演算法
Operation Management (OM)
利用程式解OM問題-演算法

演算法 Algorithm
    A detailed description of actions such that action is doable.

Scheduling 
Makespan 最小化

  • m 台機器
  • n  個 jobs
  • job j 的 processing time
    •  一台機器完成 job j 共需要 pj 時間
    • Complete time C = Sj(開始時間) + pj
要分配這些jobs  給所有 機器 使得 最後的 completing time  最小

Longest processing time first (LPT)
  • jobs 的 processing time 降冪排列
  • 分配job 給目前最早完成時間之機器
--- code ---
# read and prepare n,m,p
n = int(input("Number of jobs: "))
m = int(input("Number of machines: "))
pStr = input("Processing times: ")

p  =  pStr.split(' ')
for i in range(n):
p[i] = int(p[i])

#sort and reverse
#p.sort()
#p.reverse()

# machine complete times 
loads  =  [0] * m
assignment = [0]  * n
#in iterarion j , assign job j to the least loaded machine 
for j in range(n):
#find the least loaded machine
leastLoadedMachine = 0
leastLoad = loads[0]
for i in range(1,m):
if loads[i] < leastLoad:
leastLoadedMachine = i
leastLoad = loads[i]
#schedule a job
loads[leastLoadedMachine] +=p[j]
assignment[j] = leastLoadedMachine + 1
#check the process
print(str(p[j]) + ": " + str(loads))
#the result 
print("Job assignment: "+str(assignment))
print("Machine loads: "+str(loads))

-------------
heuristic 不能保證得到最佳解

11




用 Python 做商管程式設計(一) Week 5a

05-a01 字串切割成清單
---
   gradeStr = input() #1 2 3 4 5
   grade = gradeStr.split() #用空白切開,若要用comma切開則: split(',')
   print(grade) # grade 是一個list
---
List 
是一個 ordered container
字串內元素(item)可用index 操作
如上例:print(grade[0]) #1 , print(grade[2]*2) #33

len() 可得 listlist長度
print(len(grade)) #5

List 宣告
aList = [0] * 3 # [0,0,0]

append() 可新增Items 到 List
ex:
    gradeStr = input() #1 2 3 4 5
    grade = gradeStr.split()
    grade.append(-1)
    print(grade) # ['1','2','3','4','5',-1]
    grade.append([9,7,5])
    print(grade) # ['1','2','3','4','5',-1,[9,7,5]] , list裡面可以加list
    print(grade[6][1]) #7 , grade[6]為list ,可存取該list的元素

List 內  string  string  轉 int
ex:
    gradeStr = input()
    gradeList = gradeStr.split()
    print(gradeList)
    grades = []

    for g in gradeList: 
    grades.append(int(g))

    print(grades) #[1,2,3,4,5]
    #for 迴圈那邊可以替換成
    #for i in range(len(gradeList)):
    #    grades[i] = int(graedList[i])

range 複習
>>>range(10) # 从 0 开始到 10 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(1, 11) # 从 1 开始到 11 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

05-a03 List 相關函數

lst = [3,1,4,1,5,9]
lst.append(2)
print(lst)# [3, 1, 4, 1, 5, 9, 2], 新增2

lst.sort()

print(lst)# [1, 1, 2, 3, 4, 5, 9],list內數值排序

lst.reverse()

print(lst) # [9, 5, 4, 3, 2, 1, 1],list 內 item 翻轉

print(lst.index(4)) # 2 


lst.insert(4,"Hi")

print(lst)#[9, 5, 4, 3, 'Hi', 2, 1, 1] ,在第4個index位插入""

print(lst.count(1))# 2 , 數字1出現幾次


lst.remove(1)

print(lst)# [9, 5, 4, 3, 'Hi', 2, 1] ,移除掉第一個出現的 1

print(lst.pop(3))# 3 ,把 3 拿出來



print(lst)# [9, 5, 4, 'Hi', 2, 1]

List Copying
ex:
aList = [1,2,3]
bList = aList
bList[0] = 5
print(bList) #[5,2,3]

Why?
Python 中 list variable 是一個 reference
Copying a list is just copying the reference ,not those values

順序:
1.aList 參照 [1,2,3]
2.aList 的內容 copy 到 bList,有兩個list分別寫著[1,2,3]這塊地的地址
3.aList 和 bList並非兩個lists, 而是一個list的兩個名字
4.若要做到兩個lists 使用 append 把item 依序 複製進去