针对多个目标进行优化

计算科学 优化
2021-12-02 05:14:26

在这里优化两个模型,每个模型都有自己的一组参数和一个目标,但是两个模型都运行在难以计算的相同数据上,并且是基于两个模型的参数计算的。如何根据各自的目标同时优化两个模型?

这是我到目前为止所做的:

ObjectiveFunction( model1, model2, data ):
    simulationResult = VeryExpensiveCall( model1, model2, data )
    score1 = ComputeScore( model1, simulationResult )
    score2 = ComputeScore( model2, simulationResult )
    return score1 + score2

RunOptimization:
    genericOptimizer.SetMethod( "CRS2" )
    genericOptimizer.SetMinObjective( ObjectiveFunction )
    genericOptimizer.Optimize()

这种将单个分数相加以产生组合分数的解决方案存在一个问题:genericOptimizer可能会混淆哪些参数变化会影响分数并朝着错误的方向前进。

例如,假设在连续迭代之间model1.param[0]发生model2.param[2]了变化,导致score1减少但score2增加。优化器无法知道变化model1是否有益model2似乎知道模型是两个模型的笛卡尔积的优化器应该可以提高性能。

因此,问题是:如何利用模型的笛卡尔性质并针对每个目标进行优化?

1个回答

我认为你最好的选择是你的目标函数有一些魔力。如果我对您的理解正确,您希望确保优化器会减少总目标函数以及每个模拟的目标:因此重新定义您的目标以严厉惩罚任一目标的增加。也许您可以将其表述为:

J=Jold+α(J10J1i)3(J20J2i)3

在哪里J10J20是初始参数化时两次模拟的目标。明智地选择阿尔法,现在它将严厉惩罚任何一个的增加J1要么J2并且只会接受同时减少两者的参数。