鑑於此處優化問題與your previous question的相似之處,我將直接從我對該問題的回答中借用一些語言。然而它們有很大的不同(前面的問題是線性規劃問題,這是一個二次規劃問題,約束不同),所以它們不是重複的。
擴大優化目標我們得到Quw*ruw^2 - 2*Quw*ruw*yuw + Quw*yuw^2
。我們看到這是決策變量yuw
的二次函數,因此quadProg
包的solve.QP
方法可用於解決優化問題。
爲了抽象出一點,我們假設R=20
和C=10
描述了輸入矩陣的維數。然後有R*C
決策變量,我們可以將它們分配的順序爲y11, y21, ... yR1, y12, y22, ... yR2, ..., y1C, y2C, ..., yRC
,讀取變量矩陣的列。
從?solve.QP
,我們看到目標的形式爲-d'b + 0.5b'Db
決策變量b
。對應於決策變量yuw
的d
的元素具有值2*Quw*ruw
和D
是對角矩陣,其中元素對應於取值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
您好Josilber,一些yuw值與沿着行的值相同,也與沿列向下的值相同。這是否遵守yuw> = yu,w + 1和yu,w> = yu-1,w約束? – Ankit
另外,第一個值(20,1)應該是100,並且y0,10 = 0 yu,10 = 0約束不成立,請問爲什麼? – Ankit
@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