有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

遗传算法求解迷宫的java适应度函数

我正在使用GA方法进行迷宫求解。每个基因组都有编码为chars('N','S','E','W')的方向,并且使用加权轮盘赌评估世代中的每个基因组的适合度和杂交

到目前为止,作业进行得很顺利,但我注意到我的适应度函数有一个怪癖,(我认为)给了我更长/更少的最优解

由于我的目标是在没有解决方案的情况下解决一个通用迷宫,因此我将我的适应度函数设置如下:(请忽略硬编码的开始和结束位置,这些位置将在以后变得通用…)

private static double calculateMazeScore(Genome genome) {

    int start_row = 1;
    int start_col = 0;
    int end_row = 12;
    int end_col = 8;

    MazePosition pos = new MazePosition(start_row, start_col);

    int penalty = 0;
    for (char gene : genome.geneString().toCharArray()) {
        int n, e, s, w;
        n = pos.getNeighborValueNeg1IfEdge(Direction.N);
        e = pos.getNeighborValueNeg1IfEdge(Direction.E);
        s = pos.getNeighborValueNeg1IfEdge(Direction.S);
        w = pos.getNeighborValueNeg1IfEdge(Direction.W);

//    System.out.printf("pos:[%d,%d] val:%d next:%s n:%d  s:%d  e:%d  w:%d \n", 
//                        pos.getRowIdx(), pos.getColumnIdx(), pos.getValue(), gene, n, s, e, w);

        if (gene == 'N') {
            if (n == 0 || n == 2 || n == 3) {
                pos = pos.getNeighbor(Direction.N);
                penalty -= 1.5;
            } else {
                penalty++;
            }
        } else if (gene == 'E') {
            if (e == 0 || e == 2 || e == 3) {
                pos = pos.getNeighbor(Direction.E);
                penalty -= 1.5;
            } else {
                penalty++;
            }
        } else if (gene == 'S') {
            if (s == 0 || s == 2 || s == 3) {
                pos = pos.getNeighbor(Direction.S);
                penalty -= 1.5;
            } else {
                penalty++;
            }
        } else if (gene == 'W') {
            if (w == 0 || w == 2 || w == 3) {
                pos = pos.getNeighbor(Direction.W);
                penalty -= 1.5;
            }
        }
    }

    double x1 = pos.getRowIdx();
    double y1 = pos.getColumnIdx();

    double distFromStart = Math.sqrt(Math.pow(start_row - x1, 2) + Math.pow(start_col - y1, 2));
    double distFromGoal = Math.sqrt(Math.pow(end_row - x1, 2) + Math.pow(end_col - y1, 2));

    double mazeScore = distFromStart - distFromGoal - penalty;
    if (mazeScore <= 0)
        mazeScore = 0;

    return mazeScore;
}

当我通过迷宫评估基因组串时,当基因组“撞”到墙上时,我会增加一个惩罚计数器,当它没有撞到墙上时,我会减少计数器。基因组完成后,我会进行距离计算,以找到从开始到结束的距离。最后的体能测试是从起点到终点的距离-点球

这实际上非常有效,基因组非常接近尾声,不会撞到太多的墙。。。但我想我太刺激了在迷宫里徘徊。我得到了很多人为增加分数的“wewesns”。。。过去10代人中最健康的一代人在走到出口前在迷宫中徘徊了很长时间,有时他们没有走完他们的路,因为他们来回花了太多的时间

我现在的一切都很好。。。但不是很好。我很想得到一些关于改善我的健身功能的建议。稍后我还会尝试不同的交叉和选择过程。提前谢谢


共 (0) 个答案