R語言——規劃求解

雖然之前也算是用了很多回了,但都是揉在別的算法裡頭,還是單獨再開一篇

R語言——規劃求解

R軟件中,看起來最接近Excel裡的規劃求解功能的那就是optim函數,整個使用方式大概是這樣:

R語言——規劃求解

1) 設一個長度固定的初始變量par

2) 變量par作為x輸入特定的function(fn)運行,通過不斷調整得到最大或最小輸出結果

3) gr是遞歸過程中的梯度,理解起來比較困難的話可以直接用默認值

4) lower和upper是par向量變化的上下限,但是這個設置僅對特定method有用

5) 默認方向是計算function輸出的最小值,如果需要改成最大值的話,要在control參數里加上control = list(fnscale = 負數)

還是用昨天的例子,咱試圖用現有的原材料庫存數量和物料的組成清單,反過來推測能成套生產的最大成品數量,按昨天已經整出來的邏輯,成品數應為BOM的廣義逆向量乘以原材料消耗數量,今兒改了改計算方式再試一下

先導步驟:
#導入物料清單和庫存數據
BOMbycol library("reshape2")
BOMtable BOM Stock Stockqty
R語言——規劃求解

設計需要迭代的function,這裡假設咱計算的輸入值是884種原材料每樣最終會消耗掉多少個,那麼,變量就是個長度為884,取值範圍在0到現有庫存數量Stockqty之間的值,其初始值我設成了Stockqty

而function的輸出值應能反映出成品的臺數,目標是計算最大值,這裡先示範個簡單但有錯誤的做法:

R語言——規劃求解

function的計算方向是成品臺數的總量sum,看起來貌似很美好,但是還是會有個蛋疼的問題——不能避免負值,跟這個大問題一比,結果裡頭帶個小數點都不算個事兒了

R語言——規劃求解

但如果在function中加個if。。。else。。。函數,強行把有負數的情況排除呢?就本人嘗試的結果而言,這也是行不通滴,因為輸出結果不連續的情況下,咱嬌滴滴的optim小娘子會直接一哭二鬧三上吊的

難道這個問題真的就沒啥解決辦法了嘛??我在捶了一陣腦殼之後,總算磨出來個勉強能看的法子,先放個完整點的步驟:

#function設計
library("MASS")

Consume Prod Result return(Result) }
#計算最合適的原材料消耗量
Clist lower = rep(0,nrow(BOM)), upper = Stockqty,
control = list(fnscale = -1))
#計算成品數量
ProduceQty

算出來的情況如下,雖然沒有百分百的避免負數,但已經算是比較接近理想了

R語言——規劃求解

而其中起作用的,是function裡的目標定義:

Result 

把所有小於0的結果通過3次方放大(此過程不會更改數值符號),再加到總數量上,這樣的話,就會把整個optim優化的結果往正數的方向上推動

雖然說這總算是湊出來了一個能看的結果,但是卻並不是個好做法,為啥咧?因為咱把ginv廣義逆計算這麼個吃內存大戶放進了迭代步驟裡,導致明明只抽取了10列成品做個試算,optim卻還要原地轉圈圈的等上幾分鐘,要是數據集再大點或電腦配置再古早點的話,估計是要hold不住的

路漫漫其修遠兮~~~~


分享到:


相關文章: