2019 年 1 月

第 34 卷,第 1 期

[机器学习]

利用信念-心愿-意向代理体系结构

通过Arnaldo Perez Perez |2019 年 1 月

在本文中,我将介绍旅行助手代理 (TAA) 用于其决策制定过程的需求的信仰意图 (BDI) 代理体系结构。

BDI 代理体系结构基于 Michael Bratman 哲学理论 (Bratman 1987),介绍了通过以下态度的原因: 信仰、 需求和意图。因此,BDI 代理是自治代理,使利用这三个概念以其能够正常运行。让我们看一下这些概念逐个:

  • 信仰是环境的代理的模型中,基本上它认为得令人难以置信。但并不了解其信仰的一些可能为 false。BDI 体系结构的此组件通常表示为数据集的事实 breeze (1,2)、 (2,3) 的危险、 安全 (0,0)、 (0,1) 的安全等,依此类推。
  • 需求表示代理的理想环境的状态。像在人类大脑中,我们想要查看这些表示内容在将来完成。期望可能是实际或不是,因为它与人类思维发生和可能或可能不是可实现。需求可以相互 inclusive 还是 exclusive。
  • 意图表示代理已作为目标,很快就完成的需求的子集。这些意图不能再对其信仰 — 例如,代理不能具有意图使其通过死区或否则阻止它访问意图表示的目标。此类目的将被放弃。

信仰包含代理的生命周期内更新的事实数据集。有关的需求和意图,出现的问题对:如何选择其中记载要求变得意图是什么,以及如何选择更高版本的意图要成为代理操作?若要回答此问题,我必须提供代理的 BDI 模型中实际推理的两个组件:

  • 考虑:此组件处理的战略思想,并决定的需求是立即完成。结果是一系列的意图。
  • 表示结束的推论:此组件处理战略规划,并决定应执行哪些操作来满足已提交的意图的集。结果是一系列计划和操作。

中的关系图图 1说明了 BDI 体系结构的工作原理。输入或通过从环境的传感器接收的认知提交到相信修订函数 (BRF)。此函数监督对当前信仰数据库,确保最近收到的认知集不会与理念基础数据集中任何信仰相矛盾的更新。输入集和一套信仰,该函数接受作为参数:Brf (输入、 信仰)。

BDI 代理体系结构
图 1 BDI 代理体系结构

然后,一组选项会生成,最终将成为需求并进入愿望数据集。为了生成这些选项,该函数会查看理念基础数据集和意图数据集。因此,其接受参数的理念基础数据集、 愿望数据集和意图数据集: generateOptions (信仰、 需求、 意图)。为什么需要意图生成选项?因为您不想生成与相矛盾,或与当前的意图集选项。

使用筛选器函数,以前获取的需求进行筛选,并且成为意图。若要筛选通常排除不现实,或者不很难满足目前的需求。筛选器函数将具有的签名: 筛选器 (信仰、 需求、 意图)。最后,从一组的意图和表示结束推理采取的方法操作是使用代理的 effectors (如机械双臂和屏幕)。

总而言之,BDI 是一个范例和一组的一般原则,可用于设计的决策制定的软件系统体系结构。您可能熟悉其他设计模式,例如三层体系结构或模型-视图-控制器 Web 系统。这些其他模式,如 BDI 是常规设计助手,而不是定义完善的说明性蓝图。

就可以超越 BDI 模型的理论,看看如何将其应用于机器人过程自动化 (RPA) 应用程序 — 具体而言,旅行助手代理。

旅行助手代理 (TAA)

目标是创建的 TAA 其中联系输入他们假期的需求,也可以获取假日旅行计划。对于此示例中,将为需求:

  • 前往古巴
  • 具体而言,到哈瓦那和 Varadero 的城市
  • 最大预算 1,200 美元
  • 一周
  • 赶在 2018 年 12 月

使用其信仰数据库,TAA 这种要求转换的意图,并提供了一个真实假日计划,它可能如下所示:预订的古巴海滩假日教程包cubamaniatour.com上年 12 月 15 日 8 天 800 美元的价格。

可以使用类似于以下的信念数据库获取此计划:

  • 介绍包,基本古巴教程,7 天,可用始终,800 美元。 
  • 介绍包,古巴海滩节假日教程,8 天,可用始终,800 美元。 
  • 浏览包,哈瓦那资源管理器古巴教程,3 天,提供 12-10-2018,500 美元。 
  • 介绍包,哈瓦那 Varadero 教程,10 天,可用 17-10-2018年 800 美元。 

请注意,由 TAA 提供任何计划必须考虑到提交的客户,包括提供计划时,代理必须考虑的最大预算愿望 ($1200) 的所有需求。满足此特定的要求可能不是实际生产中,阻止使用其 BDI 模型打开到意图需求的代理。不适合的价格和其他需求的参数内没有计划可以完成任务。

中的 TAA 实现C#

现在,有个主意 TAA 的工作原理并联系,与它进行交互的方式来了解一下如何编写代码中的此类的代理C#。我将首先创建一个泛型的态度 < TA、 T > 类,要尽可能通用,时将理解任何态度 (相信、 欲望、 意图) 的所有特征在 BDI 代理体系结构中。此处提供此类:

public class Attitude<TA, T>
  {
    public T AttitudeRepresentation;
    public TA Label;
    public Attitude(TA label, T attitudeRepr)
    {
      Label = label;
      AttitudeRepresentation = attitudeRepr;
    }
  }

此类中,我有两个通用字段:用于标识态度 BDI 体系结构中的类型的 TA 和 T,表示与之关联的数据。中列出的枚举类型之一替代 T 的泛型参数图 2

图 2 作为 BDI 类中的 T 参数使用的枚举类型

public enum DesireType
{
  Visit, Budget, Date
}
public enum BeliefType
{
  TourPackages
}
public enum IntentionType
{
  BookTourPackage
}

这些枚举可以被视为在任意给定时刻的一套需求、 信仰和代理的意图。最后,抽象 Bdi < T > 类所示图 3

图 3 Bdi < T > 类

public abstract class Bdi<T>
  {
    public IEnumerable<Attitude<BeliefType, T>> Beliefs { get; set; }
    public IEnumerable<Attitude<DesireType, T>> Desires { get; set; }
    public IEnumerable<Attitude<DesireType, T>> Intentions { get; set; }
    protected Bdi(IEnumerable<Attitude<BeliefType, T>> beliefs)
    {
      Beliefs = new List<Attitude<BeliefType, T>>(beliefs);
      Desires = new List<Attitude<DesireType, T>>();
      Intentions = new List<Attitude<DesireType, T>>();
    }
    protected abstract IEnumerable<Attitude<IntentionType, T>> Deliberate(
      IEnumerable<Attitude<DesireType, T>> desires);
    protected abstract T MeansEndsReasoning(IEnumerable<Attitude<IntentionType,
      T>> intentions);
}

Bdi < T > 类关联到 BDI 体系结构和其基本原理,但具有具有 TAA 没有直接关系。请注意,在 Bdi < T > 类中,我只需提供一个映射 (深思熟虑和 MeansEndsReasoning 方法的抽象版本) 创建 BDI 模型。因此,Bdi < T > 类用于为一个蓝图实现 BDI 代理体系结构上的任何设备、 程序和类似。请注意,省略了此类中的一种方法 UpdateBeliefs。某一特定条件满足 (例如,考虑或平均值结束推理) 并匹配前面详细介绍 Brf 函数后,此过程将更新信仰数据集。它已被保留到读取器和其特定的条件,以创建此类的更新方法。

表示 Assistant 旅行社 Taa < T > 类继承自 Bdi < T > 和其构造函数,并继承的方法实现所示图 4

图 4 Taa < T > 类构造函数和继承的方法

public class Taa<T> : Bdi<T> where T: Dictionary<string, string>
  {
    public Taa(IEnumerable<Attitude<BeliefType, T>> beliefs) : base(beliefs)
    {
    }
    public T GetPlan(IEnumerable<Attitude<DesireType, T>> desires)
    {
      return MeansEndsReasoning(Deliberate(desires));
    }
    protected override IEnumerable<Attitude<IntentionType, T>>
      Deliberate(IEnumerable<Attitude<DesireType, T>> desires)
    {
      return LookForTours(desires.ToList());
    }
    protected override T MeansEndsReasoning(IEnumerable<Attitude<IntentionType,
      T>> intentions)
    {
      return intentions.FirstOrDefault() == null ?  null :
        intentions.First().AttitudeRepresentation;
    }
  }

在 Taa 类中,考虑出现在有意方法,后者最终调用 LookForTours 方法,如中所示图 5。它在这种方法是,通过联系回绕的需求由针对信仰信仰集中放查找可能的满意度。请记住,在示例模型中,每个相信表示教程包。如果找到此类包,则它被添加到的意图是什么,所有这些包含预订教程包的结果列表。然后,在 MeansEndsReasoning 方法中,有一个简单的逻辑我的第一个可行的教程包作为返回假日意图为旅游。

图 5 LookForTours 方法

private IEnumerable<Attitude<IntentionType, T>>
  LookForTours<T>(List<Attitude<DesireType, T>> desires) where T : Dictionary<string, string>
  {
    var visitDesire = desires.First(d => d.Label == DesireType.Visit);
    var dateDesire = desires.First(d => d.Label == DesireType.Date);
    var maxBudgetDesire = desires.First(d => d.Label == DesireType.Budget);
    var citiesToVisit = visitDesire.AttitudeRepresentation["visiting"]
      .Split(',');
    var dateFrom = dateDesire.AttitudeRepresentation["from"];
    var days = int.Parse(dateDesire.AttitudeRepresentation["days"]);
    var maxBudget =
      double.Parse(maxBudgetDesire.AttitudeRepresentation["max"]);
    var tourPackages = Beliefs.Where(b => b.Label == BeliefType.TourPackages);
    var result = new List<Attitude<IntentionType, T>>();
    foreach (var tourPackage in tourPackages)
    {
      var data = tourPackage.AttitudeRepresentation as Dictionary<string, string>;
      var starts = data["starts"];
      var daysTour = int.Parse(data["days"]);
      var cities = data["cities"].Split(',');
      var price = double.Parse(data["price"]);
      if (daysTour <= days &&
        cities.Intersect(citiesToVisit).Count() == cities.Length &&
        starts == dateFrom &&
        price < maxBudget)
      {
        result.Add(new Attitude<IntentionType, T>(IntentionType.BookTourPackage,
          tourPackage.AttitudeRepresentation as T));
      }
    }
    return result;
  }

使用不同的策略,您可以返回教程包或最低价格或持续时间最长的意图。在这种情况下,为了简单起见,我输出的第一个意图。GetPlan 方法应返回的操作或要旅游的需求执行的操作集。在这种情况下,(预订教程包) 的操作与的意图和 MeansEndsReasoning 方法的结果集。

最后,我测试我 TAA 在控制台应用程序中所示图 6。那里我创建一些虚拟数据,如信仰,集的需求,创建一系列旅游,然后对于这种要求有了一个计划。

图 6 Program 类

class Program
  {
    static void Main(string[] args)
    {
      var beliefs = new List<Attitude<BeliefType, Dictionary<string, string>>>
      {
        new Attitude<BeliefType, Dictionary<string, string>>(
          BeliefType.TourPackages,
          new Dictionary<string, string> { { "tour", "Essential-Cuba" },
          { "starts" , "Anytime" }, { "days" , "7"}, { "cities", "HAV, VAR, TRI" }, 
          { "price" , "800"}, { "operator" , "www.cubamaniatour.com" }}),
        new Attitude<BeliefType, Dictionary<string, string>>(
          BeliefType.TourPackages,
          new Dictionary<string, string> { { "tour", "Cuba Beaches Holiday" },
          { "starts", "10-12-2018" }, { "days" , "8"}, { "cities", "HAV, VAR" }, 
          { "price" , "800"}, { "operator" , "www.cubamaniatour.com" }}),
        new Attitude<BeliefType, Dictionary<string, string>>(
          BeliefType.TourPackages,
          new Dictionary<string, string> { { "tour", "Havana & Varadero Tour" },
          { "starts", "12-15-2018" }, { "days" , "15"}, { "cities", "HAV,
            VAR, TRI" }, 
          { "price" , "800"}, { "operator" , "www.cubamaniatour.com" }}),
        new Attitude<BeliefType, Dictionary<string, string>>(
          BeliefType.TourPackages,
          new Dictionary<string, string> { { "tour", "Discover Cuba" },
          { "starts", "12-15-2018" }, { "days", "15"}, { "cities", "HAV,
            VAR, TRI" }, 
          { "price" , "800"}, { "operator" , "www.cubamaniatour.com" }}),
        new Attitude<BeliefType, Dictionary<string, string>>(
          BeliefType.TourPackages,
          new Dictionary<string, string> { { "tour", "Classic Car Tour" },
          { "starts", "12-15-2018" }, { "days", "10"}, { "cities", "HAV,
            VAR, TRI" }, 
          { "price" , "800"}, { "operator" , "www.cubamaniatour.com" }}),
        new Attitude<BeliefType, Dictionary<string, string>>(
          BeliefType.TourPackages,
          new Dictionary<string, string> { { "tour", "Havana Explorer" },
          { "starts", "12-15-2018" }, { "days", "3"}, { "cities", "HAV,
            VAR, TRI" }, 
          { "price" , "800"}, { "operator" , "www.cubamaniatour.com" }}),
        new Attitude<BeliefType, Dictionary<string, string>>(
          BeliefType.TourPackages,
          new Dictionary<string, string> { { "tour", "Trinidad Time" },
          { "starts", "12-15-2018" }, { "days", "7"}, { "cities", "HAV,
            VAR, TRI" }, 
          { "price" , "800"}, { "operator" , "www.cubamaniatour.com" }}),
      };
      var taa = new Taa<Dictionary<string, string>>(beliefs);
      var desires = new List<Attitude<DesireType, Dictionary<string, string>>>
      {
        new Attitude<DesireType, Dictionary<string, string>>(DesireType.Visit,
          new Dictionary<string, string> { {"visiting", "HAV, VAR" } }),
        new Attitude<DesireType, Dictionary<string, string>>(DesireType.Budget,
          new Dictionary<string, string> { {"max", "1000" } }),
        new Attitude<DesireType, Dictionary<string, string>>(DesireType.Date,
          new Dictionary<string, string> { {"from", "10-12-2018" },
            {"days" , "9"  }})
      };
      var tourPackage = taa.GetPlan(desires);
      Console.WriteLine(tourPackage == null ?
        "Sorry, no plan goes according to your details" : PrintPlan(tourPackage));
      Console.ReadLine();
    }

包含在程序的底部 PrintPlan 方法。它将打印包含属于其教程包选择了作为预订选项 TAA 教程运算符的数据的字典。PrintPlan 方法如下所示:

private static string PrintPlan(Dictionary<string, string> toPrint)
  {
    var result = "";
    foreach (var keyValue in toPrint)
    {
      result += keyValue.Key + ", " + keyValue.Value + '\n';
    }
    return result;
  }
}

结果获得后执行上一个试验代码所示图 7

旅游需求的 TAA 的输出
图 7 输出为旅游 TAA 的所需的完成

在本文中我介绍了需求的信仰意图 (BDI) 体系结构。我所述从理论角度来看此代理体系结构,所述的基本原理 TAA 以及它会起作用,并显示在中的实现的方式C#其中 TAA 已使用 BDI 体系结构实现。最后,TAA 代码已测试,我介绍了,通过一个简单的控制台应用程序,如何使用它来联系以获取匹配他们所的需求 (最大的预算、 城市访问、 日期、 时间和的详细信息) 的假日计划对书籍教程包的选项。现在,它是您要扩展此处介绍的简单 BDI 模型并使其满足您自己的需求。


Arnaldo Pérez Castaño是总部位于塞尔维亚贝尔格莱德,负责对 P3 数字服务的 P3 组中,正使用德语的跨国公司,总部位于亚琛子公司的工作计算机科学家。他是"实际人工智能-机器学习、 机器人和代理解决方案使用C#"(Apress,2018年),"PrestaShop Recipes 》 (Apress 2017) 以及一系列编程书籍 —"JavaScript Fácil"、"HTML y CSS Fácil"和"PythonFácil"(Marcombo 南美洲)— 和他的写入VisualStudioMagazine.com和 Smashing 杂志。他是古巴在内教程的共同创始人之一 (cubamaniatour.com) 和他的专长包括 Visual Basic 中, C#,.NET Framework 和人工智能。电影和音乐是他的一些爱好。通过 arnaldo.skywalker@gmail.com 与他联系。

衷心感谢以下 Microsoft 技术专家对本文的审阅:James McCaffrey