我很难理解如何在我尝试开发的基于代理的模型中结合基于规则的决策制定方法。
代理的界面非常简单。
public interface IAgent
{
public string ID { get; }
public Action Percept(IPercept percept);
}
为了这个例子,让我们假设代理代表车辆,它们在一个大型仓库内穿过道路,以装载和卸载他们的货物。他们的路线(道路序列,从起点到代理的目的地)由另一个代理,主管分配。车辆代理的目标是遍历其指定的路线,卸载货物,装载新的,接收主管指定的另一条路线并重复该过程。
车辆还必须意识到潜在的碰撞,例如在交叉点,并根据某些规则给予优先权(例如,载有最重货物的车辆具有优先权)。
据我了解,这是我要构建的代理的内部结构:
所以车辆代理可以是这样的:
public class Vehicle : IAgent
{
public VehicleStateUpdater { get; set; }
public RuleSet RuleSet { get; set; }
public VehicleState State { get; set; }
public Action Percept(IPercept percept)
{
VehicleStateUpdater.UpdateState(VehicleState, percept);
Rule validRule = RuleSet.Match(VehicleState);
VehicleStateUpdater.UpdateState(VehicleState, validRule);
Action nextAction = validRule.GetAction();
return nextAction;
}
}
对于 Vehicle 代理的内部状态,我正在考虑类似:
public class VehicleState
{
public Route Route { get; set; }
public Cargo Cargo { get; set; }
public Location CurrentLocation { get; set; }
}
对于此示例,必须为车辆代理实施 3 条规则。
- 如果另一辆车在代理附近(例如小于 50 米),则货物最重的那辆优先,其他代理必须保持其位置。
- 当代理到达目的地时,他们卸下货物,装载新货物并等待主管分配新路线。
- 在任何给定时刻,无论出于何种原因,主管都可能发送命令,接收车辆必须遵守该命令(保持位置或继续)。
VehicleStateUpdater 必须考虑代理的当前状态、接收到的感知类型并相应地更改状态。因此,为了使状态反映例如主管收到了一条命令,可以按如下方式对其进行修改:
public class VehicleState
{
public Route Route { get; set; }
public Cargo Cargo { get; set; }
public Location CurrentLocation { get; set; }
// Additional Property
public RadioCommand ActiveCommand { get; set; }
}
其中 RadioCommand 可以是值为 None、Hold、Continue 的枚举。
但是现在我还必须在代理状态下注册,如果另一辆车正在接近。所以我必须向 VehicleState 添加另一个属性。
public class VehicleState
{
public Route Route { get; set; }
public Cargo Cargo { get; set; }
public Location CurrentLocation { get; set; }
public RadioCommand ActiveCommand { get; set; }
// Additional properties
public bool IsAnotherVehicleApproaching { get; set; }
public Location ApproachingVehicleLocation { get; set; }
}
这就是我很难理解如何进行的地方,而且我觉得我并没有真正遵循正确的方法。首先,我不确定如何使 VehicleState 类更加模块化和可扩展。其次,我不确定如何实现定义决策过程的基于规则的部分。我应该创建互斥规则(这意味着每个可能的状态必须对应不超过一个规则)?是否有一种设计方法可以让我添加额外的规则,而不必来回切换 VehicleState 类并添加/修改属性,以确保代理的内部状态可以处理每种可能的 Percept 类型?
我已经看过《人工智能:现代方法》教材和其他资源中演示的示例,但是当必须设计更复杂的模型时,可用示例太简单了,我无法“掌握”相关概念。
如果有人能指出关于基于规则部分的实施的正确方向,我将不胜感激。
我正在用 C# 编写,但据我所知,它与我试图解决的更广泛的问题并不真正相关。
更新:
我尝试合并的规则示例:
public class HoldPositionCommandRule : IAgentRule<VehicleState>
{
public int Priority { get; } = 0;
public bool ConcludesTurn { get; } = false;
public void Fire(IAgent agent, VehicleState state, IActionScheduler actionScheduler)
{
state.Navigator.IsMoving = false;
//Use action scheduler to schedule subsequent actions...
}
public bool IsValid(VehicleState state)
{
bool isValid = state.RadioCommandHandler.HasBeenOrderedToHoldPosition;
return isValid;
}
}
我也尝试实施的代理决策者示例。
public void Execute(IAgentMessage message,
IActionScheduler actionScheduler)
{
_agentStateUpdater.Update(_state, message);
Option<IAgentRule<TState>> validRule = _ruleMatcher.Match(_state);
validRule.MatchSome(rule => rule.Fire(this, _state, actionScheduler));
}