Skip to content

问题(Problem)类

问题类是优化问题的基类,提供了问题定义和评估的基本框架。

主要属性

属性名类型说明
decision_numint决策变量维度
n_objint目标函数数量
n_conint约束条件数量
xlndarray决策变量下界,形状:[decision_num]
xundarray决策变量上界,形状:[decision_num]
evaluate_timeint当前评估次数
solution_numint用于优化问题的个体数量
total_change_timeint总的环境变化次数

动态属性

属性名类型说明
nint环境变化强度
tauint每 tau 代变化一次
tint当前时间步
labelstr问题标签

环境变化控制

框架通过评估次数来控制环境变化,确保算法之间的公平性:

  1. 环境变化触发条件:

    • tau * solution_num 次评估触发一次环境变化
    • 例如:当 tau=10, solution_num=100 时,每 1000 次评估触发一次变化
  2. 总评估次数控制:

    • 总评估次数 = tau * solution_num * total_change_time
    • 例如:当 tau=10, solution_num=100, total_change_time=30 时,总评估次数为 30000 次
  3. 公平性保证:

    • 响应策略使用的评估次数会影响搜索算法的可用评估次数
    • 所有算法在相同总评估次数下进行优化,确保公平比较

核心方法

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)

重要提示

  1. 当进行算法优化过程以外的评估时(如分析、可视化等),请将 need_count 设置为 False,避免影响算法的优化进程。

  2. 框架会自动:

    • 计算使用的评估次数
    • 更新环境时间
    • 触发环境变化 用户无需手动管理这些过程。

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 类实现自己的优化问题。