Temos um cenário com um conjunto de salas, e dentro dessas salas
podem existir bolas. Um robô está encarregado de mover as bolas entre as
salas. O robô possui duas pinças: uma left
(esquerda) e outra right
(direita), que
ele usa para segurar as bolas.
O objetivo dessa tarefa é transferir todas as bolas de uma sala inicial para uma sala destino. Para que isso seja feito, o robô usa suas duas pinças para pegar as bolas em uma sala e levá-las para outra sala, uma de cada vez.
Você deve escrever um programa que leia da Entrada padrão a descrição do mundo, contendo a quantidade de salas, quantidade de bolas, posição inicial de cada bola e onde cada bola deve terminar.
Assuma que as pinças left
e right
sempre iniciam livres e o robô inicia na
primeira sala descrita, note que elas são :constants
do domínio e não precisam ser
declaradas no arquivo de problema.
A entrada é composta por um único caso de teste. A primeira linha, do caso de teste, possui dois números inteiros e , e , representando, respectivamente, o número de salas e o número de bolas existentes no problema.
A segunda linha, do caso de teste, possui strings, de comprimento máximo de 100 caracteres, representando os nomes das salas do problema.
Depois existirão linhas, cada uma contendo strings, , de comprimento máximo de 100 caracteres, representando, respectivamente, o nome da i-ésima bola, a sala em que a bola começa e a sala que a bola deve terminar.
A Saída do seu programa deve ser o plano de execução do problema descrito.
/tmp/problem.pddl
conforme o padrão PDDL
(Planning Domain Definition Language)./tmp/domain.pddl
. O conteúdo do arquivo de
domínio já está definido e deve ser incluído no código fonte.fast-downward
utilizando a seguinte
configuração:
/tmp/dir/software/planners/downward-fdss23/fast-downward.py
seq-opt-fdss-2023
.DICA: Mude o working directory do seu programa para
/tmp
, pois o fast-downward gera um conjunto de arquivos no diretório local e não funcionará por padrão. EmC/C++
veja a funçãochdir(2)
Abaixo está o arquivo de domínio que define a infraestrutura básica do sistema:
(define (domain gripper-typed)
(:requirements :typing)room ball gripper)
(:types - gripper)
(:constants left right
(:predicates- room) ;; O robô está em uma sala
(at-robby ?r - ball ?r - room) ;; Uma bola está em uma sala
(at ?b - gripper) ;; A pinça está livre
(free ?g - ball ?g - gripper)) ;; Uma pinça está segurando uma bola
(carry ?o
;; Ação de mover o robô entre salas
(:action move- room)
:parameters (?from ?to
:precondition (at-robby ?from)and (at-robby ?to)
:effect (not (at-robby ?from))))
(
;; Ação de pegar uma bola com uma das pinças, em uma determinada sala
(:action pick- ball ?room - room ?gripper - gripper)
:parameters (?obj and (at ?obj ?room) (at-robby ?room) (free ?gripper))
:precondition (and (carry ?obj ?gripper)
:effect (not (at ?obj ?room))
(not (free ?gripper))))
(
;; Ação de soltar uma bola de uma pinça em uma sala específica
(:action drop- ball ?room - room ?gripper - gripper)
:parameters (?obj and (carry ?obj ?gripper) (at-robby ?room))
:precondition (and (at ?obj ?room)
:effect (
(free ?gripper)not (carry ?obj ?gripper))))) (
2 4
salaA salaB
bola1 salaA salaB
bola2 salaA salaB
bola3 salaA salaB
bola4 salaA salaB
(pick bola3 salaa left)
(pick bola4 salaa right)
(move salaa salab)
(drop bola3 salab left)
(drop bola4 salab right)
(move salab salaa)
(pick bola1 salaa left)
(pick bola2 salaa right)
(move salaa salab)
(drop bola1 salab left)
(drop bola2 salab right)
; cost = 11 (unit cost)
3 4
salaA salaB salaC
bola1 salaA salaC
bola2 salaB salaC
bola3 salaC salaA
bola4 salaB salaA
(move salaa salab)
(pick bola2 salab left)
(pick bola4 salab right)
(move salab salaa)
(drop bola4 salaa right)
(pick bola1 salaa right)
(move salaa salac)
(drop bola2 salac left)
(drop bola1 salac right)
(pick bola3 salac left)
(move salac salaa)
(drop bola3 salaa left)
; cost = 12 (unit cost)
Author: Bruno Ribas, baseado no domínio GRIPPER do IPC-1998