# BruteForceOptimizer 类概述
## 整体功能
`BruteForceOptimizer` 是一个基于暴力搜索(穷举法)的多维参数优化器,通过遍历参数空间中的网格点寻找目标函数的最小值或最大值。适用于低维优化问题。其核心思想是将每个参数维度等分为指定数量的网格点,计算所有可能组合的目标函数值,并根据优化方向(最小化/最大化)选择最佳结果。
## 详细代码解释
### 命名空间与结构
- **`detail` 命名空间**:包含算法实现细节。
- **`AlgBurteForce` 结构**:实际执行网格搜索的算法实现。
- **成员变量**:
- `to_min`:布尔值,指示是否进行最小化优化。
- `stc`:`StopCriteria` 类型,优化停止条件。
- `gridsz`:`size_t` 类型,每个维度的网格采样点数量。
- **构造函数**:接受停止条件和网格大小初始化。
### 关键函数
#### `num_iter<N>`
```cpp
template<size_t N>
long num_iter(const std::array<size_t, N> &idx, size_t gridsz)
- 作用:计算当前网格位置
idx
在整个搜索中的迭代次数。 - 参数:
idx
:各维度的网格索引数组。gridsz
:每维网格点数。
- 返回值:总迭代次数(基于网格索引的数值计算)。
run<D, N, Fn, C>
template<int D, size_t N, class Fn, class Cmp>
bool run(...)
- 核心递归函数:生成多维网格点并评估目标函数。
- 模板参数:
D
:当前处理的维度(通过递归递减实现多维遍历)。N
:参数维度总数。Fn
:目标函数类型。Cmp
:比较函数类型(std::less
或 std::greater
)。
- 参数:
idx
:记录各维当前网格位置的数组。result
:保存当前最优结果的引用。bounds
:参数边界约束。fn
:待优化的目标函数。cmp
:比较函数,决定更新结果的方向。
- 流程:
- 当
D < 0
时,构造当前网格点参数,计算目标值,更新最优结果。 - 否则递归遍历每个维度的所有网格点。
optimize<Fn, N>
template<class Fn,_t N>
Result<N> optimize(Fn&& fn, const Input<N>&, const Bounds<N>& bounds)
- 优化入口:配置优化方向(最小化/最大化),初始化最优结果,启动递归搜索。
- 参数:
fn
:待优化的目标函数。initvals
:初始参数值(代码中未实际使用)。bounds
:参数取值范围约束。
- 流程:
- 根据
to_min
选择初始分数(max()
或 lowest()
)和比较器。 - 调用
run
函数执行网格搜索。
Optimizer<AlgBruteForce>
类
- 作用:对
AlgBurteForce
的封装,提供用户友好的接口。 - 成员函数:
to_max()/to_min()
:设置优化方向。optimize()
:调用内部算法执行优化。set_criteria()/get_criteria()
:设置或获取停止条件。
停止条件 (StopCriteria
)
- 控制条件:通过
max_iterations
, abs_score_diff
, rel_score_diff
控制何时终止搜索。 - 检查逻辑:在每次函数评估后检查:
- 是否达到最大迭代次数。
- 分数差异是否满足绝对或相对精度。
设计要点
- 递归模板元编程:通过递归模板展开处理多维参数,减少运行时开销。
- 网格均匀采样:每个参数范围等分为
gridsz-1
段,生成 gridsz
个采样点。 - 灵活性:支持任意维度的优化问题,但复杂度随维度呈指数增长。
- 比较器动态选择:通过
std::less
或 std::greater
实现最小/最大化统一处理。
使用示例
StopCriteria crit;
crit.max_iterations(1000);
Optimizer<AlgBruteForce> opt(crit, 10);
opt.to_minBounds<2> bounds = {{ {0, 1}, {2, 5} }};
auto result =.optimize(
[](const auto& params) { return params[0] + params[1]; },
Input<2>{},
bounds
);
性能注意事项
- 维度灾难:网格数呈指数增长(
gridsz^N
),适用于 N ≤ 3 的低维问题。 - 停止条件:合理设置
max_iterations
避免长时间计算。 - 初始值:代码中
initvals
参数未实际使用,可能用于未来扩展。