Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在进化算法中初始化染色体以求解实数变量上的LP/ILP或一般COS?_Java_Math_Optimization_Mathematical Optimization_Evolutionary Algorithm - Fatal编程技术网

Java 如何在进化算法中初始化染色体以求解实数变量上的LP/ILP或一般COS?

Java 如何在进化算法中初始化染色体以求解实数变量上的LP/ILP或一般COS?,java,math,optimization,mathematical-optimization,evolutionary-algorithm,Java,Math,Optimization,Mathematical Optimization,Evolutionary Algorithm,我正在研究一个用于优化问题的Java框架。到目前为止,我已经实现了,因此我可以处理线性问题(LPs)和整数线性问题(ILP)。现在我想提供使用进化算法作为解算器的可能性,以便能够处理具有非线性约束或非线性目标函数的问题。通常用于处理约束优化问题(COS)。我找到了遗传算法的基础,并开始实现遗传算法 我的算法中的染色体代表了优化问题的解决方案,即它由一个map变量->数字组成。现在,在第一个群体中,我想随机创建一个解决方案,并从那里开始发展。因此,我需要找到变量的随机值。我可以访问变量的下限和上限

我正在研究一个用于优化问题的Java框架。到目前为止,我已经实现了,因此我可以处理线性问题(LPs)和整数线性问题(ILP)。现在我想提供使用进化算法作为解算器的可能性,以便能够处理具有非线性约束或非线性目标函数的问题。通常用于处理约束优化问题(COS)。我找到了遗传算法的基础,并开始实现遗传算法

我的算法中的染色体代表了优化问题的解决方案,即它由一个map
变量->数字组成。现在,在第一个群体中,我想随机创建一个解决方案,并从那里开始发展。因此,我需要找到变量的随机值。我可以访问变量的下限和上限,以及它的域是否为整数和实数。因此,我以以下方式启动变量:

//Create a Random Number generator
Random generator = new Random();

//Create a new Map to store the variables and their assigned values
Map<String,Number> newRepresentation = new HashMap<String,Number>();

//Iterate over all variables from the problem
for (Entry<String,Variable> entry : problem.getVariables().entrySet()) {
    Variable variable = entry.getValue();
    Number uB = variable.getUpperBound();
    Number lB = variable.getLowerBound();
    //Create a random value for this variable
    Number randomValue = (generator.nextDouble() * (uB.doubleValue() - lB.doubleValue())) + lB.doubleValue();
    //If the variable has Integers as its domain, make the random value an Integer
    if (variable.getType() == OptVarType.INTEGER) randomValue = randomValue.intValue();
    newRepresentation.put(variable.getName(), randomValue);
}
那么最优解是
x=6,y=4
。但是变量由我的EA初始化为:

A new Population has been initiated: {y=1430866067, x=1616622921}
A new Population has been initiated: {y=1483081480, x=1389387196}
A new Population has been initiated: {y=242558338, x=376547119}
A new Population has been initiated: {y=1861689859, x=959676986}
...
该值永远不会接近最优解所在的下限。因此,即使经过几分钟的搜索,我的EA也无法找到至少接近最佳解决方案的解决方案


问题:如何修改染色体的起始,使值均匀分布在整个搜索空间中?

首先,我考虑了在转换后整数值是否仍然均匀分布

例如:

您希望创建一个介于5和10之间的整数。因此,您在该区间内创建了一个均匀分布的double(这对您的代码很好),它位于[5,5.5]中的可能性等于它位于[5.5,6],[6,6.5]中的可能性,[9.5,10)。现在,要将其转换为整数,您需要对值进行下限处理,将我描述的两个区间映射到每个可能的整数值。因此,我觉得这很好

我也做了一个简单的测试,它对我来说很好。所以我只看到了两个可能的原因:

  • 随机数生成器已损坏。(如果使用标准JDK,则不太可能出现这种情况)
  • 您执行的试验太少,无法获得较低的启动值-间隔相当大

  • 编辑:我已经查看了Number类的文档。到integer的转换可以自由使用截断或舍入。如果它使用舍入,则随机整数值不再均匀分布,因此您应该明确设置双精度值的下限。

    您确定这里的随机值有错吗?似乎您需要这样做使用有关预期解决方案的知识初始化染色体。从某种意义上说,这是“作弊”。也许GA只需要运行更长的时间,或者适应度函数对坏解的惩罚不够……你好,阿德里安,事实上,我认为我必须让EA运行更长的时间,并尝试更多地惩罚坏解。此外,我可能需要更大的时间为了处理巨大的搜索空间,我将进行变异。感谢您的评论,我将着手解决这些问题。我已经对我的代码进行了更多的测试,事实上,您的第二点是至关重要的。搜索间隔实在太大了。执行10^8个随机选择的值,我不会得到一个小于200的值。因此,我需要我必须重新思考我的方法,让用户输入更多关于这个问题的知识。
    A new Population has been initiated: {y=1430866067, x=1616622921}
    A new Population has been initiated: {y=1483081480, x=1389387196}
    A new Population has been initiated: {y=242558338, x=376547119}
    A new Population has been initiated: {y=1861689859, x=959676986}
    ...