Как смоделировать случай PDDL в Java - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь смоделировать обычный случай PDDL, как пример логистики, на другом языке программирования (Java). Я делаю это, чтобы понять, каковы преимущества или недостатки использования PDDL.

Это оригинальный пример PDDL

https://github.com/pellierd/pddl4j/wiki/Logistics:-a-simple-running-example

Мой результат - простая последовательная программа, показанная в коде. Моя цель - автоматизировать вычисления, чтобы получить реальные комбинаторные, а не последовательные вычисления.

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;

}




}

Как мне достичь своей цели? Как получить комбинаторный расчет для решения задачи?

1 Ответ

0 голосов
/ 16 октября 2019

Я думаю, вы ошибаетесь. Не пытайтесь реализовать какую-либо императивную логику if / else. Объявите свои действия (так называемые операторы), домен, проблему и позвоните планировщику, чтобы решить ее. Если вы хотите создать домен и проблему, не кодируя их в PDDL и не позволяя планировщику (например, pddl4j) проанализировать его, вы можете закодировать его на Java и передать как закодированный домен и закодированную проблему.

Структура вашего кода будет очень похожа на ту, которую вы поместили бы в PDDL, поэтому, кроме сокращения времени разбора и ускорения времени решения, я не вижу особого смысла делать это таким образом. Если вы это сделаете, продолжайте читать ...

Посмотрите пример кода, как вы вызываете планировщик через API pddl4j: https://github.com/pellierd/pddl4j/wiki/A-tutorial-to-develop-your-own-planner#step-6-searching-for-a-solution-plan

Теперь, обычно, вы бы позволили парсеру PDDL выполнитьзадание: https://github.com/pellierd/pddl4j/wiki/A-tutorial-to-develop-your-own-planner#step-5-parse-and-encode-the-pddl-domain-and-problem-files

... но если вы хотите закодировать его, вам нужно будет объявить свои действия, домен и проблему, используя Op , Домен и Задача классы.

Затем вы вызываете encode Problem и вызываете одного из планировщиков в pddl4j, как указано в одном из учебных пособий (ссылки, которые я вставил выше). Это помогает?

...