Difference between revisions of "FormulaAIandDynamicScripting"

From The Battle for Wesnoth Wiki
m (Formula AI)
(Candidate for deletion)
 
(26 intermediate revisions by 3 users not shown)
Line 1: Line 1:
This is a *very* rough outline of some ideas I have for the AI improvement.  I'm pretty much open to any suggestions but this outlines what I have in mind, giving the AI some adaptive capability and making the AI tunable by scenario designers and for all out combat.
+
{{Delete}}
 +
==Project Progess==
  
==Formula AI==
+
[[GsocAIProjectProgress]]
  
Formula AI will be used for designing the AI rulebases described below.  A rulebase can be thought of as a set of candidate moves written in Formula AI which accomplish some particular behavior or strategy.  Much of the work will be defining what behaviors are required (i.e. aggressive, defensive, etc.) and implementing the appropriate moves in Formula AI.  I believe there will be some back and forth between implementing rulebases in FormulaAI and extending Formula AI when additional functionality needs to be added.  These two things will probably be two thirds of the project.
+
==About Me==
  
==Rulebases==
+
I am currently a full-time graduate student living in Colorado, US.  I've been coding since I was about 12, initially writing text based adventures for myself and my friends to play, moving on to RPGs using some primitive sprite based graphics and completed a mini RPG in high school, complete with graphics and music I wrote on my keyboard.
  
I am thinking of the relationship between rulebases and units similar to object oriented programming in C++.  That is a unit inherits predefined rulebases which will dictate that unit's behaviorUnit's can then be associated with very general behaviors, such as 'aggressive', 'defensive', etc. which are overall strategies for the units as well as more specific rulebases which supply unit specific behavior, such as a faction vs faction.
+
Since then, I have graduated from Pennsylvania State University with a bachelors degree in computer science and entered a PhD graduate program focusing on AI research.  I use C++ primarily for research and have been a teaching assistant for our undergraduate C++ courseI have approximately 4/5 years of C++ experience and some Python experience.
  
The rulebases will also be parameterized to allow for as much reuse as possible.  So for instance, a scenario designer could associate wolf riders with and aggressive rulebase as well as a faction vs faction rulebase parameterized for elves.  This would give the designer's wolf riders a behavior biased towards aggressively attacking elves.  Recruitment rulebases should also be designated to govern the recruitment process.  Futhermore, general strategy rulebases which govern all units can also be applied, so the designer could apply a rulebase tuned towards killing the opponents leader to a global scope.
+
===Contact Information===
  
This should allow scenario designers an easy way to customize the behavior of the AI by simply plugging together appropriate rulebases, perhaps simply in WML, without any more programming knowledge then is already required to design a scenario.  Of course, if the scenario designer is comfortable with Formula AI and really wants to fine tune things, the designer can implement his or her own rulebases and use them in conjunction with those provided.
+
* IRC: barbarianhero
  
Here is a list of the rulebase categories, hopefully it can change/fill up with specific behaviors as ideas are added.  I think coming up with specific rulebases and such will really start rolling after a fair amount of interaction with the community, specifically players and scenario designers.
+
* Forum id: rende
  
===Rulebase Categories===
+
* Gna! username: dhains
====Recruitment Rulebases====
 
Rulebases to govern the recruitment process, this may just be one parameterized rulebase or several rulebases for different recruiting strategies.
 
  
====Unit Rulebases====
+
* preferred email: dhains__A!T__ gmail.com
These are rulebases which can be associated to units.  Scenario designers can apply some unit rulebases to all units in scenario and then customize specific units on a case by case basis if needed, to say setup faction behaviors between certain units.  This could not be just aggresive but also perhaps a healing unit prefers to heal units of it's own faction.  Healing units could be associated with a general unit rulebase which tells them to heal wounded units and elves could be even further customized with a heal elves over dwarves behavior.
 
  
====Global Rulebases====
+
I'll be adding more to this page as I have the timePlease feel free to contact me if you have any questions.
These will be more general rules for which all units would abide (We could create an easy way for certain units to ignore any global rulebase, or to follow another to setup a renegade faction within a computer controlled side, for instance a band of outlaws (thugs, poachers) which are helping the computer controlled side fight but simply for the sake of killing elves and have no care for the overall objective of the AI.) Mostly, the provided rulebases in this category will cover the most common scenarios and deathmatch games, i.e. kill opponents leader, defend for x turns, escort x to hex y, kill at all cost, etc.
 
  
===Rulebase Flow===
+
=== My Contribs ===
So once the global, recruitment and unit rulebases have been defined, the Formula AI in these rulebases forms a sort of script for the AI to follow.  The formulaAI will have some form of priority or probability defined to them by the rulebase and this will be used to determine which action in the script to follow for purposes of recruitment and actions.  For instance, an 'aggresive', 'faction vs undead' behavior is associated to a white mage being pursued by walking dead.  The action to go nuke a few zombies would have a much lower probability of being executed if a global 'protect the leader' behavior is associated to the scenario and the leader is injured and within healing vicinity of the white mage.  These probabilities / priorities are where the adaptive nature of the algorithm come into play in the next section.
 
  
==Dynamic Scripting==
+
Since I have been active with Wesnoth development for the past few weeks, I have submitted several patches and gained SVN access.  Since then, I have been focusing on getting Formula AI to a point where I can begin development of the ideas set forth in this proposal by implementing necessary features:
  
I was hoping to apply some machine learning concepts to the AI, specifically online learningOnline learning allows the AI to adapt it's strategy to fix holes being exploited by the human player and over all to perform more intelligently, giving the player a feeling he or she is playing against a thinking, clever opponent.
+
==== Terrain Knowledge ====
 +
These checkins exposed map and terrain features to Formula AI, a much needed featureTerrain information is now available to Formula AI using 'map.terrain' from within Formula AI.  This allowed implementation of the 'woodchopper' feature requested on the forums.
  
One method that seems quite suitable is dynamic scripting.  This method relies on a manually designed rulebase from which the AI can construct moves.   Each rule in the rulebase has an associated weight which influences the probability of a given rule being used in an upcoming move. As a game progresses, the weights are updated automatically according to the success or failure of the rules in the past of the current game (or campaign). This would allow the AI to adapt to a player's tactics and encourage the player to develop diverse strategies for use in campaign mode.  
+
* Exposed terrain, nearest_loc function, woodchopper example - [http://svn.gna.org/viewcvs/wesnoth?view=rev&rev=25365], [http://svn.gna.org/viewcvs/wesnoth?rev=25455&view=rev]
  
 +
Documentation can be found on the [[FormulaAI|FormulaAI]] wiki page and also on the [http://www.wesnoth.org/forum/viewtopic.php?f=10&t=20471&st=0&sk=t&sd=a&start=15 Woodchopper forum thread]
 +
 +
==== Formula AI Scripts ====
 +
 +
The overall goal of the following checkins was to create and support a new way of writing Formula AI, i.e. formula AI script files to allow reuse and support building of pluggable Formula libraries:
 +
 +
* Created def keyword for custom functions: [http://svn.gna.org/viewcvs/wesnoth?view=rev&rev=24993]
 +
* Formula Script support: [http://svn.gna.org/viewcvs/wesnoth?view=rev&rev=25052]
 +
* Cleaned up Formula AI script read method : [http://svn.gna.org/viewcvs/wesnoth?view=rev&rev=25094]
 +
* Fixed Parsing Bug in Formula AI : [http://svn.gna.org/viewcvs/wesnoth?view=rev&rev=25099]
 +
* Added Comment Support to Formula AI : [http://svn.gna.org/viewcvs/wesnoth?view=rev&rev=25136]
 +
* Checked in Vim Syntax Highlighting: [http://svn.gna.org/viewcvs/wesnoth?rev=25178&view=rev]
 +
 +
Formula AI scripts are now supported.  Documentation can be found on the [[FormulaAI|FormulaAI]] page.
 +
 +
==== Candidate moves and Eval functions ====
 +
 +
The following checkins are to support the building of candidate move lists and evaluation functions (work in progress):
 +
 +
* Initial support for candidate move lists [http://svn.gna.org/viewcvs/wesnoth?view=rev&rev=25365],[http://svn.gna.org/viewcvs/wesnoth?rev=25217&view=rev]
 +
 +
Initial Patches: [https://gna.org/patch/?1014], [https://gna.org/patch/?1016].
 +
 +
Various bug fixes: [http://svn.gna.org/viewcvs/wesnoth?rev=25452&view=rev]
 +
 +
==Overview==
 +
 +
Designing an AI for playing games is a challenge.  Techniques such as minimax and alpha-beta pruning are useful in games such as chess or backgammon, but the complexity of Wesnoth's gamestate space precludes many of these approaches.
 +
 +
A common method to overcome this problem is to use scripting.  Manually designed rules are created to determine the course of action, for instance if the AI should attack or defend.  While these methods are effective it is generally not enough to provide challenging play, especially to experienced players.  Players can 'outsmart' a scripted AI simply by exploiting the predictability inherent to scripting.
 +
 +
An ideal AI is one which exhibits human-like behavoir. One which can adapt its strategy to cover holes exploited by players. One which has the ability of surprise, to make the player feel as if he is playing a thinking, cunning opponent instead of just 'trying to beat the computer'. Such an AI is not a pipe dream and even more to the point, is quite feasible from a technical standpoint.
 +
 +
This is a proposal to implement such an AI. I propose to use dynamic scripting to combine manually designed rulebases and online learning to create a customizable, extensible and adaptive AI. his type of dynamic planning has already proven successful in creating adaptive, formidable A.I. in games such as F.E.A.R. and Neverwinter Nights [1,2].
 +
 +
The rulebases will be implemented in FormulaAI while the reinforcement learning portion will be handled by C++. This accomplishes two goals: 1, the AI can easily be customized and extended without touching the C++ code and with no knowledge of the reinforcement learning process and 2, the learning process can easily be 'switched off', perhaps as a difficulty setting or to force strict adherence to a script.
 +
 +
==Rulebases - Formula AI==
 +
 +
Rulebases contain the FormulaAI rules the AI can use to form scripts. The rulebases developed for this project will form a repository of strategies and behaviors that designers can simply plug into a WML file to create a highly effective AI without ever touching FormulaAI or the underlying learning processes. Of course, if a designer desires a new strategy they can write custom FormulaAI rules.
 +
 +
I plan to involve the community in this portion of the project to identify the common strategies used by players and desired by scenario and MP bot designers. The how to play series will also serve as a useful guide. I foresee three categories of rulebases the designer can choose from to customize the AI for a particular scenario or deathmatch.
 +
 +
=== Recruitment Rulebases ===
 +
 +
These rulebases will cover strategies to recruit units. A default recruitment strategy will be provided that selects the best units for the desired scenario goal.
 +
 +
=== Team Rulebases ===
 +
 +
Team rulebases will govern team strategies and will supply the majority of rules the AI can use when creating a script. Developed rulebases cover the majority of scenario and MP objectives, such as 'Escort unit x to hex y', 'Assassinate enemy leader', etc.
 +
 +
=== Unit Rulebases ===
 +
 +
Unit rulebases provide rules for unit specific behavior. Some of these rulebases will be associated to units by default, for instance a 'healing' rule for healing units, 'backstab' to thieves, etc.
 +
 +
A variety of rulebases to customize unit behavior to a scenario storyline will also be available, such as 'Hatred towards faction x' and can be applied to single units or groups.
 +
 +
For example, a scenario designer might want to create a scenario in which a group of orcs, goblins and ogres must escort an orcish leader across a map to hex 5,10.  The storyline might dictate that the goblins and ogres are only helping the orcs for a chance to kill elves, which the player has the ability to recruit.  The scenario designer could implement this quite easily in their cfg file for that scenario with something like
 +
 +
  [ai]
 +
      [team_formula]
 +
        rulebase = "escort"
 +
        parameters = "Orcish Leader", 5, 10
 +
      [\team_formula]
 +
      [unit_formula]
 +
        apply_to_units = "goblins", "ogres"
 +
        rulebase = "faction_hatred"
 +
        parameters = "Elves"
 +
      [\unit_faction]
 +
  [\ai]
 +
 +
Of course the designer could make things a bit more complicated, by creating multiple team strategies associated to different units, e.g. suppose in the above example the AI also had a renegade faction of elvish rangers along for the ride, hellbent on destroying the human leader and don't really care about escorting the orcish leader.  The designer might create an entirely new side, but if he or she wanted all the units on a single side, he might add the following to the above ai section.
 +
 +
      [unit_formula]
 +
        apply_to_units = "Elvish Ranger", "Elvish Avenger"
 +
        rulebase = "hide_and_ambush"  # Make elves stay hidden if possible until they attack
 +
        [team_formula]  # This will override the "escort" team formula
 +
          rulebase = "assassinate"
 +
          parameters = "Human Leader"
 +
        [\team_formula]
 +
      [\unit_formula]
 +
 +
The AI designer can go deeper or shallower if necessary.  An adequate default AI with appropriate unit rulebases and a 'kill all' team rulebase will be the default if none are specified.  If the provided rulebases do not cover some specific behavior, the designer of course may implement his own rulebase by creating a custom formula script or by altering the evaluation functions of the existing rulebases.
 +
 +
== Adaptation and Learning - C++ ==
 +
 +
The C++ portion of the project allows the AI to learn and adapt. Once the candidate moves are determined, the AI will rank the moves based on evaluation functions. The actual evaluation functions will be written in Formula AI, the C++ code should never have to be touch for customization or extension purposes.
 +
 +
There will be two evaluation functions: A team evaluation function, in which the impact of each move on the overall team strategy is evaluated and a unit evaluation function, in which the impact of a move on unit involved is evaluated. The results these functions determine the final evaluation of a move. Once all moves are evaluated, the script is formed based on these evaluations (i.e. best moves first).
 +
 +
At the end of turn, the success of each move is used to adjust a weight associated with that move. The weights are incorporated into the evaluation of moves during the next turn (e.g. weight * (unit_eval(formula) + team_eval(formula))). In this way, the AI can learn from it's mistakes and exploit holes in an opponent's strategy found by successful moves.
  
 
==Related Papers==
 
==Related Papers==
  
 
Online Adaptation of Game Opponent AI in Simulation and in Practice, Spronk et al. [http://www.fdaw.unimaas.nl/education/3.1cs/postma/GAMEON2003-Paper8-Spronck.pdf]
 
Online Adaptation of Game Opponent AI in Simulation and in Practice, Spronk et al. [http://www.fdaw.unimaas.nl/education/3.1cs/postma/GAMEON2003-Paper8-Spronck.pdf]
 +
 +
[[Category:AI]]
 +
[[Category:Summer of Code]]

Latest revision as of 03:20, 16 November 2022

Project Progess

GsocAIProjectProgress

About Me

I am currently a full-time graduate student living in Colorado, US. I've been coding since I was about 12, initially writing text based adventures for myself and my friends to play, moving on to RPGs using some primitive sprite based graphics and completed a mini RPG in high school, complete with graphics and music I wrote on my keyboard.

Since then, I have graduated from Pennsylvania State University with a bachelors degree in computer science and entered a PhD graduate program focusing on AI research. I use C++ primarily for research and have been a teaching assistant for our undergraduate C++ course. I have approximately 4/5 years of C++ experience and some Python experience.

Contact Information

  • IRC: barbarianhero
  • Forum id: rende
  • Gna! username: dhains
  • preferred email: dhains__A!T__ gmail.com

I'll be adding more to this page as I have the time. Please feel free to contact me if you have any questions.

My Contribs

Since I have been active with Wesnoth development for the past few weeks, I have submitted several patches and gained SVN access. Since then, I have been focusing on getting Formula AI to a point where I can begin development of the ideas set forth in this proposal by implementing necessary features:

Terrain Knowledge

These checkins exposed map and terrain features to Formula AI, a much needed feature. Terrain information is now available to Formula AI using 'map.terrain' from within Formula AI. This allowed implementation of the 'woodchopper' feature requested on the forums.

  • Exposed terrain, nearest_loc function, woodchopper example - [1], [2]

Documentation can be found on the FormulaAI wiki page and also on the Woodchopper forum thread

Formula AI Scripts

The overall goal of the following checkins was to create and support a new way of writing Formula AI, i.e. formula AI script files to allow reuse and support building of pluggable Formula libraries:

  • Created def keyword for custom functions: [3]
  • Formula Script support: [4]
  • Cleaned up Formula AI script read method : [5]
  • Fixed Parsing Bug in Formula AI : [6]
  • Added Comment Support to Formula AI : [7]
  • Checked in Vim Syntax Highlighting: [8]

Formula AI scripts are now supported. Documentation can be found on the FormulaAI page.

Candidate moves and Eval functions

The following checkins are to support the building of candidate move lists and evaluation functions (work in progress):

  • Initial support for candidate move lists [9],[10]

Initial Patches: [11], [12].

Various bug fixes: [13]

Overview

Designing an AI for playing games is a challenge. Techniques such as minimax and alpha-beta pruning are useful in games such as chess or backgammon, but the complexity of Wesnoth's gamestate space precludes many of these approaches.

A common method to overcome this problem is to use scripting. Manually designed rules are created to determine the course of action, for instance if the AI should attack or defend. While these methods are effective it is generally not enough to provide challenging play, especially to experienced players. Players can 'outsmart' a scripted AI simply by exploiting the predictability inherent to scripting.

An ideal AI is one which exhibits human-like behavoir. One which can adapt its strategy to cover holes exploited by players. One which has the ability of surprise, to make the player feel as if he is playing a thinking, cunning opponent instead of just 'trying to beat the computer'. Such an AI is not a pipe dream and even more to the point, is quite feasible from a technical standpoint.

This is a proposal to implement such an AI. I propose to use dynamic scripting to combine manually designed rulebases and online learning to create a customizable, extensible and adaptive AI. his type of dynamic planning has already proven successful in creating adaptive, formidable A.I. in games such as F.E.A.R. and Neverwinter Nights [1,2].

The rulebases will be implemented in FormulaAI while the reinforcement learning portion will be handled by C++. This accomplishes two goals: 1, the AI can easily be customized and extended without touching the C++ code and with no knowledge of the reinforcement learning process and 2, the learning process can easily be 'switched off', perhaps as a difficulty setting or to force strict adherence to a script.

Rulebases - Formula AI

Rulebases contain the FormulaAI rules the AI can use to form scripts. The rulebases developed for this project will form a repository of strategies and behaviors that designers can simply plug into a WML file to create a highly effective AI without ever touching FormulaAI or the underlying learning processes. Of course, if a designer desires a new strategy they can write custom FormulaAI rules.

I plan to involve the community in this portion of the project to identify the common strategies used by players and desired by scenario and MP bot designers. The how to play series will also serve as a useful guide. I foresee three categories of rulebases the designer can choose from to customize the AI for a particular scenario or deathmatch.

Recruitment Rulebases

These rulebases will cover strategies to recruit units. A default recruitment strategy will be provided that selects the best units for the desired scenario goal.

Team Rulebases

Team rulebases will govern team strategies and will supply the majority of rules the AI can use when creating a script. Developed rulebases cover the majority of scenario and MP objectives, such as 'Escort unit x to hex y', 'Assassinate enemy leader', etc.

Unit Rulebases

Unit rulebases provide rules for unit specific behavior. Some of these rulebases will be associated to units by default, for instance a 'healing' rule for healing units, 'backstab' to thieves, etc.

A variety of rulebases to customize unit behavior to a scenario storyline will also be available, such as 'Hatred towards faction x' and can be applied to single units or groups.

For example, a scenario designer might want to create a scenario in which a group of orcs, goblins and ogres must escort an orcish leader across a map to hex 5,10. The storyline might dictate that the goblins and ogres are only helping the orcs for a chance to kill elves, which the player has the ability to recruit. The scenario designer could implement this quite easily in their cfg file for that scenario with something like

  [ai]
     [team_formula]
       rulebase = "escort"
       parameters = "Orcish Leader", 5, 10
     [\team_formula]
     [unit_formula]
       apply_to_units = "goblins", "ogres"
       rulebase = "faction_hatred"
       parameters = "Elves"
     [\unit_faction]
  [\ai]

Of course the designer could make things a bit more complicated, by creating multiple team strategies associated to different units, e.g. suppose in the above example the AI also had a renegade faction of elvish rangers along for the ride, hellbent on destroying the human leader and don't really care about escorting the orcish leader. The designer might create an entirely new side, but if he or she wanted all the units on a single side, he might add the following to the above ai section.

     [unit_formula]
       apply_to_units = "Elvish Ranger", "Elvish Avenger"
       rulebase = "hide_and_ambush"  # Make elves stay hidden if possible until they attack
       [team_formula]  # This will override the "escort" team formula
         rulebase = "assassinate"
         parameters = "Human Leader"
        [\team_formula]
     [\unit_formula]

The AI designer can go deeper or shallower if necessary. An adequate default AI with appropriate unit rulebases and a 'kill all' team rulebase will be the default if none are specified. If the provided rulebases do not cover some specific behavior, the designer of course may implement his own rulebase by creating a custom formula script or by altering the evaluation functions of the existing rulebases.

Adaptation and Learning - C++

The C++ portion of the project allows the AI to learn and adapt. Once the candidate moves are determined, the AI will rank the moves based on evaluation functions. The actual evaluation functions will be written in Formula AI, the C++ code should never have to be touch for customization or extension purposes.

There will be two evaluation functions: A team evaluation function, in which the impact of each move on the overall team strategy is evaluated and a unit evaluation function, in which the impact of a move on unit involved is evaluated. The results these functions determine the final evaluation of a move. Once all moves are evaluated, the script is formed based on these evaluations (i.e. best moves first).

At the end of turn, the success of each move is used to adjust a weight associated with that move. The weights are incorporated into the evaluation of moves during the next turn (e.g. weight * (unit_eval(formula) + team_eval(formula))). In this way, the AI can learn from it's mistakes and exploit holes in an opponent's strategy found by successful moves.

Related Papers

Online Adaptation of Game Opponent AI in Simulation and in Practice, Spronk et al. [14]

This page was last edited on 16 November 2022, at 03:20.