2016-11-03 151 views
3

掙扎我在爲r的功能,我想在optimconstrOptim受到最大限度一些簡單的限制,但我努力讓我的頭周圍ciui適合我的約束。簡單的約束constrOptim

My功能是:

negexpKPI <- function(alpha,beta,spend){ 

    -sum(alpha*(1-exp(-spend/beta))) 

} 

alpha哪裏和beta是固定的載體,以及spend是向量花費c(sp1,sp2,...,sp6)我想以最大化的negexpKPI輸出而變化。我想約束spend三種不同的方式:

1)最小和最大爲每個sp1,sp2,...,sp6,即

0 < sp1 < 10000000 5000 < sp2 < 10000000 ...

2)合計金額:

sum(spend)=90000000

3)一種用於一些單個組分和:

sum(sp1,sp2)=5000000

請幫忙嗎?開放給任何其他可行的方法,但如果可能的話會更喜歡基礎R.

+0

所有載體是長度爲6的只想改變'spend'矢量的分量。所以我們有'alpha < - c(a1,a2,...,a6)','beta < - c(b1,b2,...,b6)'這是固定的,我想改變'c sp1,sp2,...,sp6)'來使功能最大化。 –

+0

對不起,我正在使用我沒有完全檢查過的示例數據;真正的優化是針對具有92個約束的40個「sp」值,如果我在這裏完整地複製將會使問題更難以解釋。我已經添加了一些額外的零以使其現在可行。 –

回答

4

根據?constrOptim

The feasible region is defined by ‘ui %*% theta - ci >= 0’. The 
starting value must be in the interior of the feasible region, but 
the minimum may be on the boundary. 

所以它只是一個以矩陣形式重寫你的約束問題。請注意,身份約束只是兩個不等式約束。

enter image description here

現在我們在R中可以定義:

## define by column 
ui = matrix(c(1,-1,0,0,1,-1,1,-1, 
       0,0,1,-1,1,-1,1,-1, 
       0,0,0,0,0,0,1,-1, 
       0,0,0,0,0,0,1,-1, 
       0,0,0,0,0,0,1,-1, 
       0,0,0,0,0,0,1,-1), ncol = 6) 

ci = c(0, -1000000, 5000, -1000000, 5000000, 90000000, -90000000) 

附註

我覺得有什麼錯在這裏。 sp1 + sp2 = 5000000,但sp1sp2都不能大於1000000。所以沒有可行的地區!請先解決你的問題。

對不起,我正在使用我沒有完全檢查的樣本數據;真正的優化是針對具有92個約束的值,如果我在這裏完全複製,會使問題更加難以解釋。我已經添加了一些額外的零以使其現在可行。

+1

我正在考慮標記爲http://stackoverflow.com/questions/5436630/constrained-optimization-in-r/5438419#5438419的重複,但我發現該函數的文檔很混亂,以至於我認爲還有一個很好的例子這是一個「好主意」。 Upvoted答案,但不是問題。 –

+1

我認爲你的答案是對我的補充。你的電話,但我建議,如果我是你,至少在一兩天內就把它放在「不受騙」的地方。可能會得到更多的關注,這將是一件「好事」。我喜歡閱讀你的答案。你教過我一兩件事。 –

+1

對於@ 42的回答沒有不敬的打算,我認爲這很清楚地闡明瞭在最常見的約束類型中處理'ui'和'ci'的過程。通過一切手段將問題標記爲僞裝,但答案非常明確,我懷疑其他地方有用。謝謝。 –