2

我希望儘量減少以下等式:R:二次規劃/等滲迴歸

F=SUM{u 1:20}sum{w 1:10} Quw(ruw-yuw)^2 

有以下限制:

yuw >= yu,w+1 
yuw >= yu-1,w 
y20,0 = 100 
y0,10 = 0 
yu,10 = 0 

我有一個20×10 RUW和20 * 10 QUW矩陣,我現在需要生成一個遵循約束的yuw矩陣。我在R編碼,熟悉lpsolve,optimx和quadprog軟件包,但不知道如何將它們用於這個特定的問題。我知道我必須使用quadprog軟件包,因爲這是一個二次編程問題。我並不是在尋找完整的答案,我想要了解如何構建約束矩陣以及解決問題的最佳方法。

回答

4

鑑於此處優化問題與your previous question的相似之處,我將直接從我對該問題的回答中借用一些語言。然而它們有很大的不同(前面的問題是線性規劃問題,這是一個二次規劃問題,約束不同),所以它們不是重複的。

擴大優化目標我們得到Quw*ruw^2 - 2*Quw*ruw*yuw + Quw*yuw^2。我們看到這是決策變量yuw的二次函數,因此quadProg包的solve.QP方法可用於解決優化問題。

爲了抽象出一點,我們假設R=20C=10描述了輸入矩陣的維數。然後有R*C決策變量,我們可以將它們分配的順序爲y11, y21, ... yR1, y12, y22, ... yR2, ..., y1C, y2C, ..., yRC,讀取變量矩陣的列。

?solve.QP,我們看到目標的形式爲-d'b + 0.5b'Db決策變量b。對應於決策變量yuwd的元素具有值2*Quw*ruwD是對角矩陣,其中元素對應於取值2*Quw的決策變量yuw。請注意0​​函數要求D矩陣是正定的,所以我們需要Quw > 0對每個u, w對。

第一個R*(C-1)約束對應於yuw >= yu,w+1約束,並且下一個(R-1)*C約束對應於約束yuw >= yu-1,w。下一個約束條件對應於yuC = 0約束條件(作爲yuC >= 0-yuC >= 0輸入),最後一個約束條件爲-yR1 >= -100(邏輯上等於yR0 = 100)。

我們可以輸入該模型到quadProg包與下述R命令,使用隨機輸入數據:

# Sample data 
set.seed(144) 
Quw <- matrix(runif(200), nrow=20) 
ruw <- matrix(runif(200), nrow=20) 
R <- nrow(Quw) 
C <- ncol(Quw) 

# Build constraint matrix 
part1 <- matrix(0, nrow=R*(C-1), ncol=R*C) 
part1[cbind(1:(R*C-R), 1:(R*C-R))] <- 1 
part1[cbind(1:(R*C-R), (R+1):(R*C))] <- -1 
part2 <- matrix(0, nrow=(R-1)*C, ncol=R*C) 
pos2 <- as.vector(sapply(2:R, function(r) r+seq(0, R*(C-1), by=R))) 
part2[cbind(1:nrow(part2), pos2)] <- 1 
part2[cbind(1:nrow(part2), pos2-1)] <- -1 
part3 <- matrix(0, nrow=2*R, ncol=R*C) 
part3[cbind(1:R, (R*C-R+1):(R*C))] <- 1 
part3[cbind((R+1):(2*R), (R*C-R+1):(R*C))] <- -1 
part4 <- rep(0, R*C) 
part4[R] <- -1 
const.mat <- rbind(part1, part2, part3, part4) 

library(quadProg) 
mod <- solve.QP(Dmat = 2*diag(as.vector(Quw)), 
       dvec = 2*as.vector(ruw)*as.vector(Quw), 
       Amat = t(const.mat), 
       bvec = c(rep(0, nrow(const.mat)-1), -100)) 

我們現在可以訪問模型的解決方案:

# Objective (including the constant term): 
mod$value + sum(Quw*ruw^2) 
# [1] 9.14478 
matrix(mod$solution, nrow=R) 
#   [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9]  [,10] 
# [1,] 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.3215992 0.1818095 0.1818095 0.1818095 0.000000e+00 
# [2,] 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.2882339 0.2882339 0.000000e+00 
# [3,] 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.2882339 0.2882339 2.775558e-17 
# [4,] 0.5728478 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.2882339 0.2882339 0.000000e+00 
# [5,] 0.5728478 0.5111456 0.5111456 0.4699046 0.4346995 0.4346995 0.4346995 0.2882339 0.2882339 0.000000e+00 
# [6,] 0.5728478 0.5111456 0.5111456 0.4699046 0.4346995 0.4346995 0.4346995 0.2882339 0.2882339 0.000000e+00 
# [7,] 0.5728478 0.5111456 0.5111456 0.4699046 0.4346995 0.4346995 0.4346995 0.2882339 0.2882339 0.000000e+00 
# [8,] 0.5728478 0.5111456 0.5111456 0.5111456 0.4346995 0.4346995 0.4346995 0.2882339 0.2882339 0.000000e+00 
# [9,] 0.5728478 0.5111456 0.5111456 0.5111456 0.4346995 0.4346995 0.4346995 0.4346995 0.2882339 1.110223e-16 
# [10,] 0.5728478 0.5111456 0.5111456 0.5111456 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 
# [11,] 0.6298100 0.5111456 0.5111456 0.5111456 0.4518205 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 
# [12,] 0.6298100 0.5111456 0.5111456 0.5111456 0.4518205 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 
# [13,] 0.6298100 0.5111456 0.5111456 0.5111456 0.4518205 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 
# [14,] 0.6298100 0.5111456 0.5111456 0.5111456 0.4518205 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 
# [15,] 0.6298100 0.6009718 0.5111456 0.5111456 0.4518205 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 
# [16,] 0.6298100 0.6009718 0.6009718 0.6009718 0.4518205 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 
# [17,] 0.6298100 0.6009718 0.6009718 0.6009718 0.6009718 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 
# [18,] 0.6298100 0.6009718 0.6009718 0.6009718 0.6009718 0.6009718 0.4346995 0.4346995 0.4346995 0.000000e+00 
# [19,] 0.6298100 0.6009718 0.6009718 0.6009718 0.6009718 0.6009718 0.4346995 0.4346995 0.4346995 0.000000e+00 
# [20,] 0.6298100 0.6009718 0.6009718 0.6009718 0.6009718 0.6009718 0.5643033 0.5643033 0.5643033 0.000000e+00 
+0

您好Josilber,一些yuw值與沿着行的值相同,也與沿列向下的值相同。這是否遵守yuw> = yu,w + 1和yu,w> = yu-1,w約束? – Ankit

+0

另外,第一個值(20,1)應該是100,並且y0,10 = 0 yu,10 = 0約束不成立,請問爲什麼? – Ankit

+0

@Ankit元素(1,1)位於左上方,所以'yu,w> = yu,w + 1'表示數字在您右移至左移時不減少,'yu,w> = yu -1,w'表示數字在您從上到下移動時不減少。我不會顯示'y20,0',因爲它沒有出現在客觀值中。從'y20,0 = 100'和'yu,w> = yu,w + 1'我得出結論:'y20,1 <= 100',這是我添加的約束。正如你所看到的,'y20,1'的最終選擇值是0.6298100。 – josliber