TridentOpt:多目标优化引擎或求解器

来源:互联网 发布:apache服务器下载 编辑:程序博客网 时间:2024/05/18 03:27

抽象

描述了使用混合遗传算法 - 多代理系统的新的通用多目标优化引擎。不同于传统的多目标方法,所提出的方法将问题转化为模糊规划等价物,其中包括模糊目标和约束条件。所提出的方法然后对目标函数和约束进行模糊集操作,将信息组合成单个目标和单个约束。这个单一的目标和单一的约束,然后用于排序模糊帕累托组和梳理劣质的解决方案。

关键词:多目标优化,遗传算法,多Agent系统,模糊规划,开源,优化求解器

我介绍

近年来,混合进化算法的研究取得了很大的进展。混合遗传算法 - 多智能体系统(HGA-MAS)[1] [2] [10]的引入证明了通过添加多个代理个体变量的兴趣代理,可以大大加快遗传算法的收敛速度。收敛速度比传统的遗传算法快几个数量级[1](请参阅所附参考文献)。这是因为多智能体系统为遗传算法的各个染色体提供了局部爬山能力。

II HGA-MAS框架

在提出的HGA-MAS中,人口包含染色体(或候选设计)的集合。应该指出,染色体是真正的编码,而不是二元的。每个染色体都含有自己的模型评估器,能够根据目标函数和约束条件分析染色体。通过拥有自己的模型评估器,这直接支持优化内核中的多线程并行。每个染色体也有一组设计代理,代表了染色体设计描述中每个变量的兴趣。所提出的系统遵循图1中的示意图。

图1:HGA-MAS原理图

在每代HGA-MAS中,求解器执行以下操作:

  • 执行设计代理改进重复N次(用户设置)
  • 执行遗传算法运算(交叉,变异)
  • 将人口注入Pareto集
  • 重新规范和评估帕雷托集合和人口
  • 修饰帕累托集

设计代理改进会话允许每个设计代理根据自己的兴趣来改进候选设计。他们将设计更改请求提交给模型评估者,模型评估者接受更改或拒绝这些更改。每个设计代理都会轮流改进设计,并且这个过程被重复N次,以便在破坏性遗传算法操作发生之前给设计人员时间来改进候选设计。对于遗传算法阶段,应该注意的是,精英保护被赋予具有最高目标函数的染色体(更多的将在下面的章节中讨论)。进行一些交叉(尾部交换)和变异操作。操作次数是人口规模的函数。

三,文学评论

本节将从所提出的系统的角度讨论多目标优化(MOO)的现状。在MOO中,科学家正试图选择一个解决方案或一组解决方案来优化有时冲突的目标函数受约束。通常在这些情况下,没有一个单一的解决方案,而是一套同样出色的解决方案,分布在所谓的帕累托前线。有时,但并非总是,有一个帕累托最优解决方案,提供帕累托前沿输入变量的最佳平衡。(1)中给出了典型MOO的数学定义。

在处理多重目标函数方面,已经有了一些方法。一种这样的方法被称为加权和方法或标量化。在这个方法中,每个f i(x)乘以一个标量值?一世并将各个目标函数直接归结为一个长目标函数[8]。提出的方法有类似的目标,减少方程的数量正在进行,但作者使用模糊集来实现这一目标。另一个相关研究领域是遗传算法对候选解决方案(设计)进行非支配排序的领域[9]。这种方法的重点是提供一个鲁棒的,广泛的,均匀分布的Pareto Front,并根据它们的目标函数对候选方案进行成对排序。这种成对排序将解决方案分为主导,非主导或劣势。从那里,科学家选择最适合他们需求的解决方案。所提出的方法,而是利用模糊排序来解决方案。

在模糊规划领域,已经努力将目标函数和/或约束转换为模糊效用偏好函数[3] [11] [12] [15]。这种努力已经产生了作为集合[3]的多个目标的实现,并且作为产生偏好表面的个体模糊函数[15]。这两种方法都有其优点,即减少数据(集合)和提供软计算目标(表面)。为了本研究的目的,作者选择遵循Buckley [3]中概述的路径,但是在本研究中进行的模糊集合操作略有不同,将在下一节详细介绍。

四,模糊规划

模糊规划作为优化的一种方法,将现有的目标和约束条件的数学表达式转化为模糊偏好函数[3]。这是最好的例子。举例来说,采取X 1的简单约束<= 5。变换约束看起来像图2中的模糊效用偏好函数。小于或等于5,模糊约束完全满足1.0的效用。这会随着约束被违反而下降,直到它保持0.05的不满意值。在模糊公用事业中,完全不满足的约束是一个非零的小数。原因是0效用意味着完全不可行。不幸的是,以完全不可行的值进行集合运算会丢失乘法集合推理中的所有信息,从而使得代理程序的决策引擎无法有效改进临时处于搜索空间不可行区域的解决方案。

图2:示例模糊约束 - 小于或等于

目标函数与约束类似,也可以转化为模糊效用函数。这是通过将帕累托当前下限和上限转换为线性模糊效用偏好函数的过程来完成的。这个例子也是最好的例子。假设我们有目标函数max f(x)= x 1 + x 2 ^ 2,当前Pareto集合的候选解有一个目标函数值范围[4.3 ... 15.7],那么模糊效用将如图3重要的是要注意,在每一代人中,各个目标函数的范围都会发生变化,这就是为什么在每一代人结束时,效用函数都是根据当前的范围重新归一化的,并且帕累托集被采用。

图3:示例模糊目标函数 - 最大化F(x)

将其扩展到多目标优化就像对模糊化的目标函数执行集合操作一样简单。例如:

i(x)是f i(x)的模糊效用函数,MIN是最小集合算子。我们正在最大化模糊效用函数的最小值。就模糊集数学而言,这与AND操作者是一样的所提出的系统执行MINAVG操作员所设置的模糊目标函数。这与加权和多目标方法不同,加权和多目标方法使用具有总和的比例因子,而不是设定操作来组合和减少目标函数的数目。[8]

在(4)中使用集合运算符会给客观效用的最小值和平均值带来上行压力。这在有不满意的不愉快目标函数的情况下会很有用。普通运营商对整个集团施加压力。类似地,将相同的运算符应用于约束集以将集合卷起到单个约束实用程序中。帕累托集合中的一代重整化步骤是一个关键的操作,因为它允许最新的候选解决方案的图像以及它们如何相互比较。模糊排序的目的是提供候选解的相对适合度,而不是一些绝对值。这与遗传算法的传统非支配排序方法不同[9]。

V示例问题

为了举例,下面的问题的目标函数的数量限制为2,所以可以绘制传统的帕累托前沿并且可以对模糊帕累托集进行比较。这个例子的问题有两个变量,两个目标函数和一个非凸的Pareto Front [16]。优化如下:

即使搜索空间是非凸的,HGA-MAS找到了帕累托最优解。图4显示映射到目标函数实用程序的帕累托色彩。Equi-utility带可以很容易地被看作是从帕累托最优解出来的。

图4:示例问题帕累托正面模糊效用

图5:示例问题十大设计

七,理论部分总结

混合遗传算法 - 多代理系统和模糊规划的结合产生了一个可以简化多目标优化的求解器。通过将传统的优化问题转化为模糊规划的形式,科学家可以通过设定操作将目标函数和约束条件减少到单个元素。这大大简化了问题的实际优化。另外,可以毫不费力地混合最小化,最大化和目标寻求目标函数。在每个示例问题中,求解器能够找到100代的帕累托最优解。这包括凸和非凸问题。这种类型的求解器在处理整数规划问题(如bin packing [2])方面也是成功的。

八TridentOpt代码手册

现在已经讨论了TridentOpt如何工作的理论,需要详细讨论代码库。GUI是用QT 5.8编写的,所以你需要安装它的开源版本。还应该提到的是,TridentOptCore从序列化到随机数生成的所有事情都大量使用了HPC模板库。

在对象层次结构的顶部是TOptPopulationTOptPopulation有两个集合TOptChromosomes,候选设计的活动人口和帕累托设置。每个人TOptChromosome都有必要的信息来定义正在解决的问题。TOptChromosome具有的集合TOptObjective,集合TOptConstraint,集合TOptAgentTOptModel每一代求解者TOptPopulation都要经历以下几个步骤:

void TOptPopulation::ImprovePopulation(void)       {              int numChromo, numPareto;              numChromo = m_arrChromosomes.size();              //Update the Utility of the population              this->UpdatePopulationUtilities();              this->UpdateTopTenElite();              //Design agents first              for (int m = 0; ((m < m_intNumDesignCycle) && (m_blnIsRunning == true)); m++)              {                     if (m_blnMultiThreaded)                     {                           this->ImproveDesignAgentsMT();                     }                     else                     {                           this->ImproveDesignAgentsST();                     }             }              //Genetic Algorithm Operations Second              this->ImproveGeneticAlgorithm();              //Update the Utility of the population              this->UpdatePopulationUtilities();              this->UpdateTopTenElite();              //              //put the current population in the pareto front for grooming              for (int m = 0; m < numChromo; m++)              {                     numPareto = m_arrParetoSet.size();                     TOptChromosome * ptrCurr = m_arrChromosomes.at(m);                     bool blnAlreadyThere = false;                     for (int n = 0; n < numPareto; n++)                     {                           TOptChromosome * ptrParetoCurr = m_arrParetoSet.at(n);                           m_sngEpsilon = 0.001f;                           bool blnTest = ptrParetoCurr->IsChromoEqual(ptrCurr, m_sngEpsilon);                           if (blnTest == true)                           {                                  blnAlreadyThere = true;                                  break;                           }                     }                     if (blnAlreadyThere == false)                     {//then chromosome not already in pareto.                           //put it in the pareto for sorting                           TOptChromosome * ptrNew = new TOptChromosome();                           *ptrNew = *ptrCurr;                           ptrNew->Set_ptrEvaluator(m_ptrPopEvaluator);                           ptrNew->Set_ptrParent(this);                           m_arrParetoSet.push_back(ptrNew);                     }              }//end loop through population              //now that we have put new solutions in groom the front for bad solutions              this->GroomParetoFront(false);              this->SaveParetoSetDump();              //now sort the population              std::sort(m_arrChromosomes.m_vect.begin(), m_arrChromosomes.m_vect.end(),                  SortChromosomeDescending);              //this->SortChromosomes(&m_arrChromosomes);              //randomize the worst              if (numChromo >= 10)              {                     int intReseed = round(numChromo * 0.1f);                     for (int k = numChromo - 1; k >= numChromo - 1 - intReseed; k--)                     {                           if ((k >= 0) && (k < numChromo))                           {                                   if (m_arrChromosomes.at(k)->Get_blnEliteChromosome() == false)                                  {                                         m_arrChromosomes.at(k)->RandomizeChromosome();                                  }                                  else                                  {                                         int z = 10;//should never get here                                  }                           }                     }              }              else              {                     //population not big enough, just reseed the last one                     m_arrChromosomes.at(numChromo - 1)->RandomizeChromosome();              }              return;       }

为了向求解器引入新的问题,用户需要编写一个新的TOptModel子类。代码库提供了许多示例模型,包括文档文件夹中的技术文档中的所有示例模型。为了成功进行子类化TOptModel,只需要覆盖下面列出的虚拟函数:

 class HTL_DLLAPI TOptSineCos : public TOptModel { public:        //!Default ConstructorTOptSineCos();        //!Destructor        virtual ~TOptSineCos();        //!Copy ConstructorTOptSineCos(const TOptSineCos& rhs);        //PUBLIC OPERATOR OVERLOADSTOptSineCos & operator = (const TOptSineCos & rhs); public:        //!Construct the design Chromosome from which all copies will be made        virtual int CreateDesignChromosome(void); protected:        //Performs the actual calculation of the objective functions and        virtual int CalculateModel(void);const double m_PI = 3.14159265359f; };//end class

CreateDesignChromosome函数为问题构建设计染色体。这就是TOptChromosome所有其他染色体将从中复制的碳TOptPopulation你必须建立TOptObjectivesTOptConstraints以及TOptAgents您的问题(变量)。使用提供的代码示例成功实现。CalculateModel是你真正计算你的优化问题的数学模型的地方。这是肉的肉TOptModel我们来看看TOptSineCos模型函数。

double phi1(double s1, double s2){   return ((1.0 / 2.0) * sin(s1)) - (2 * cos(s1)) + sin(s2) - ((3.0 / 2.0) * cos(s2));}double phi2(double s1, double s2){   return ((3.0 / 2.0) * sin(s1)) - (cos(s1)) + (2.0*sin(s2)) - ((1.0 / 2.0) * cos(s2));}   int TOptSineCos::CalculateModel()   {   double s1, s2, J1, J2;   //get the inputs   s1 = m_arrVars.at(0);   s2 = m_arrVars.at(1);   //perform the calculations   J1 = 1.0f + pow(phi1(1.0, 2.0) - phi1(s1, s2), 2) + pow(phi2(1.0, 2.0) - phi2(s1, s2), 2);   J2 = pow(s1 + 3.0, 2) + pow(s2 + 1.0, 2);   //now copy back to the arrays   m_arrObjs.at(0) =  J1;//F1   m_arrObjs.at(1) = J2;//F2   //resize the constraints   m_arrConsts.at(0) = s1;//X1 <= 10   m_arrConsts.at(1) = s1;//X1 >= 0   m_arrConsts.at(2) = s2;//X2 <= 20   m_arrConsts.at(3) = s2;//X2 >= 0   return 1;   }

读者将会注意到,数学就是前面在例子问题中提到的公式5中概述的公式。流程很简单。导入变量,计算目标和约束,并将这些值返回给容器。m_arrVars是变量的容器,m_arrObjs是目标m_arrConsts的容器,是约束值的容器。只要这些输入和输出得到满足,TridentOpt引擎就会处理剩下的细节。

另一个细节。为了让你的模型被加载到系统中,它必须被注册TOptModelFactory这由头文件中的以下语句完成。

//OBJECT FACTORY REGISTRATION CODEstatic bool blnTOptSineCos_Registered = HTL::GetBaseFactoryPtr()->Register<TOptSineCos>("TOptSineCos");static bool blnTOptSineCos_Registered2 = TridentOptCore::GetModelFactoryPtr()->Register<TOptSineCos>("TOptSineCos");

参考

[1] Daniels A.和MG Parsons,“一种基于代理的空间分配总体布置方法”,第九届国际海洋设计会议论文集,密歇根州安阿伯市,2006年5月。

[2] Daniels A.和MG Parsons,“开发混合智能体 - 遗传算法对总体布置的方法”,COMPIT 2007年论文集,意大利科尔托纳,2007年4月。  接受船舶技术研究杂志,2008年。

[3] Buckley JJ,“Fuzzy Programming and the Pareto Optimal Set”,Fuzzy Sets and Systems,Volume 10,page 57-63。1983年。

[4]未知作者,modeFrontier,Inc.“一个简单的多目标优化问题”,

http://www.math.unipd.it/~marcuzzi/DIDATTICA/LEZ&ESE_PIAI_Matematica/3_cones.pdf

欲了解更多信息,请访问:www.esteco.com或发送电子邮件至:modeFRONTIER@esteco.com

[5]未知的作者,“解决使用演化动态加权聚合的三目标优化问题:结果和分析”, 萨里大学计算系,萨里郡,吉尔福德,GU2 7XH,英国

www.soft-computing.de/moo3D.pdf

[6] R. Viennet,C Fonteix和I. Marc。“Multi-criteria optimization using genetic algorithms for determining a pareto set”,International Journal of Systems Science,Volume 27(2),第255-260页,1996。

[7]何振安,Gary G. Yen和张军,“多目标进化算法的模糊Pareto最优性”,IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION,卷18,NO。2,2014年4月

[8]桑托斯·席尔瓦·卡洛斯A.“多目标优化概述”,葡萄牙麻省理工学院

https://fenix.tecnico.ulisboa.pt/downloadFile/3779575589383/Class8

[9] Fonseca Carlos M.和Peter J. Fleming“多目标优化的遗传算法:配方,讨论和概括”,  Genetic Algorithms:Proceedings of the Fifth International Conference(S.Forrest,ed。),San Mateo,CA :Morgan Kaufmann,1993年7月。

[10] Adnan Acan,“GAACO:A GA + ACO Hybrid for Faster and Better Search Capability”,International Workshop on Ant Algorithms,第300-301页。ANTS 2002

[11] Koppen Mario,Raul Vicente-Garcia和Bertram Nickolay“Fuzzy-Pareto-Dominance and its Application in Evolutionary Multi-Objective Optimization”,第三届国际会议,EMO 2005,墨西哥瓜纳华托,2005年3月9 - 11日。 。

[12] Erfani Tohid和Sergei V.Uutuzhnikov,第五十一届AIAA / ASME / ASCE / AHS / ASC结构,结构动力学和材料会议奥兰多,“处理不确定性和发现鲁棒的帕累托前沿在多目标优化使用模糊集理论”佛罗里达。2010年4月。

[13] Chase N.,M. Rademacher,E. Goodman“多目标优化方法的基准研究”

https://www.researchgate.net/publication/242077047_A_Benchmark_Study_of_Multi-Objective_Optimization_Methods

[14] Deb Kalyanmoy,Samir Agrawal,Amrit Pratap和T Meyarivan,“多目标优化的快速精英非支配排序遗传算法:NSGA-II”,自然并行问题解决国际会议,PPSN 2000:Parallel解决自然问题PPSN VI pp 849-858。

[15] Ghosh Debdas,Debjani Chakraborty“一种获得模糊多准则二次规划问题的模糊Pareto集的方法”,“模糊数学与信息学年鉴”,2013年。

[16] Lopeza RafaelH.,TGRittob,RubensSampaioc和JoEduardoS.deCursid,“一个新的多目标优化算法的非凸Pareto前沿和目标函数”,MecánicaComputacional第XXXII卷,第669-679页,阿根廷门多萨,19-22 2013年11月。

原创粉丝点击