tft每日頭條

 > 生活

 > r語言預測範圍

r語言預測範圍

生活 更新时间:2024-08-15 17:17:48

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

r語言預測範圍(R語言規劃求解)1

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

r語言預測範圍(R語言規劃求解)2

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

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

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

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

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

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

先導步驟: #導入物料清單和庫存數據 BOMbycol <- read.csv("BOM0.csv") library("reshape2") BOMtable <- acast(BOMbycol, Component~Article, sum) BOM <- BOMtable[,1:10] Stock <- as.vector(read.table("Stock.txt")) Stockqty <- Stock[,1]

r語言預測範圍(R語言規劃求解)3

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

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

r語言預測範圍(R語言規劃求解)4

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

r語言預測範圍(R語言規劃求解)5

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

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

#function設計 library("MASS") Consume <- function(x) { Prod <- ginv(BOM) %*% x; Result <- sum((Prod[which(Prod < 0)])^3) sum(Prod); return(Result) } #計算最合适的原材料消耗量 Clist <- optim(StockQty, Consume, lower = rep(0,nrow(BOM)), upper = Stockqty, control = list(fnscale = -1)) #計算成品數量 ProduceQty <- ginv(BOM) %*% Clist$par

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

r語言預測範圍(R語言規劃求解)6

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

Result <- sum((Prod[which(Prod < 0)])^3) sum(Prod)

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

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

路漫漫其修遠兮~~~~

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved