Kevin Kam Fung YUEN (2026). Anchored Regularized Direct Least Squares (ARDLS): Integrating Established Prioritization Operators for Priority Elicitation in the Analytic Hierarchy Process. arXiv preprint arXiv:2608.21187. https://arxiv.org/pdf/2608.21187
# Created by Kevin Kam Fung YUEN
library(ARDLS)
dls_solve <- function(PRM)
{
solve_DLS(PRM)$weights
}
POs = list(
NRS = NRS,
NRCS = NRCS,
AMNC = AMNC,
NGMR = geoMean,
EV = SaatyEigen,
SVD = SVD,
CosMax = CosMax,
PIGM = PIGM,
DLS = dls_solve
)
POList <-function(PRM)
{
PO_results = list(
NRS = NRS(PRM),
NRCS = NRCS(PRM),
AMNC = AMNC(PRM),
NGMR = geoMean(PRM),
EV = SaatyEigen(PRM),
SVD = SVD(PRM),
CosMax = CosMax(PRM),
PIGM = PIGM(PRM),
DLS = solve_DLS(PRM)$weights
)
}
PRM1 <- matrix(c(
1, 2, 6,
1/2, 1, 3,
1/6, 1/3, 1
), nrow = 3, byrow = TRUE)
ConsistencyRatio(PRM1)
## [1] 0
ARDLS::safeRegularizer(PRM1,num_starts = 1000)
## Running DLS optimization from 1000 random starting points...
##
## === DLS Optimization Results ===
## Global Minimum Objective Value: 0.00000000
## Number of Unique Optimal Solutions Found: 1
## Optimal Weight Vectors:
## w1 w2 w3
## [1,] 0.6 0.3 0.1
## $lambda_star
## [1] 1
##
## $case
## [1] "Case 1: Unique Convex Minimum (|W*| = 1, Delta_min > 0)"
##
## $delta_min
## [1] 223.7654
##
## $delta_max
## [1] 223.7654
##
## $lambda_tilde
## [1] -111.8827
##
## $num_solutions
## [1] 1
##
## $W_star
## w1 w2 w3
## [1,] 0.6 0.3 0.1
options(width = 200)
round(ARDLS::compare_ARDLS_anchors(PRM1, POs, reg_lambda = 1),4)
## NRS NRCS AMNC NGMR EV SVD CosMax PIGM DLS
## Base_w1 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6
## Base_w2 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3
## Base_w3 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
## ARDLS_w1 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6
## ARDLS_w2 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3
## ARDLS_w3 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
## Objective_Val 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
## ARDSE 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
## DSE_ARDLS 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
## DSE_Base 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
## ARP 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
## RMSV_Base 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
## RMSV_ARDLS 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
plot2DSolution_Case1 = plot2DSolution(PRM1, POList(PRM1),filename = "./figures/plot2d_c1.png",
titleText= "",plot_width = 12, plot_height = 10,,num_digits = 2)
## Plot saved successfully to ./figures/plot2d_c1.png (Width: 12, Height: 10)
options(repr.plot.width = 12, repr.plot.height = 10)
img1 <- png::readPNG("./figures/plot2d_c1.png")
grid::grid.raster(img1)
fig_case1 <- plot3DSolution(PRM1, POList(PRM1),z_cap = 5,z_start = -0.1)
fig_case1
PRM2 <- matrix(c(
1, 1/4, 1/2,
4, 1, 3,
2, 1/3, 1
), nrow = 3, byrow = TRUE)
ConsistencyRatio(PRM2)
## [1] 0.0157713
ARDLS::safeRegularizer(PRM2,num_starts = 1000)
## Running DLS optimization from 1000 random starting points...
##
## === DLS Optimization Results ===
## Global Minimum Objective Value: 0.34914603
## Number of Unique Optimal Solutions Found: 1
## Optimal Weight Vectors:
## w1 w2 w3
## [1,] 0.148 0.622 0.229
## $lambda_star
## [1] 1
##
## $case
## [1] "Case 1: Unique Convex Minimum (|W*| = 1, Delta_min > 0)"
##
## $delta_min
## [1] 130.5419
##
## $delta_max
## [1] 130.5419
##
## $lambda_tilde
## [1] -65.27097
##
## $num_solutions
## [1] 1
##
## $W_star
## w1 w2 w3
## [1,] 0.148 0.622 0.229
options(width = 200)
round(ARDLS::compare_ARDLS_anchors(PRM2, POs, reg_lambda = 1),4)
## NRS NRCS AMNC NGMR EV SVD CosMax PIGM DLS
## Base_w1 0.1338 0.1433 0.1373 0.1365 0.1365 0.1473 0.1377 0.1476 0.1485
## Base_w2 0.6115 0.6337 0.6232 0.6250 0.6250 0.6302 0.6219 0.6316 0.6220
## Base_w3 0.2548 0.2230 0.2395 0.2385 0.2385 0.2225 0.2404 0.2208 0.2295
## ARDLS_w1 0.1484 0.1485 0.1485 0.1485 0.1485 0.1485 0.1485 0.1485 0.1485
## ARDLS_w2 0.6219 0.6221 0.6220 0.6220 0.6220 0.6221 0.6220 0.6221 0.6220
## ARDLS_w3 0.2296 0.2294 0.2295 0.2295 0.2295 0.2294 0.2295 0.2294 0.2295
## Objective_Val 0.3501 0.3494 0.3494 0.3494 0.3494 0.3493 0.3494 0.3493 0.3491
## ARDSE 0.3501 0.3494 0.3494 0.3494 0.3494 0.3493 0.3494 0.3493 0.3491
## DSE_ARDLS 0.3492 0.3491 0.3491 0.3491 0.3491 0.3491 0.3491 0.3491 0.3491
## DSE_Base 0.7041 0.4211 0.5234 0.5514 0.5514 0.3719 0.5106 0.3806 0.3491
## ARP 0.0010 0.0002 0.0002 0.0002 0.0002 0.0001 0.0002 0.0002 0.0000
## RMSV_Base 0.2797 0.2163 0.2412 0.2475 0.2475 0.2033 0.2382 0.2056 0.1970
## RMSV_ARDLS 0.1970 0.1970 0.1970 0.1970 0.1970 0.1970 0.1970 0.1970 0.1970
plot2DSolution_Case2 = plot2DSolution(PRM2, POList(PRM2),filename = "./figures/plot2d_c2.png",
titleText= "",plot_width = 12, plot_height = 10,num_digits = 2)
## Plot saved successfully to ./figures/plot2d_c2.png (Width: 12, Height: 10)
options(repr.plot.width = 12, repr.plot.height = 10)
img2 <- png::readPNG("./figures/plot2d_c2.png")
grid::grid.raster(img2)
fig_case2 <- plot3DSolution(PRM2, POList(PRM2),z_cap =2,z_start = 0)
fig_case2
PRM3 <- matrix(c(
1, 1/4, 4,
4, 1, 1/4,
1/4, 4, 1
), nrow = 3, byrow = TRUE)
ConsistencyRatio(PRM3)
## [1] 1.939655
DLS1 = function(PRM) solve_DLS(PRM, c(0.33, 0.33, 0.33))
DLS2 = function(PRM) solve_DLS(PRM, c(0.34, 0.33, 0.33))
DLS3 = function(PRM) solve_DLS(PRM, c(0.33, 0.34, 0.33))
DLS4 = function(PRM) solve_DLS(PRM, c(0.33, 0.33, 0.34))
POList2 <-function(PRM)
{
PO_results = list(
NRS = NRS(PRM),
NRCS = NRCS(PRM),
AMNC = AMNC(PRM),
NGMR = geoMean(PRM),
EV = SaatyEigen(PRM),
SVD = SVD(PRM),
CosMax = CosMax(PRM),
PIGM = PIGM(PRM),
DLS1 = DLS1(PRM)$weights,
DLS2 = DLS2(PRM)$weights,
DLS3 = DLS3(PRM)$weights,
DLS4 = DLS4(PRM)$weights
)
}
dls1 = DLS1(PRM3)
dls1
## $weights
## [1] 0.3333333 0.3333333 0.3333333
##
## $obj_val
## [1] 28.6875
dls2 = DLS2(PRM3)
dls2
## $weights
## [1] 0.4683266 0.3170438 0.2146296
##
## $obj_val
## [1] 28.44534
dls3 = DLS3(PRM3)
dls3
## $weights
## [1] 0.2146296 0.4683266 0.3170438
##
## $obj_val
## [1] 28.44534
dls4 = DLS4(PRM3)
dls4
## $weights
## [1] 0.3170438 0.2146296 0.4683266
##
## $obj_val
## [1] 28.44534
To illustrate the step-by-step calculations presented in Table 2 of the paper, the local convexity bounds (\(\Delta_{DLS}\)) are rounded to three decimal places.
Note: As detailed in the paper, the \(DLS_2\) solution is selected as a representative example to demonstrate the explicit calculation steps for \(\Delta_{DLS}\).
digits = 3
DLSConvexityBound(PRM = PRM3,w = round(dls1$weights,digits))
## [1] -9.018027
DLSConvexityBound(PRM = PRM3,w = round(dls2$weights,digits))
## [1] 29.94059
DLSConvexityBound(PRM = PRM3,w = round(dls3$weights,digits))
## [1] 29.94059
DLSConvexityBound(PRM = PRM3,w = round(dls3$weights,digits))
## [1] 29.94059
As illustrated in the paper, take DLS2 solution as an example for the calculation steps of \(Δ_{DLS}\)
round(dls2$weights,3)
## [1] 0.468 0.317 0.215
# Set the weights based on DLS2
w1 <- 0.468
w2 <- 0.317
w3 <- 0.215
# ==========================================
# For k = 1 (substituting a21 = 4, a31 = 0.25)
# ==========================================
k1_tm1_pt1 <- (2 * w2) / (w1^4) * (3 * w2 - 2 * 4 * w1)
k1_tm1_pt2 <- (2 * w3) / (w1^4) * (3 * w3 - 2 * 0.25 * w1)
k1_tm2_pt1 <- 2 / (w2^2)
k1_tm2_pt2 <- 2 / (w3^2)
k1_sum_t1 <- k1_tm1_pt1 + k1_tm1_pt2
k1_sum_t2 <- k1_tm2_pt1 + k1_tm2_pt2
delta_k1 <- k1_sum_t1 + k1_sum_t2
cat("For k = 1:\n")
## For k = 1:
cat(sprintf("= %.3f + %.3f + %.3f + %.3f = %.3f + %.3f = %.3f\n\n",
k1_tm1_pt1, k1_tm1_pt2, k1_tm2_pt1, k1_tm2_pt2,
k1_sum_t1, k1_sum_t2, delta_k1))
## = -36.913 + 3.684 + 19.903 + 43.267 = -33.229 + 63.169 = 29.941
# ==========================================
# For k = 2 (substituting a12 = 0.25, a32 = 4)
# ==========================================
k2_tm1_pt1 <- (2 * w1) / (w2^4) * (3 * w1 - 2 * 0.25 * w2)
k2_tm1_pt2 <- (2 * w3) / (w2^4) * (3 * w3 - 2 * 4 * w2)
k2_tm2_pt1 <- 2 / (w1^2)
k2_tm2_pt2 <- 2 / (w3^2)
k2_sum_t1 <- k2_tm1_pt1 + k2_tm1_pt2
k2_sum_t2 <- k2_tm2_pt1 + k2_tm2_pt2
delta_k2 <- k2_sum_t1 + k2_sum_t2
cat("For k = 2:\n")
## For k = 2:
cat(sprintf("= %.3f - %.3f + %.3f + %.3f = %.3f + %.3f = %.3f\n\n",
k2_tm1_pt1, abs(k2_tm1_pt2), k2_tm2_pt1, k2_tm2_pt2,
k2_sum_t1, k2_sum_t2, delta_k2))
## = 115.447 - 80.524 + 9.131 + 43.267 = 34.923 + 52.398 = 87.321
# ==========================================
# For k = 3 (substituting a13 = 4, a23 = 0.25)
# ==========================================
k3_tm1_pt1 <- (2 * w1) / (w3^4) * (3 * w1 - 2 * 4 * w3)
k3_tm1_pt2 <- (2 * w2) / (w3^4) * (3 * w2 - 2 * 0.25 * w3)
k3_tm2_pt1 <- 2 / (w1^2)
k3_tm2_pt2 <- 2 / (w2^2)
k3_sum_t1 <- k3_tm1_pt1 + k3_tm1_pt2
k3_sum_t2 <- k3_tm2_pt1 + k3_tm2_pt2
delta_k3 <- k3_sum_t1 + k3_sum_t2
cat("For k = 3:\n")
## For k = 3:
cat(sprintf("= %.3f + %.3f + %.3f + %.3f = %.3f + %.3f = %.3f\n\n",
k3_tm1_pt1, k3_tm1_pt2, k3_tm2_pt1, k3_tm2_pt2,
k3_sum_t1, k3_sum_t2, delta_k3))
## = -138.423 + 250.277 + 9.131 + 19.903 = 111.853 + 29.034 = 140.888
# ==========================================
# Global Local Curvature (Minimum)
# ==========================================
delta_DLS <- min(delta_k1, delta_k2, delta_k3)
cat("Taking the minimum across all coordinates yields Δ_DLS:\n")
## Taking the minimum across all coordinates yields Δ_DLS:
cat(sprintf("Δ_DLS = min(%.3f, %.3f, 140.888) = %.3f\n", delta_k1, delta_k2, delta_DLS))
## Δ_DLS = min(29.941, 87.321, 140.888) = 29.941
# Using the precise unrounded vector from the solver for exact matching
#w <- round(dls1$weights,3) # -9.018
w <- round(dls2$weights,3) # 29.941
#w <- round(dls3$weights,3)
#w <- round(dls4$weights,3)
A = PRM3
# Function to calculate Delta_DLS^(k)
calc_delta_k <- function(k, w, A) {
n <- length(w)
# Term 1: sum_{i != k} [ (2 * w_i / w_k^4) * (3 * w_i - 2 * A[i,k] * w_k) ]
term1 <- 0
for (i in 1:n) {
if (i != k) {
term1 <- term1 + (2 * w[i] / w[k]^4) * (3 * w[i] - 2 * A[i,k] * w[k])
}
}
# Term 2: sum_{j != k} [ 2 / w_j^2 ]
term2 <- 0
for (j in 1:n) {
if (j != k) {
term2 <- term2 + (2 / w[j]^2)
}
}
return(term1 + term2)
}
# Evaluate curvature across all coordinates k = 1, 2, 3
delta_k1 <- calc_delta_k(1, w, A)
delta_k2 <- calc_delta_k(2, w, A)
delta_k3 <- calc_delta_k(3, w, A)
cat(sprintf("Delta_DLS^(1) = %.3f\n", delta_k1))
## Delta_DLS^(1) = 29.941
cat(sprintf("Delta_DLS^(2) = %.3f\n", delta_k2))
## Delta_DLS^(2) = 87.321
cat(sprintf("Delta_DLS^(3) = %.3f\n", delta_k3))
## Delta_DLS^(3) = 140.888
# Find the global minimum curvature for this solution
delta_DLS <- min(delta_k1, delta_k2, delta_k3)
cat(sprintf("Local Delta_DLS = %.3f\n\n", delta_DLS))
## Local Delta_DLS = 29.941
# Compute the Safe Regularization Parameter (lambda^*)
delta_DLS_max <- delta_DLS
alpha <- 1.2
lambda_bound <- alpha * delta_DLS_max
cat(sprintf("Lower Bound (alpha * Delta_max) = %.3f\n", lambda_bound))
## Lower Bound (alpha * Delta_max) = 35.929
cat(sprintf("Selected Safe Regularizer (lambda^*) = %d\n", ceiling(lambda_bound)))
## Selected Safe Regularizer (lambda^*) = 36
ARDLS::safeRegularizer(PRM3,num_starts = 1000)
## Running DLS optimization from 1000 random starting points...
##
## === DLS Optimization Results ===
## Global Minimum Objective Value: 28.44534182
## Number of Unique Optimal Solutions Found: 3
## Optimal Weight Vectors:
## w1 w2 w3
## [1,] 0.468 0.317 0.215
## [2,] 0.215 0.468 0.317
## [3,] 0.317 0.215 0.468
## $lambda_star
## [1] 35.9287
##
## $case
## [1] "Case 2: Multiple Convex Minima (|W*| > 1, Delta_min > 0)"
##
## $delta_min
## [1] 29.94059
##
## $delta_max
## [1] 29.94059
##
## $lambda_tilde
## [1] -14.97029
##
## $num_solutions
## [1] 3
##
## $W_star
## w1 w2 w3
## [1,] 0.468 0.317 0.215
## [2,] 0.215 0.468 0.317
## [3,] 0.317 0.215 0.468
options(width = 200)
round(ARDLS::compare_ARDLS_anchors(PRM3, POs, reg_lambda = 36),4)
## NRS NRCS AMNC NGMR EV SVD CosMax PIGM DLS
## Base_w1 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333
## Base_w2 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333
## Base_w3 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333
## ARDLS_w1 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333
## ARDLS_w2 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333
## ARDLS_w3 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333
## Objective_Val 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875
## ARDSE 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875
## DSE_ARDLS 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875
## DSE_Base 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875 28.6875
## ARP 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
## RMSV_Base 1.7854 1.7854 1.7854 1.7854 1.7854 1.7854 1.7854 1.7854 1.7854
## RMSV_ARDLS 1.7854 1.7854 1.7854 1.7854 1.7854 1.7854 1.7854 1.7854 1.7854
plot2DSolution_Case3 = plot2DSolution(PRM3, POList2(PRM3),filename = "./figures/plot2d_c3.png",
titleText= "",plot_width = 12, plot_height = 10,,num_digits = 2)
## Plot saved successfully to ./figures/plot2d_c3.png (Width: 12, Height: 10)
options(repr.plot.width = 12, repr.plot.height = 10)
img3 <- png::readPNG("./figures/plot2d_c3.png")
grid::grid.raster(img3)
fig_case3a <- plot3DSolution(PRM3, POList2(PRM3),z_cap = 1.5,z_start = 28.3)
fig_case3a
fig_case3b <- plot3DARDLS(
PRM = PRM3,
POs = POList2(PRM3),
lambda = 36, # Regularization penalty
w_anchor = POList(PRM3)$PIGM, # Anchor weights
z_cap = 1.5, # Height cutoff for the surface
z_start = 28.5 # Base of the Z-axis
)
fig_case3b
PRM4 <- matrix(c(
1, 4, 3, 1, 3, 4,
1/4, 1, 7, 3, 1/5, 1,
1/3, 1/7, 1, 1/5, 1/5, 1/6,
1, 1/3, 5, 1, 1, 1/3,
1/3, 5, 5, 1, 1, 3,
1/4, 1, 6, 3, 1/3, 1
), nrow = 6, ncol = 6, byrow = TRUE)
ConsistencyRatio(PRM4)
## [1] 0.2290113
ARDLS::safeRegularizer(PRM4,num_starts = 1000)
## Running DLS optimization from 1000 random starting points...
##
## === DLS Optimization Results ===
## Global Minimum Objective Value: 60.01548404
## Number of Unique Optimal Solutions Found: 1
## Optimal Weight Vectors:
## w1 w2 w3 w4 w5 w6
## [1,] 0.184 0.22 0.037 0.15 0.21 0.197
## $lambda_star
## [1] 1
##
## $case
## [1] "Case 1: Unique Convex Minimum (|W*| = 1, Delta_min > 0)"
##
## $delta_min
## [1] 1300.278
##
## $delta_max
## [1] 1300.278
##
## $lambda_tilde
## [1] -650.1389
##
## $num_solutions
## [1] 1
##
## $W_star
## w1 w2 w3 w4 w5 w6
## [1,] 0.184 0.22 0.037 0.15 0.21 0.197
options(width = 200)
round(ARDLS::compare_ARDLS_anchors(PRM4, POs, reg_lambda = 1),4)
## NRS NRCS AMNC NGMR EV SVD CosMax PIGM DLS
## Base_w1 0.2421 0.3812 0.3047 0.3160 0.3208 0.4010 0.2926 0.4150 0.1845
## Base_w2 0.1884 0.1052 0.1486 0.1391 0.1395 0.1032 0.1554 0.0936 0.2204
## Base_w3 0.0309 0.0447 0.0382 0.0360 0.0348 0.0412 0.0395 0.0348 0.0371
## Base_w4 0.1312 0.1312 0.1414 0.1251 0.1285 0.1212 0.1465 0.1123 0.1504
## Base_w5 0.2321 0.2106 0.2208 0.2360 0.2374 0.2112 0.2144 0.2190 0.2103
## Base_w6 0.1753 0.1271 0.1463 0.1477 0.1391 0.1221 0.1517 0.1253 0.1973
## ARDLS_w1 0.1845 0.1847 0.1846 0.1846 0.1846 0.1847 0.1846 0.1847 0.1845
## ARDLS_w2 0.2204 0.2203 0.2203 0.2203 0.2203 0.2203 0.2203 0.2203 0.2204
## ARDLS_w3 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371
## ARDLS_w4 0.1504 0.1504 0.1504 0.1504 0.1504 0.1504 0.1504 0.1504 0.1504
## ARDLS_w5 0.2104 0.2104 0.2104 0.2104 0.2104 0.2104 0.2104 0.2104 0.2103
## ARDLS_w6 0.1973 0.1972 0.1972 0.1972 0.1972 0.1972 0.1973 0.1972 0.1973
## Objective_Val 60.0212 60.0728 60.0379 60.0431 60.0452 60.0826 60.0335 60.0914 60.0155
## ARDSE 60.0212 60.0728 60.0379 60.0431 60.0452 60.0826 60.0335 60.0914 60.0155
## DSE_ARDLS 60.0155 60.0155 60.0155 60.0155 60.0155 60.0156 60.0155 60.0156 60.0155
## DSE_Base 74.9265 95.1335 77.3477 85.2792 89.8472 107.7832 73.1656 138.2288 60.0155
## ARP 0.0057 0.0572 0.0224 0.0276 0.0297 0.0670 0.0180 0.0758 0.0000
## RMSV_Base 1.4427 1.6256 1.4658 1.5391 1.5798 1.7303 1.4256 1.9595 1.2912
## RMSV_ARDLS 1.2912 1.2912 1.2912 1.2912 1.2912 1.2912 1.2912 1.2912 1.2912