多维方案优化/预测的AI算法我有6个int参数,范围从0到100数字的总组合是100^6,每个组合给出大约100个结果.从-10000到100000或更多。输入数据示例:MySimulation(57,78,20,10,90,50)=300<-最佳结果MySimulation(50,80,10,90,35,8)=200MySimulation(4,55,40,99,40,50)=-50<-WorstResult结果越高,数字组合越好,我已经有了计算结果,我只需要AI找到一个更好的数字组合来得到更高的结果。输出数据示例:55、70、25、15、95、52<-假设这些数字组合是由AI选择的,并且在我的模拟中会给出400的结果注意:数字的顺序也很重要。如何在不重复所有100^6组合的情况下使用AI减少总的100^6组合以获得最佳结果?我计划在C#中使用Accord.NET(或者有更好的东西吗?),代码示例会很有帮助,因为我是AI的新手。欢迎来到多目标优化领域。这是我写论文的地方。这类问题有很多算法,但最著名的两个算法可能是NSGA-II和SPEA2。当然,你只有一个目标:无论你的评分函数是什么,yield。我认为多目标算法也有效,因为您不仅对单个解决方案感兴趣,而且对它们的数量感兴趣。我可以向您推荐http://jmetalnet.sourceforge.net/吗?这个想法是您生成包含跨越100^6个可能解决方案范围的输入的随机向量群体。这些种群将发生变异并相互交配以产生新的解决方案,并从这些新种群中选择它们,以便选择更优选的解决方案进行保留(并在进化中生存)。在许多世界中,您可能面临比较不同解决方案的适用性的挑战。但在你的单一目标世界中,比较适合性很容易:你只需要决定你想要更高的数字还是更低的数字。看起来你想长高。概述创建随机的解决方案群体。在您的解决方案中随机突变/交叉。计算每个人的健康状况并进行排序。下采样回到最优解的初始种群大小。重复步骤2-4【直到收敛:直到平均健康>阈值?]最终生成输出。结果:这是一个糟糕的分析,值得注意的是,您可以通过在每个参数级别对(比如)20次运行的结果进行平均来做得更好。很明显,突变率应该保持在较低水平,显然,较大的种群规模会有所帮助(达到收敛点)。结果被格式化为之前、之后的平均分数,最大值为600PopSize=100,NumGens=50,MutRate=0.2,CrossRate=0.8295.23,542.12565PopSize=1000,NumGens=50,MutRate=0.2,CrossRate=0.8301.814,579.334PopSize=10000,NumGens=500,MutRate=0.2,CrossRate=0.8299.8901,588PopSize=1000,NumGens=0=0.8306.22,385.55码这段代码我用了20分钟就写完了,所以不代表优雅不牛逼.我希望这是有道理的。使用系统;使用System.Collections.Generic;使用系统诊断;使用System.Linq;namespacemoo_in_csharp{内部类Individual{publicint[]Decisions;公共双健身;私人int_numdecisions=6;//////默认构造函数。///publicIndividual(){Decisions=newint[_numdecisions];}//////用伙伴的决定替换前半部分的决定。//////publicvoidCrossover(Individualmate){intcrossoverPoint=_numdecisions/2;for(inti=0;i///计算a+b+c+d+e+f总和的简单适应度函数。///publicdoubleEvaluate(){Fitness=Decisions.Sum();returnFitness;}//////为其决策分配随机值。///publicvoidGenerate(){for(inti=0;i///随机改变选择决策。///publicvoidMutate(){for(inti=0;isolutions=newList();for(inti=0;ix.Evaluate()).Average();//遍历代数for(inti=0;i();对于(整数=0;例如x.Evaluate()).ToList();solutions=solutions.Take(populationSize).ToList();}//计算平均分varaverageScoreAfter=solutions.Select(x=>x.Evaluate()).Average();Debug.WriteLine(averageScoreBefore+","+averageScoreAfter);}}}附加说明您的运行时间将主要取决于您的健身得分函数对于简单的数学函数,此运行时间并不太难。显然,如果涉及到流程,您需要将评估次数保持在最低限度。这就是我在攻读博士学位期间所做的工作,并开发了一种名为GALE的新算法:对于许多评论中提到的此类问题以及BurnsCA的解决方案,您可以尝试Metaheuristic/StochasticLocalSearch算法。模拟退火和遗传算法就是例子,但还有更多。这种方法是否可行取决于你能多快计算出目标函数的变化,即评估解的质量和变化。如果模拟输出的属性使得微小的变化会显着改变结果,那么它可能会或可能不会比强制进行一些随机分配并采取最好的分配更好。你必须试验。这些算法本身的实现通常不是很复杂,我认为你甚至可以使用像NMath这样的库,例如看看http://www.centerspace.net/doc/NMath/user/simulated-annealing-85273.htm你的“目标函数”,你试图最大化(或最小化)的值是输出模拟。虽然算法本身的实现并不困难,但需要高效地实现算法的各个方面。您需要做的是定义一个邻域函数,即从一个解决方案(或您喜欢的状态)到另一个解决方案的方法。在您的情况下,可能会涉及BurnsCA建议的代码示例,这将是一个1-opt移动,因为您会随机为一个参数选择另一个值。如果1-opt没有足够快地显示改进,您也可以尝试2-opt或更多动作。接下来您需要的是一种评估运动效果的方法。换句话说,你当前的价值和你采取行动后的价值之间的目标函数差异是多少。如果可能,您将需要一种方法来评估移动,而不必每次都重新执行整个模拟。最天真的方法(通常称为下降)是随机移动到邻居解决方案,如果它找到更好的(在你的情况下更高的目标函数)值,将其作为新解决方案,并重复该步骤直到你找不到更多改进。这种方法的问题是您很快就会陷入局部最大值。模拟退火提供了一种尝试和避免这种情况的方法,它不仅选择改进,而且选择非改进动作,概率取决于当前“温度”,只需根据您定义的一些退火计划每次迭代减少变量。由于实现这些方法的关键不是整个算法本身(虽然它确实需要一些时间),所以在实现邻域和邻域评估功能时,我个人认为使用不会节省很多时间一些框架。如果这是一次性的事情,上述方法行不通,也可以考虑在几千台计算机上并行计算,得到最优解。例如AzureBatch或类似的服务。由于您可以在30分钟内测试50个mio组合(在没有并行化的一台机器上?),原则上可以提供20000个虚拟机并在30分钟内测试所有组合。您不需要机器学习框架来实现局部优化算法。//线性计算示例publicintCalculation(inta,intb,intc,intd,inte,intf){intresult=0;未检查{结果=(int)((double)a*Math.Tan((double)b??*Math.PI/((double)c+0.001)));结果+=d+e+f;}返回结果;}varrand=newRandom();//当前最知名的解集varbest=newint[6]{1,1,1,1,1,1};//最佳已知解集的分数intbestScore=int.MinValue;//循环变量intscore;varwork=newint[6];//适当循环。for(inti=0;i<500;i++){//复制最佳方案进行修改best.CopyTo(work,0);//更改最佳解决方案的参数之一work[rand.Next()%6]=rand.Next()%101;//使用修改后的解决方案计算新分数score=Calculation(work[0],work[1],work[2],work[3],work[4],work[5]);//只有当这个解决方案比其他任何解决方案都好时才保留它if(score>bestScore){work.CopyTo(best,0);bestScore=得分;}}上面的解决方案非常快,主要是因为迭代500次后计算函数很友好:int[6]{98,1,2,98,99,100}最好的解是{100,1,2,100,100,100}注意这个这个局部优化方法只适用于大多数线性问题。未显示,但您还希望看到不同的起始值,或者重复运行整个过程。爬山算法的维基百科页面上有一张漂亮的图片,显示了此方法试图做的事情的本质。以上就是《C#学习教程:多维解优化/预测的AI算法》的全部内容。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
