Hoppa till innehåll

Grafplan, algoritm i Python

Jag kommer att använda en grafplan för att lösa klassiska planeringsproblem i denna handledning. En lösning på ett planeringsproblem är en sekvens av åtgärder / handlingar som resulterar i ett måltillstånd (en plan). Automatiserad planering är ett viktigt område inom artificiell intelligens.

En intelligent agent måste kunna skapa planer för att kunna nå ett mål från ett initialt tillstånd. Ett planeringsproblem beskrivs med ett PDDL (Planning Domain Definition Language), ett problem har ett initialt tillstånd, ett måltillstånd och möjliga åtgärder. Tillstånd och möjliga åtgärder läggs till som meningar i en kunskapsbas. Varje möjlig åtgärd har ett funktionsnamn, variabler, förutsättningar och effekter. Ett planeringsproblem kan lösas med framåtsökning (progression) sökning eller bakåtsökning (regression). Framåtsökning startar från det ursprungliga tillståndet och bakåtsökning startar från måltillståndet.

En grafplan lägger upprepade gånger till en nivå till en planeringsgraf, en lösning kan hittas om alla mål på en nivå inte är ömsesidigt uteslutande. Algoritmen avslutas om den hittar en lösning som når måltillståndet eller om inga fler nivåer kan läggas till i planeringsgrafen. En planeringsgraf är en riktad graf som är organiserad i nivåer. Två mål är ömsesidigt uteslutande om de tar ut varandra, du kan inte både äta kakan och ha kakan.

Jag använder kod från aima-python i den här handledningen (ladda ner paket), dessa moduler innehåller alla nödvändiga klasser och funktioner för en grafplan i Python.

Problem och lösningar

Den här exempelkoden innehåller tre planeringsproblem och deras lösningar. Jag var tvungen att dela upp robotleveransproblemet i två delar, detta eftersom det var för svårt för algoritmen att få ett brev från postkontoret och föra tillbaka det till mitt kontor: At (Robert, MyOffice) & At (Letter, MyOffice). Det är också ett problem att få algoritmen att släppa brevet på mitt kontor i den andra delen (den hittar en lösning men inte i rätt ordning).

  1. # Import libraries
  2. import aima.utils
  3. import aima.planning
  4. # Air cargo problem
  5. def air_cargo_problem():
  6. # Planning problem
  7. problem = aima.planning.PlanningProblem(initial='At(C1, SFO) & At(C2, JFK) & At(P1, SFO) & At(P2, JFK)',
  8. goals='At(C1, JFK) & At(C2, SFO)',
  9. actions=[aima.planning.Action('Load(c, p, a)',
  10. precond='At(c, a) & At(p, a)',
  11. effect='In(c, p) & ~At(c, a)',
  12. domain='Cargo(c) & Plane(p) & Airport(a)'),
  13. aima.planning.Action('Unload(c, p, a)',
  14. precond='In(c, p) & At(p, a)',
  15. effect='At(c, a) & ~In(c, p)',
  16. domain='Cargo(c) & Plane(p) & Airport(a)'),
  17. aima.planning.Action('Fly(p, f, to)',
  18. precond='At(p, f)',
  19. effect='At(p, to) & ~At(p, f)',
  20. domain='Plane(p) & Airport(f) & Airport(to)')],
  21. domain='Cargo(C1) & Cargo(C2) & Plane(P1) & Plane(P2) & Airport(SFO) & Airport(JFK)')
  22. # Graph plan solution
  23. solution = aima.planning.GraphPlan(problem).execute()
  24. print("Air Cargo: {0}".format(aima.planning.linearize(solution)))
  25. print()
  26. # Drive in romania
  27. def romania():
  28. # Create a knowledge base
  29. knowledge_base = [
  30. aima.utils.expr("Connected(Bucharest,Pitesti)"),
  31. aima.utils.expr("Connected(Pitesti,Rimnicu)"),
  32. aima.utils.expr("Connected(Rimnicu,Sibiu)"),
  33. aima.utils.expr("Connected(Sibiu,Fagaras)"),
  34. aima.utils.expr("Connected(Fagaras,Bucharest)"),
  35. aima.utils.expr("Connected(Pitesti,Craiova)"),
  36. aima.utils.expr("Connected(Craiova,Rimnicu)")
  37. ]
  38. # Add rules to knowledge base
  39. knowledge_base.extend([
  40. aima.utils.expr("Connected(x,y) ==> Connected(y,x)"),
  41. aima.utils.expr("At(Sibiu)")
  42. ])
  43. # Create a drive action
  44. drive = aima.planning.Action('Drive(x, y)', precond='At(x) & Connected(x,y)', effect='At(y) & ~At(x)')
  45. # Create a goal
  46. goals = 'At(Bucharest)'
  47. # Graph plan solution
  48. problem = aima.planning.PlanningProblem(knowledge_base, goals, [drive])
  49. solution = aima.planning.GraphPlan(problem).execute()
  50. print("Romania: {0}".format(aima.planning.linearize(solution)))
  51. print()
  52. # Robot delivery problem
  53. def robot_delivery_problem(initial_state, goals):
  54. # Create a knowledge base
  55. kb = [aima.utils.expr("Connected(MyOffice,Floor)"),
  56. aima.utils.expr("Connected(Floor,MailOffice)"),
  57. aima.utils.expr("Connected(Floor,Fikarum)"),
  58. aima.utils.expr("Connected(Fikarum,MailOffice)"),
  59. aima.utils.expr("Connected(Floor,MyOffice)"),
  60. aima.utils.expr("Connected(MailOffice,Floor)"),
  61. aima.utils.expr("Connected(Fikarum,Floor)"),
  62. aima.utils.expr("Connected(MailOffice,Fikarum)")
  63. ]
  64. # Add initial state to the knowledge base
  65. kb.extend(initial_state)
  66. # Create actions
  67. actions = [aima.planning.Action("Pickup(b, p, r)",
  68. precond="At(b, r) & At(p, r) & ~Has(b, p)",
  69. effect="Has(b, p) & ~At(p, r)",
  70. domain="Robot(b) & Packet(p) & Room(r)"),
  71. aima.planning.Action("Drop(b, p, r)",
  72. precond="At(b, r) & Has(b, p)",
  73. effect="At(p, r) & ~Has(b, p)",
  74. domain="Robot(b) & Packet(p) & Room(r)"),
  75. aima.planning.Action("Move(b, f, t)",
  76. precond="At(b, f) & Connected(f, t)",
  77. effect="At(b, t) & ~At(b, f)",
  78. domain="Robot(b) & Room(f) & Room(t)")
  79. ]
  80. # Create domains
  81. domains = [aima.utils.expr("Robot(Robert)"),
  82. aima.utils.expr("Packet(Letter)"),
  83. aima.utils.expr("Room(MyOffice)"),
  84. aima.utils.expr("Room(Floor)"),
  85. aima.utils.expr("Room(MailOffice)"),
  86. aima.utils.expr("Room(Fikarum)")
  87. ]
  88. # Create a planning problem
  89. problem = aima.planning.PlanningProblem(kb, goals, actions, domains)
  90. # Return the problem
  91. return problem
  92. # The main entry point for this module
  93. def main():
  94. # Air cargo problem
  95. air_cargo_problem()
  96. # Romania problem
  97. romania()
  98. # Robot delivery: first part
  99. initial_state = [
  100. aima.utils.expr("At(Robert, MyOffice)"),
  101. aima.utils.expr("At(Letter, MailOffice)"),
  102. aima.utils.expr("~Has(Robert, Letter)")
  103. ]
  104. goals = [aima.utils.expr("At(Robert, MailOffice)"), aima.utils.expr("Has(Robert, Letter)")]
  105. problem = robot_delivery_problem(initial_state, goals)
  106. solution = aima.planning.GraphPlan(problem).execute()
  107. print("Robot delivery, part 1: {0}".format(aima.planning.linearize(solution)))
  108. print()
  109. # Robot delivery: second part
  110. initial_state = [
  111. aima.utils.expr("At(Robert, MailOffice)"),
  112. aima.utils.expr("Has(Robert, Letter)")
  113. ]
  114. goals = [aima.utils.expr("At(Robert, MyOffice)")]
  115. problem = robot_delivery_problem(initial_state, goals)
  116. solution = aima.planning.GraphPlan(problem).execute()
  117. print("Robot delivery, part 2: {0}".format(aima.planning.linearize(solution)))
  118. print()
  119. # Tell python to run main method
  120. if __name__ == "__main__": main()
  1. Air Cargo: [Load(C1, P1, SFO), Load(C2, P2, JFK), Fly(P1, SFO, JFK), Fly(P2, JFK, SFO), Unload(C1, P1, JFK), Unload(C2, P2, SFO)]
  2. Romania: [Drive(Sibiu, Fagaras), Drive(Fagaras, Bucharest)]
  3. Robot delivery, part 1: [Move(Robert, MyOffice, Floor), Move(Robert, Floor, MailOffice), Pickup(Robert, Letter, MailOffice)]
  4. Robot delivery, part 2: [Move(Robert, MailOffice, Floor), Move(Robert, Floor, MyOffice)]
Etiketter:

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *