簡體   English   中英

使用線性規划進行可靠性優化

[英]Reliability Optimization with Linear Programming

我有許多組件使用兩參數 Weibull model 來估計它們在給定年齡的可靠性。

model_params <- matrix(c(2, 15, 3.1, 20, 2.9, 25, 1.8, 55), nrow=4, byrow=TRUE)
colnames(model_params) <- c("shape", "scale")

     shape scale
[1,]   2.0    15
[2,]   3.1    20
[3,]   2.9    25
[4,]   1.8    55

這些 model 參數可用於計算任何給定年齡的可靠性:

calc_reliability <- function(shape, scale, age)
{
  reli <- exp(-(age/scale)^shape)
  return(reli)
}

# calculate reliability for each component for ages 1 to 30
years <- 30
equip_reli <- matrix(rep(NA, times=nrow(model_params)*years), nrow=nrow(model_params))

for(i in 1:nrow(model_params))
{
   for(j in 1:years)
   {
     equip_reli[i,j] <- calc_reliability(model_params[i,1], model_params[i,2], j)
   }
}

我還有每個組件每年的估計維修費用

replace_value <- c(1000, 2000, 2400, 3300)
repair_cost <- matrix(rep(NA, times=nrow(model_params)*years), nrow=nrow(model_params))
for(i in 1:nrow(model_params))
{
  for(j in 1:years)
  {
    repair_cost[i,j] <- replace_value[i]*1.05^j
  }
}

我想建立一個線性編程解決方案來選擇要修復的組件。 該解決方案應最大限度地降低成本,同時 1) 將平均可靠性保持在某個閾值以上,並確保沒有組件低於某個可靠性閾值。 修復后,可靠性變為0.95 ,但之后繼續下降,其中計算的可靠性中的年齡由有效年齡組成。

calc_effective_age <- function(reli, shape, scale)
{
  effective_age <- scale*(-log(((reli * 100)/100),(100/(exp(-1)*100))))^(1/shape)
  return(effective_age)
}

例如,如果未修復,組件 1 在第 15 年的“有效年齡”為 15:

calc_effective_age(equip_reli[1,15], as.numeric(model_params[1,1]), as.numeric(model_params[1,2]))
[1] 15

但如果修復到0.95的可靠性水平,它的有效年齡約為 3.4 年:

calc_effective_age(.95, as.numeric(model_params[1,1]), as.numeric(model_params[1,2]))
[1] 3.397203

如果在第 15 年維修,則第 16 年的可靠性變為

calc_reliability(2,15,(3.4+1))
[1] 0.9175535

其中(3.4 + 1)是 16 歲時的新有效年齡。

假設[X]是每年的決策變量,如果X[i,j]=1表示第ith組件在jth年被修復:

X <- matrix(rep(0, times=nrow(model_params)*years), nrow=nrow(model_params))

最小平均可靠性閾值為0.75 ,最小單個組件閾值為0.50 ,問題就變成了

minimize: sum([repair_costs]*[X]) # minimize total cost over 30 years
subject to:
[X] = binary
mean(X[,j]) >= 0.75 # average reliability at each year constraint
X[i,j]*[equip_reli] >= 0.50 # individual reliability at each year constraint

如果 X 是尺寸為 4x30 的 0/1 矩陣,並且 C 是相同尺寸的成本矩陣,並且 x 和 c 是通過逐列解開這些矩陣形成的對應向量,那么我們假設問題如下。 我們忽略了問題中 >0.5 的約束,因為它們意味着所有 x[i] = 1 使問題變得微不足道。

minimize c'x over x 
s.t. x[i] is binary, i.e. in the set {0, 1}, for all i in 1:120
     (x[1]+...+x[4])/4 >= 0.75
     (x[5]+...+x[8])/4 >= 0.75
     ...
     (x[117]+...+x[120])/4 >= 0.75

lp的客觀參數是c(repair_cost) ,它是將修復成本矩陣逐列串成一個向量列,給出一個 120 個元素的向量。 約束矩陣由 30 行組成,第一行有四個 1,rest 為零,下一行有四個零,四個 1,rest 為零,依此類推,直到最后一行除最后 4 外全為零元素。 然后將其除以 4。我們可以使用克羅內克積形成這個矩陣。

library(lpSolve)

const.mat <- diag(30) %x% matrix(1, 1, 4)/4   # 30 x 120
lp("min", c(repair_cost), const.mat, ">=", 0.75, all.bin = TRUE)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM