Skip to content

Commit 800afd2

Browse files
committed
fix(ltdz)!: adopt Huband formulation and canonical name
Keep LTDZ as a public, non-deprecated alias and document both naming conventions, the selected transcription, and the minimization transform. BREAKING CHANGE: the canonical catalog key and problem name change from LTDZ to LTDZ1; LTDZ() remains available as an alias.
1 parent bd74371 commit 800afd2

10 files changed

Lines changed: 149 additions & 33 deletions

File tree

‎docs/make.jl‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ makedocs(
4545
"KW" => "problems/kw.md",
4646
"LE" => "problems/le.md",
4747
"Lov" => "problems/lov.md",
48+
"LTDZ" => "problems/ltdz.md",
4849
],
4950
"API Reference" => "api.md",
5051
"References" => "references.md",

‎docs/src/problems/index.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,7 @@ when available, and registered analytical derivatives when implemented.
5353
- [Lovison (Lov)](@ref): six fixed-dimension examples from Alberto Lovison
5454
[Lovison2011](@cite), including a smooth regularization of ZDT3
5555
[ZDT2000](@cite), with documented minimization conventions.
56+
- [Laumanns–Thiele–Deb–Zitzler (LTDZ)](@ref): one fixed-dimension,
57+
three-objective problem from Laumanns, Thiele, Deb, and Zitzler
58+
[Laumanns2002](@cite), using the formulation and `LTDZ1` name given in
59+
Table XVI of Huband et al. [Huband2006](@cite).

‎docs/src/problems/ltdz.md‎

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# Laumanns–Thiele–Deb–Zitzler (LTDZ)
2+
3+
This family is represented by the canonical `LTDZ1` constructor. The test
4+
problem originates in Equation (8) of “Combining Convergence and Diversity in
5+
Evolutionary Multiobjective Optimization” by Laumanns, Thiele, Deb, and
6+
Zitzler [Laumanns2002](@cite).
7+
8+
The public `LTDZ()` constructor is an alias for `LTDZ1()`. Fliege, Drummond,
9+
and Svaiter refer to the benchmark as `LTDZ` [FDS2009](@cite), whereas Huband
10+
et al. assign it the catalog name `LTDZ1` [Huband2006](@cite). MOProblems.jl
11+
uses `LTDZ1` as the canonical catalog identity while supporting both
12+
constructor names.
13+
14+
!!! note "Source transcription and optimization convention"
15+
Equation (8) of Laumanns et al. is formulated for maximization and prints
16+
``f_3`` with ``\cos(\pi x_1/2)\sin(\pi x_1/2)``. Huband et al. classify
17+
`LTDZ1` as apparently containing a typographical error and list ``f_3``
18+
with only ``\sin(\pi x_1/2)`` in Table XVI. `LTDZ1` adopts the latter
19+
expression and negates the objectives for minimization.
20+
21+
## Overview
22+
23+
`LTDZ1` has `nvar = 3` and `nobj = 3`. The alias `LTDZ()` constructs the same
24+
canonical problem and therefore also reports `prob.name == "LTDZ1"`.
25+
Its componentwise bounds are shown below.
26+
27+
| Problem | `nvar` | `nobj` | Lower bound | Upper bound |
28+
|:---|---:|---:|---:|---:|
29+
| `LTDZ1` | 3 | 3 | 0.0 | 1.0 |
30+
31+
An analytical Jacobian is registered. **Hessians are not registered**. The
32+
catalog metadata classifies all three objectives as not strictly convex
33+
(`:not_strictly_convex`).
34+
35+
## Mathematical formulation
36+
37+
The formulas below describe the minimization objectives implemented by both
38+
constructors. Let ``F:\mathbb{R}^3\to\mathbb{R}^3`` be defined by
39+
``F(x)=(f_1(x),f_2(x),f_3(x))``, where
40+
``x=(x_1,x_2,x_3)\in[0,1]^3``. The objectives are
41+
42+
```math
43+
\begin{aligned}
44+
f_1(x) &=
45+
-3+(1+x_3)\cos\left(\frac{\pi x_1}{2}\right)
46+
\cos\left(\frac{\pi x_2}{2}\right),\\
47+
f_2(x) &=
48+
-3+(1+x_3)\cos\left(\frac{\pi x_1}{2}\right)
49+
\sin\left(\frac{\pi x_2}{2}\right),\\
50+
f_3(x) &=
51+
-3+(1+x_3)\sin\left(\frac{\pi x_1}{2}\right).
52+
\end{aligned}
53+
```
54+
55+
## Usage
56+
57+
```julia
58+
using MOProblems
59+
60+
prob = LTDZ1()
61+
x = [0.5, 0.5, 0.0]
62+
63+
values = eval_f(prob, x)
64+
huband_maximization_values = -values
65+
J = eval_jacobian(prob, x)
66+
67+
same_prob = LTDZ()
68+
```
69+
70+
## Constructor reference
71+
72+
```@docs
73+
MOProblems.LTDZ1
74+
MOProblems.LTDZ
75+
```

‎docs/src/refs.bib‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,20 @@ @article{KW2005
186186
url = {https://doi.org/10.1007/s00158-004-0465-1}
187187
}
188188

189+
@article{Laumanns2002,
190+
author = {Laumanns, Marco and Thiele, Lothar and Deb, Kalyanmoy and Zitzler, Eckart},
191+
title = {Combining Convergence and Diversity in Evolutionary Multiobjective Optimization},
192+
journal = {Evolutionary Computation},
193+
volume = {10},
194+
number = {3},
195+
pages = {263--282},
196+
year = {2002},
197+
month = {09},
198+
issn = {1063-6560},
199+
doi = {10.1162/106365602760234108},
200+
url = {https://doi.org/10.1162/106365602760234108}
201+
}
202+
189203
@inproceedings{LE1997,
190204
author = {Lis, J. and Eiben, A. E.},
191205
booktitle = {Proceedings of 1997 IEEE International Conference on Evolutionary Computation (ICEC '97)},

‎src/MOProblems.jl‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export JOS1, JOS4, KW2
5555
export QV1
5656
export SD
5757
export SLCDT1, SLCDT2
58-
export LE1, Lov1, Lov2, Lov3, Lov4, Lov5, Lov6, LTDZ
58+
export LE1, Lov1, Lov2, Lov3, Lov4, Lov5, Lov6, LTDZ, LTDZ1
5959
export MGH9, MGH16, MGH26, MGH33
6060
export MHHM1, MHHM2
6161
export MLF1, MLF2

‎src/Meta/LTDZ.jl‎

Lines changed: 0 additions & 7 deletions
This file was deleted.

‎src/Meta/LTDZ1.jl‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
LTDZ1_meta = ProblemMeta(
2+
dimension = FixedDimension(3, 3),
3+
name = "LTDZ1",
4+
has_bounds = true,
5+
has_jacobian = true,
6+
strict_convexity = [:not_strictly_convex, :not_strictly_convex, :not_strictly_convex],
7+
)

‎src/problems/ltdz2002.jl‎

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,19 @@
11
"""
2-
LTDZ()
2+
LTDZ1()
33
4-
Problem characteristics summary:
5-
- 3 variables
6-
- 3 objectives
7-
- Objectives:
8-
f₁(x) = -3 + (1 + x₃)cos(πx₁/2)cos(πx₂/2)
9-
f₂(x) = -3 + (1 + x₃)cos(πx₁/2)sin(πx₂/2)
10-
f₃(x) = -3 + (1 + x₃)cos(πx₁/2)sin(πx₁/2)
11-
- Bounds: [0, 1] for all variables
4+
Construct the fixed-dimension `LTDZ1` benchmark with three variables and three
5+
objectives. Each variable is bounded by `[0, 1]`. An analytical Jacobian is
6+
registered; objective Hessians are not registered.
127
13-
Referência:
14-
M. Laumanns, L. Thiele, K. Deb, E. Zitzler, Combining Convergence and Diversity in Evolutionary
15-
Multiobjective Optimization, Evolutionary Computation, 10(3):263–282, 2002. DOI: 10.1162/106365602760234108
8+
The constructor uses the third objective given for `LTDZ1` in Table XVI of
9+
Huband et al. (2006), rather than a literal transcription of Equation (8) in
10+
Laumanns et al. (2002). It negates all three maximization objectives to follow
11+
the package's minimization convention.
1612
"""
17-
function LTDZ()
18-
meta = META["LTDZ"]
19-
n = default_nvar(meta) # 3
20-
m = default_nobj(meta) # 3
13+
function LTDZ1()
14+
meta = META["LTDZ1"]
15+
n = default_nvar(meta)
16+
m = default_nobj(meta)
2117

2218
f1 = function (x::AbstractVector{T}) where {T <: AbstractFloat}
2319
halfpi = T(π) / T(2)
@@ -36,7 +32,7 @@ function LTDZ()
3632
f3 = function (x::AbstractVector{T}) where {T <: AbstractFloat}
3733
halfpi = T(π) / T(2)
3834
a = x[1] * halfpi
39-
return T(-3) + (one(T) + x[3]) * cos(a) * sin(a)
35+
return T(-3) + (one(T) + x[3]) * sin(a)
4036
end
4137

4238
df1_dx = function (g::AbstractVector{T}, x::AbstractVector{T}) where {T <: AbstractFloat}
@@ -45,7 +41,7 @@ function LTDZ()
4541
b = x[2] * halfpi
4642
g[1] = -halfpi * (one(T) + x[3]) * sin(a) * cos(b)
4743
g[2] = -halfpi * (one(T) + x[3]) * cos(a) * sin(b)
48-
g[3] = cos(a) * cos(b)
44+
g[3] = cos(a) * cos(b)
4945
return g
5046
end
5147

@@ -54,18 +50,17 @@ function LTDZ()
5450
a = x[1] * halfpi
5551
b = x[2] * halfpi
5652
g[1] = -halfpi * (one(T) + x[3]) * sin(a) * sin(b)
57-
g[2] = halfpi * (one(T) + x[3]) * cos(a) * cos(b)
58-
g[3] = cos(a) * sin(b)
53+
g[2] = halfpi * (one(T) + x[3]) * cos(a) * cos(b)
54+
g[3] = cos(a) * sin(b)
5955
return g
6056
end
6157

6258
df3_dx = function (g::AbstractVector{T}, x::AbstractVector{T}) where {T <: AbstractFloat}
6359
halfpi = T(π) / T(2)
6460
a = x[1] * halfpi
65-
cosa = cos(a); sina = sin(a)
66-
g[1] = halfpi * (one(T) + x[3]) * (cosa * cosa - sina * sina)
61+
g[1] = halfpi * (one(T) + x[3]) * cos(a)
6762
g[2] = zero(T)
68-
g[3] = cosa * sina
63+
g[3] = sin(a)
6964
return g
7065
end
7166

@@ -77,4 +72,12 @@ function LTDZ()
7772
bounds = (zeros(n), ones(n)),
7873
jacobian = (df1_dx, df2_dx, df3_dx),
7974
)
80-
end
75+
end
76+
77+
"""
78+
LTDZ()
79+
80+
Alias for `LTDZ1()`. Fliege, Drummond, and Svaiter (2009) use the name `LTDZ`
81+
for this benchmark, while Huband et al. (2006) catalog it as `LTDZ1`.
82+
"""
83+
LTDZ() = LTDZ1()

‎test/catalog/listings.jl‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ using MOProblems
44
@testset "Catalog Listings" begin
55
names = MOProblems.get_problem_names()
66
# Presença de alguns problemas conhecidos
7-
for expected in ("AP1", "DTLZ1", "MOP2", "ZDT1", "ZDT6")
7+
for expected in ("AP1", "DTLZ1", "LTDZ1", "MOP2", "ZDT1", "ZDT6")
88
@test expected in names
99
end
10+
@test "LTDZ" ∉ names
1011

1112
meta = MOProblems.META["ZDT1"]
1213
@test meta isa MOProblems.ProblemMeta

‎test/contracts/problem_definitions.jl‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,21 @@ end
138138
@test_throws ErrorException eval_constraint_jacobian(unconstrained, xu)
139139
@test_throws ErrorException eval_constraint_hessian(unconstrained, xu)
140140
end
141+
142+
@testset "LTDZ naming and corrected formulation" begin
143+
canonical = LTDZ1()
144+
alias = LTDZ()
145+
146+
@test canonical.name == "LTDZ1"
147+
@test alias.name == canonical.name
148+
@test eval_f(alias, [0.25, 0.5, 0.75]) ≈ eval_f(canonical, [0.25, 0.5, 0.75])
149+
150+
# Huband et al.'s corrected third objective omits the extra cosine factor
151+
# printed in Equation (8) of Laumanns et al.
152+
@test eval_f(canonical, [1.0, 0.0, 0.0]) ≈ [-3.0, -3.0, -2.0]
153+
@test eval_jacobian(canonical, [0.0, 0.0, 0.0]) ≈ [
154+
0.0 0.0 1.0
155+
0.0 π / 2 0.0
156+
π / 2 0.0 0.0
157+
]
158+
end

0 commit comments

Comments
 (0)