【发布时间】:2021-09-24 22:58:54
【问题描述】:
我很难理解如何将基于规则的决策制定方法结合到我尝试开发的基于代理的模型中。
agent的界面很简单。
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 必须考虑代理的当前状态、接收到的感知类型并相应地更改状态。因此,为了让国家反映这一点,例如Supervisor 收到一条命令,可以修改如下:
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));
}
【问题讨论】:
-
这几天我一直在思考这个问题。我不喜欢 VehicleState 包含有关其他车辆及其位置的信息。因为车辆在规则中可能使用的每一点信息(可能是大量信息)都是其状态的一部分。也许 VehicleStateUpdater 应该封装世界状态?然后车辆不需要知道一天中的时间、其他车辆在哪里、它们载有多少货物等 - 它只需要知道它自己的位置和货物。
-
然后问题从“车辆如何知道所有其他车辆的位置?”转至“VehicleStateUpdater 如何与实时世界状态信息保持同步?”
-
@JerryJeremiah 感谢您的意见。让 StateUpdater 封装世界状态(环境类,因为它是从基于代理的角度调用的)是一个好主意。也许这样一个规则可以同时考虑代理的内部状态和世界状态(环境)。
标签: simulation rules rule-engine agent-based-modeling traffic-simulation