问题(Problem)类
问题类是优化问题的基类,提供了问题定义和评估的基本框架。
主要属性
| 属性名 | 类型 | 说明 |
|---|---|---|
| decision_num | int | 决策变量维度 |
| n_obj | int | 目标函数数量 |
| n_con | int | 约束条件数量 |
| xl | ndarray | 决策变量下界,形状:[decision_num] |
| xu | ndarray | 决策变量上界,形状:[decision_num] |
| evaluate_time | int | 当前评估次数 |
| solution_num | int | 用于优化问题的个体数量 |
| total_change_time | int | 总的环境变化次数 |
动态属性
| 属性名 | 类型 | 说明 |
|---|---|---|
| n | int | 环境变化强度 |
| tau | int | 每 tau 代变化一次 |
| t | int | 当前时间步 |
| label | str | 问题标签 |
环境变化控制
框架通过评估次数来控制环境变化,确保算法之间的公平性:
环境变化触发条件:
- 每
tau * solution_num次评估触发一次环境变化 - 例如:当
tau=10,solution_num=100时,每 1000 次评估触发一次变化
- 每
总评估次数控制:
- 总评估次数 =
tau * solution_num * total_change_time - 例如:当
tau=10,solution_num=100,total_change_time=30时,总评估次数为 30000 次
- 总评估次数 =
公平性保证:
- 响应策略使用的评估次数会影响搜索算法的可用评估次数
- 所有算法在相同总评估次数下进行优化,确保公平比较
核心方法
1. 评估接口
evaluate(X, need_count=True, t=None): 评估解的目标函数值和约束值- 参数:
X: ndarray,决策变量矩阵,形状:[n_samples, decision_num]need_count: bool,是否需要计数评估次数t: int,指定时间步(默认使用当前时间步)
- 返回:
F: ndarray,目标函数值,形状:[n_samples, n_obj]G: ndarray,约束值,形状:[n_samples, n_con](无约束时返回 None)
- 参数:
重要提示
当进行算法优化过程以外的评估时(如分析、可视化等),请将
need_count设置为False,避免影响算法的优化进程。框架会自动:
- 计算使用的评估次数
- 更新环境时间
- 触发环境变化 用户无需手动管理这些过程。
2. 抽象方法
_evaluate_objectives(X, t): 计算目标函数值- 参数:
X: ndarray,决策变量矩阵t: int,时间步
- 返回: ndarray,目标函数值,形状:[n_samples, n_obj]
- 参数:
_evaluate_constraints(X, t): 计算约束值- 参数:
X: ndarray,决策变量矩阵t: int,时间步
- 返回: ndarray,约束值,形状:[n_samples, n_con]
- 参数:
注意
在搜索算法中,不要直接调用 _evaluate_objectives 和 _evaluate_constraints 方法,而应该使用 evaluate 方法。直接调用这些方法会导致:
- 评估次数未被正确计数
- 环境变化未被正确触发
- 可能影响算法的公平性比较
3. Pareto 前沿相关
get_pareto_front(t=None): 获取指定时间步的 Pareto 前沿- 参数:
t: int,时间步(默认使用当前时间步) - 返回: ndarray,Pareto 前沿点集
- 参数:
get_pareto_set(t=None): 获取指定时间步的 Pareto 解集- 参数:
t: int,时间步(默认使用当前时间步) - 返回: ndarray,Pareto 解集
- 参数:
4. 其他方法
get_bounds(): 获取决策变量边界- 返回: tuple,包含下界和上界的元组 (xl, xu)
get_objective_constraints(t=None): 获取目标空间可视化约束- 返回: list,描述轴向边界、不可行区间或圆形障碍
- 默认返回空列表,不影响无约束问题
get_nondominate(f): 获取非支配解集- 参数:
f: list,目标函数值列表 - 返回: ndarray,非支配解集
- 参数:
is_ended(): 判断优化是否结束- 返回: bool,是否结束
reset(): 重置问题状态- 功能: 重置时间步和评估次数
使用示例
python
# 创建问题实例
problem = DP1(decision_num=10, n_obj=2, n_con=0, n=10, tau=10,
solution_num=100, total_evaluate_time=30, label="DP1")
# 评估解
X = np.random.random((10, 10)) # 10个解,每个解10维
F, G = problem.evaluate(X)
# 获取Pareto前沿
pf = problem.get_pareto_front()
# 获取决策变量边界
xl, xu = problem.get_bounds()如何实现自己的问题
请参考自定义问题章节,了解如何基于 Problem 类实现自己的优化问题。
