Estimate multi-objective Pareto front using multiple weighted single objective optimisations

paretoObjectivesVaryWeights(
  MODEL,
  objective = hydromad.getOption("objective"),
  weights,
  fitBy,
  ...
)

Arguments

MODEL

a model specification created by hydromad. It should not be fully specified, i.e one or more parameters should be defined by ranges of values rather than exact values.

objective

objective functions to maximise, as a list with elements as function(Q, X, ...). See objFunVal.

weights

matrix of weights to use, with columns in the same order as objective

fitBy

function to estimate parameters of MODEL, e.g. fitByOptim, fitBySCE

...

Arguments passed to fitBy

Value

runlist of models on Pareto front, corresponding to the weights specified for each objective

Author

Joseph Guillaume

Examples


data(Cotter)
x <- Cotter[1:1000]

## IHACRES CWI model with exponential unit hydrograph
## an unfitted model, with ranges of possible parameter values
modx <- hydromad(x,
  sma = "cwi", routing = "expuh",
  tau_s = c(2, 100), v_s = c(0, 1)
)

## Uncomment to parallelise the fitBy runs
# library(parallel)
# cl <- makeCluster(getOption("cl.cores", 2))
# clusterEvalQ(cl,library(hydromad))
# hydromad.options(parallel="clusterApply")


## Optimisation of multiple weights for r.sq.log and r.squared
weights <- cbind(c(0, 0.33, 0.5, 0.67, 1), 1 - c(0, 0.33, 0.5, 0.67, 1))

## Estimate parameters using single fitByOptim run
## from single initial parameter set
front <- paretoObjectivesVaryWeights(modx,
  objective = list(hmadstat("r.sq.log"), hmadstat("r.squared")),
  weights = weights, fitBy = fitByOptim, samples = 1
)

summary(front)
#>                rel.bias r.squared r.sq.sqrt  r.sq.log
#> 0_1       -1.067195e-16 0.7321522 0.8062483 0.7944156
#> 0.33_0.67 -4.821344e-17 0.7256469 0.8263959 0.8316768
#> 0.5_0.5   -3.091922e-17 0.7199028 0.8293105 0.8399247
#> 0.67_0.33  1.063082e-17 0.7136401 0.8295052 0.8444205
#> 1_0        2.264742e-17 0.7014670 0.8264166 0.8470626
## Plot objectives
stats <- t(sapply(front, objFunVal, objective = list(hmadstat("r.sq.log"), hmadstat("r.squared"))))
plot(stats)