如何在Java中建模PDDL案例

如何在Java中建模PDDL案例,java,pddl,Java,Pddl,我试图将一个普通的PDDL案例(如后勤示例)建模为一种不同的编程语言(java)。我这样做是为了了解使用PDDL的优点或缺点 这是PDDL的原始示例 我的结果是一个简单的顺序程序,如代码所示。我的目标是使计算自动化,以获得真正的组合计算,而不是顺序计算 public class logistics { private static boolean airplaneInUse = false; private static boolean truckInUse = false; private

我试图将一个普通的PDDL案例(如后勤示例)建模为一种不同的编程语言(java)。我这样做是为了了解使用PDDL的优点或缺点

这是PDDL的原始示例

我的结果是一个简单的顺序程序,如代码所示。我的目标是使计算自动化,以获得真正的组合计算,而不是顺序计算

public class logistics {

private static boolean airplaneInUse = false;
private static boolean truckInUse = false;
private static String airport;
private static String place;
private static String city;
private static String pack1;
private static String pack2;

static int state = 0;



public static void main(String args[]) {


    if(state == 0) {

        start();
        System.out.println("The city in the initial state is " + city + "\n");
        System.out.println("The airport in the initial state is " + airport + "\n");


    }

     if(city == "London") {

        load_plane();
        System.out.println("pk1 and pk2 are on the plane" +"\n");
        pack1 = "On Board";
        pack2 = "On Board";

    }

    if(pack1 == "On Board" && pack2 == "On Board") {

        fly();

        System.out.println("The city after the flight is " + city + "\n");
        System.out.println("The airport after the flight is " + airport + "\n");

    }

     if (city == "Paris") {

        unload_plane();
        System.out.println("pk1 and pk2 are unloaded from the plane " + "\n");
        pack1 = "Unloaded";
        pack2 = "Unloaded";

    }

     if (pack1 == "Unloaded" && pack2 == "Unloaded") {

        load_truck();
        System.out.println(pack1 + "\n");
        System.out.println(pack2 + "\n");


    }

     if(pack1 == "pk1 On the truck" || pack2 == "pk2 On the truck") {

        drive_truck();
        System.out.println("Driving to the first place " + "\n");
        System.out.println("Driving to the second place " + "\n");


    }

     if (truckInUse == true) {

        unload_truck1();

        System.out.println("pk1 delivered in the " + place + "\n");

        unload_truck2();

        System.out.println("pk2 delivered in the " + place + "\n");
    }



}




public static void start() {

    city = "London";
    airport = "lhr";

    return;

}

public static void load_plane() {

    city = "London";
    pack1 = " pk1 On board";
    pack2 = " pk2 On board";

    return;
}

public static void fly() {

        city = "Paris";
        airport = "cdg";
        airplaneInUse = true;

    return;

}

public static void unload_plane() {

    pack1 = "Arrived in Paris";
    pack2 = "Arrived in Paris";
    airplaneInUse = false;

    return;

}


public static void load_truck() {

    pack1 = "pk1 On the truck";
    pack2 = "pk2 On the truck";

    return;

}


public static void drive_truck() {

    truckInUse = true;

    return;

}

public static void unload_truck1() {

    truckInUse = false;
    pack1 = "Arrived in South";
    place = "South";

    return;

}

public static void unload_truck2() {

    truckInUse = false;
    pack1 = "Arrived in North";
    place = "North";

    return;

}




}

我怎样才能达到我的目标?我怎样才能得到一个组合计算来解决这个问题呢?

我想你做得不对。不要试图实现任何if/else命令逻辑。声明您的操作(又名操作员)、域、问题,并致电计划员解决。如果您确实希望创建域和问题,而不将其编码到PDDL中并让计划者(例如pddl4j)对其进行解析,您可以用Java将其编码出来,并将其作为编码域和编码问题移交

您的代码的结构将非常类似于您在PDDL中使用的结构,因此除了减少解析时间和加快解决时间之外,我认为这样做没有什么意义。如果你这样做了,继续阅读

请参见如何通过pddl4j API调用planner的代码示例:

现在,通常情况下,您会让PDDL解析器完成这项工作:

…但是,如果要将其编码出来,则需要使用和类声明您的操作、域和问题


然后调用encode对问题进行编码,并调用pddl4j中的一个计划者,如其中一个教程(我在上面粘贴的链接)中所示。这有帮助吗?

我不确定我是否理解你的问题。就连这个问题的前提也似乎令人怀疑。你说你用另一种编程语言为PDDL问题建模。。。但PDDL绝不是一种编程语言。它只是一种输入语言,例如,与XML类似,但更具可读性,并且适合于计划。您是否了解规划技术,即它是什么或它是如何工作的?所以我不确定你是否想再写一份计划书,因为这是你解决问题所需要的。但是,为什么呢?已经有那么多。。。