代理碰撞避免java

人工智能 多代理系统
2021-10-22 08:53:25

我正在处理一个项目,它是一个基于代理的 Java 行人模拟,它在 JavaFX 的帮助下进行动画处理。我试图阅读所有的社会力量模型论文,但我对这些文章的理解是没有的。因此,我尝试了一种自己的方法,但在一次又一次失败后被丢弃了。

我的方法是每个代理计算其周围环境并首先计算到场上每个代理的距离,如果该距离低于一个常数,那么代理计算该代理的角度太接近它并相应地移动到计算的角度。

这种方法对我不起作用,因为“回避代码”效率不够高,而且代理人见面时不知道去哪里,只是呆在原地。

我正在寻求有关如何以更好的方式解决此问题的指导。

double[] check(Vector<Pedestrian> peds, Pedestrian p1){
for (Pedestrian p : peds){
    if (p.getPedestrianId() != this.id){
        double distance = IPedestrian.distance_formula(getTranslateX(), getTranslateY(), p.getTranslateX(), p.getTranslateY());
        if (distance <= DANGER){
            System.out.println("DANGER");
            return IPedestrian.angle(getTranslateX(), getTranslateY(), p.getTranslateX(), p.getTranslateY(), p1);
        }
    }
}
return new double[] {SPEED, 0};

}

public void move(Vector<Pedestrian> peds, Pedestrian p) {
double[] new_steps = this.check(peds, p);
if (side == SideChooser.Left){
    setTranslateX(getTranslateX() + new_steps[0]);
    setTranslateY(getTranslateY() + new_steps[1]);
} else {
    setTranslateX(getTranslateX() - new_steps[0]);
    setTranslateY(getTranslateY() - new_steps[1]);
}

}

数学公式:

static double distance_formula(double thisX, double thisY, double otherX, double otherY){
return Math.sqrt(Math.pow(otherX - thisX, 2) + Math.pow(otherY - thisY, 2));

}

static double[] angle(double x1, double y1, double x2, double y2, Pedestrian p){
double angle = Math.toDegrees(Math.atan2(y2-y1, x2-x1));
angle += Math.ceil(-angle/360) * 360;

//double angle = Math.toDegrees(Math.atan2(y2-y1, x2-x1));

if (p.getSideChoosen() == SideChooser.Left){//if the pedestrian is from the left side
    if (angle < 45 || angle > 315)//front
        return new double[]{-SPEED/5, 0};

    else if (angle >= 135 || angle <= 225 ) //back
        return new double[]{SPEED*1.4, 0};

    else if (angle >= 45 || angle <= 90)//North-East
        return new double[]{0, SPEED};

    else if (angle > 90 || angle <= 135) //North-West
        return new double[]{SPEED*1.2 , SPEED};

    else if (angle >= 270 || angle <= 315) //South-East
        return new double[]{0, -SPEED};

    else if (angle > 225 || angle <= 270) //South-West
        return new double[]{SPEED*1.2, -SPEED};

    else
        return new double[]{SPEED, 0};
} else {
    if (angle < 45 || angle > 315)//back
        return new double[]{SPEED*1.4, 0};

    else if (angle >= 135 || angle <= 225 ) //front
        return new double[]{-SPEED/5, 0};

    else if (angle >= 45 || angle <= 90)//North-West
        return new double[]{SPEED*1.2, -SPEED};

    else if (angle > 90 || angle <= 135) //North-East
        return new double[]{0 , -SPEED};

    else if (angle >= 270 || angle <= 315) //South-West
        return new double[]{SPEED*1.2, SPEED};

    else if (angle > 225 || angle <= 270) //South-East
        return new double[]{0, SPEED};

    else
        return new double[]{SPEED, 0};
}

}

1个回答

您尝试做的一个非常有效的方法是速度障碍

假设两个智能体使用恒速运动矢量,速度障碍物模拟一个几何区域,如果智能体 1 的速度矢量的端点落入该几何区域,它将与智能体 2 发生碰撞(反之亦然)。因此,您可以预测哪些速度向量会导致代理之间发生碰撞,并选择不发生碰撞的速度向量。

这里有很好的例子和教程:http: //gamma.cs.unc.edu/RVO/