Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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 使用差分进化的函数值_Java_Chess_Evolutionary Algorithm_Differential Evolution - Fatal编程技术网

Java 使用差分进化的函数值

Java 使用差分进化的函数值,java,chess,evolutionary-algorithm,differential-evolution,Java,Chess,Evolutionary Algorithm,Differential Evolution,如何使用差分进化来找到函数f(x)=-x(x+1)从-500到500的最大值?我需要这个来制作一个国际象棋程序,我已经开始研究差异进化,但仍然发现它很难理解,更不用说用于程序了。有谁能帮我简单介绍一下这个算法,并可能为这样一个程序提供一些伪代码示例吗?首先,很抱歉回复太晚 我敢打赌,你不会知道函数的导数,这就是为什么你想使用微分进化算法,而不是像牛顿-拉斐逊法那样 我发现了一个很好的链接,可以直接解释差异进化 在第一页上,有一节解释了算法: 让每一代点由n个点组成,每个点中有j项 使用大小j初始

如何使用差分进化来找到函数f(x)=-x(x+1)从-500到500的最大值?我需要这个来制作一个国际象棋程序,我已经开始研究差异进化,但仍然发现它很难理解,更不用说用于程序了。有谁能帮我简单介绍一下这个算法,并可能为这样一个程序提供一些伪代码示例吗?

首先,很抱歉回复太晚

我敢打赌,你不会知道函数的导数,这就是为什么你想使用微分进化算法,而不是像牛顿-拉斐逊法那样

我发现了一个很好的链接,可以直接解释差异进化

在第一页上,有一节解释了算法:

让每一代点由n个点组成,每个点中有j项

使用大小
j
初始化数组。添加一个从
-500到500的不同随机x值的数字
j
,您现在正在考虑的间隔。理想情况下,您将知道最大值的位置,并且您将使
x
值更可能位于该位置

对于每个j,从点x集中均匀地随机选择两个点yj,1和yj,2 (m) . 构造一个候选点cj=x (m) j+α(yj,1− yj,2)。基本上,这两个y值涉及 选择一个随机的方向和距离,然后将该随机方向和距离相加,即可找到候选方向 方向和距离(按α缩放)到当前值

嗯。。。这有点复杂。遍历在上一步中创建的数组。对于每个
x
值,选择两个随机索引(
yj1
yj2
)。用
cx=α(yj1)构造一个候选
x
值− yj2)
,在这里您可以选择您的
α
。您可以尝试使用不同的alpha值进行实验

检查哪一个更大,候选值还是
j
处的x值。如果候选值较大,则将其替换为
j
处的
x

执行所有这些操作,直到数组中的所有值都或多或少相似。 Tahdah,数组的任何值都将是最大值。为了减少随机性(或者可能这并不重要……),将它们平均起来

您对
about
方法的要求越严格,得到的近似值就越好,但所需的时间就越长


例如,我不明白为什么要使用差分进化,而不是
Math.abs(a-b)。你知道一阶导数是
-2x-1
,所以你可以这样找到临界点。然后你可以计算二阶导数,
-2
,它恰好是
-2
,这意味着图是向下凹的,这意味着你的临界点就是你的最大值。你的最大值将是
0=-2x-1
,或者
x=-1/2
。顺便说一句,我喜欢你的头像图标。我也不明白……但我的团队领导(这是一群朋友为了好玩而做的项目)希望我使用差异进化来找到答案。你能告诉我用那种方法怎么做吗?谢谢编辑:谢谢你的头像:非常感谢!这个回答非常好地解释了wekk的概念,并允许我查看代码以进一步理解。我还将注意研究牛顿-拉斐逊方法。您详细的演练帮助我轻松理解了如何解决此问题。@ProgramFun此程序中可能存在错误。当我检查数组值是否都相似时,我使用了“相似性的传递属性”。不存在这样的东西。我现在将编辑该程序,以增加其产生的价值的准确性。感谢您注意到这一点,并帮助我理解更好的工作程序。
public class DifferentialEvolution {

public static final double alpha = 0.001;

public static double evaluate(double x) {
    return -x*(x+1);
}

public static double max(int N) { // N is initial array size.

    double[] xs  = new double[N];

    for(int j = 0; j < N; j++) {
        xs[j] = Math.random()*1000.0 - 500.0; // Number from -500 to 500.
    }

    boolean done = false;
    while(!done) {
        for(int j = 0; j < N; j++) {
            double yj1 = xs[(int)(Math.random()*N)]; // This might include xs[j], but that shouldn't be a problem.
            double yj2 = xs[(int)(Math.random()*N)]; // It will only slow things down a bit.

            double cj = xs[j] + alpha*(yj1-yj2);

            if(evaluate(cj) > evaluate(xs[j])) {
                xs[j] = cj;
            }
        }

        double average = average(xs); // Edited

        done = true;
        for(int j = 0; j < N; j++) { // Edited
            if(!about(xs[j], average)) { // Edited
                done = false;
                break;
            }
        }

    }
    return average(xs);

}

public static double average(double[] values) {
    double sum = 0;
    for(int i = 0; i < values.length; i++) {
        sum += values[i];
    }

    return sum/values.length;

}

public static boolean about(double a, double b) {
    if(Math.abs(a - b) <= alpha /10000) { // This should work.
        return true;
    }
    return false;
}

public static void main(String[] args) {

    long t = System.currentTimeMillis();
    System.out.println(max(3));
    System.out.println("Time (Milliseconds): " + (System.currentTimeMillis() - t));

}