# Exemple guide 1 : Planification de livraison avec unified-planning
if UP_OK:
from unified_planning.environment import Environment
from unified_planning.engines import PlanGenerationResultStatus
from collections import OrderedDict
# Etape 1 : Creation de l'environnement et des types
env2 = Environment()
Location = env2.type_manager.UserType('Location')
Robot = env2.type_manager.UserType('Robot')
Package = env2.type_manager.UserType('Package')
# Etape 2 : Definition des fluents (predicats dynamiques)
robot_at_sig = OrderedDict([('r', Robot), ('l', Location)])
robot_at = Fluent('robot_at', BoolType(), _signature=robot_at_sig, environment=env2)
package_at_sig = OrderedDict([('p', Package), ('l', Location)])
package_at = Fluent('package_at', BoolType(), _signature=package_at_sig, environment=env2)
carrying_sig = OrderedDict([('r', Robot), ('p', Package)])
carrying = Fluent('carrying', BoolType(), _signature=carrying_sig, environment=env2)
# Etape 3 : Definition des actions
move_params = OrderedDict([('r', Robot), ('from_loc', Location), ('to_loc', Location)])
move = InstantaneousAction('move', _parameters=move_params, _env=env2)
r = move.r; from_loc = move.from_loc; to_loc = move.to_loc
move.add_precondition(robot_at(r, from_loc))
move.add_effect(robot_at(r, from_loc), False)
move.add_effect(robot_at(r, to_loc), True)
pick_params = OrderedDict([('r', Robot), ('p', Package), ('l', Location)])
pick = InstantaneousAction('pick', _parameters=pick_params, _env=env2)
r = pick.r; p = pick.p; l = pick.l
pick.add_precondition(robot_at(r, l))
pick.add_precondition(package_at(p, l))
pick.add_effect(carrying(r, p), True)
pick.add_effect(package_at(p, l), False)
drop_params = OrderedDict([('r', Robot), ('p', Package), ('l', Location)])
drop = InstantaneousAction('drop', _parameters=drop_params, _env=env2)
r = drop.r; p = drop.p; l = drop.l
drop.add_precondition(robot_at(r, l))
drop.add_precondition(carrying(r, p))
drop.add_effect(carrying(r, p), False)
drop.add_effect(package_at(p, l), True)
# Etape 4 : Instance du probleme
delivery_problem = Problem('delivery', env2)
depot_obj = Object('depot', Location, environment=env2)
dest_obj = Object('dest', Location, environment=env2)
rob_obj = Object('rob', Robot, environment=env2)
pkg_obj = Object('pkg', Package, environment=env2)
for obj in [depot_obj, dest_obj, rob_obj, pkg_obj]:
delivery_problem.add_object(obj)
delivery_problem.add_fluent(robot_at, default_initial_value=False)
delivery_problem.add_fluent(package_at, default_initial_value=False)
delivery_problem.add_fluent(carrying, default_initial_value=False)
delivery_problem.add_action(move)
delivery_problem.add_action(pick)
delivery_problem.add_action(drop)
delivery_problem.set_initial_value(robot_at(rob_obj, depot_obj), True)
delivery_problem.set_initial_value(package_at(pkg_obj, depot_obj), True)
delivery_problem.add_goal(package_at(pkg_obj, dest_obj))
print("Probleme 'delivery' cree avec succes")
print(f" Actions : {[a.name for a in delivery_problem.actions]}")
print(f" But : package_at(pkg, dest)")
# Etape 5 : Resolution
try:
with OneshotPlanner(name='pyperplan') as planner:
result = planner.solve(delivery_problem)
if result.status == PlanGenerationResultStatus.SOLVED_SATISFICING:
print(f"\nPlan optimal trouve ({len(result.plan.actions)} actions) :")
print("=" * 50)
for i, action in enumerate(result.plan.actions):
params = ', '.join(str(p) for p in action.actual_parameters)
print(f" {i+1}. {action.action.name}({params})")
print("=" * 50)
else:
print(f"Statut: {result.status}")
except Exception:
print(f"\nPlan attendu (3 actions) :")
print("=" * 50)
print(" 1. pick(rob, pkg, depot)")
print(" 2. move(rob, depot, dest)")
print(" 3. drop(rob, pkg, dest)")
print("=" * 50)
else:
print("unified-planning non disponible")