基准问题与自定义问题#
数值基准#
从 evomo.problems.numerical 导入具体问题:
问题族 |
公开类 |
参数与边界注意事项 |
|---|---|---|
ZDT |
|
决策维度参数是 |
DTLZ |
|
使用 |
WFG |
|
使用 |
MaF |
|
使用 |
LSMOP |
|
显式指定 |
数值问题通常返回形状为 (N, M) 的目标张量。与约束问题不同,不应假设每个数值问题
都提供 lb、ub;必要时按问题定义自行构造。
pf() 返回参考前沿或其采样点,用于结果分析。ref_num 不总是返回点数的严格上限或精确值,
应读取实际形状。某些参考前沿通过数值采样或附带数据构造,不应把全部 pf() 结果都称作
精确解析前沿。
约束基准#
evomo.problems.constrained 提供:
问题族 |
变体范围 |
|---|---|
LIRCMOP |
|
DASCMOP |
|
CTP |
|
MW |
|
FCP |
|
DOC |
|
SDC |
|
LSCM |
|
这些问题基于 evomo.problems.constrained.base.CMOP,提供维度 d、目标数 m 和
lb、ub。部分变体有固定维度,不能统一假设传入 d、m 就能改变问题。
其 evaluate 返回 (fitness, cv);完整用法见约束优化。
自定义批量问题#
继承 EvoX 的 Problem,实现一次评估整个种群的 evaluate。
下面同时最小化到两个中心的平方距离:
"""A batched, two-objective problem integrated with an EvoMO workflow."""
import torch
from evox.core import Problem
from evomo.algorithms import NSGA2
from evomo.workflows import UnifiedWorkflow
class TwoCenters(Problem):
def evaluate(self, population: torch.Tensor) -> torch.Tensor:
objective_a = population.square().sum(dim=1)
objective_b = (population - 1).square().sum(dim=1)
return torch.stack((objective_a, objective_b), dim=1)
def main():
device = "cuda" if torch.cuda.is_available() else "cpu"
torch.set_default_device(device)
torch.manual_seed(42)
algorithm = NSGA2(pop_size=100, n_objs=2, lb=torch.zeros(10), ub=torch.ones(10), device=device)
workflow = UnifiedWorkflow(algorithm, TwoCenters(), device=device)
workflow.init_step()
for _ in range(30):
workflow.step()
print(workflow.algorithm.fit)
if __name__ == "__main__":
main()
python docs/examples/custom_problem.py
返回张量的第一维必须对应输入候选解,第二维对应算法的 n_objs。
函数内使用输入张量衍生计算,避免将结果转换成 NumPy 或逐个解循环评估。
需要常量时在初始化阶段注册为 buffer,或使用输入张量的设备与 dtype 创建。
自定义约束问题可以返回 (fitness, cv),其中 cv 应为非负违反量,而不是未经转换的
原始约束函数。使用 UnifiedWorkflow 和支持约束选择的算法接入。