这一章可以把重点收回来:第203章建立 Object Class,第208章专门解决“类如何在运行时成为一个真实对象实例”。这样后面才能进入认知运行时。
第208章 Object Instance|对象实例
Class → Object Instance → Current State
第203章已经建立:
Object Class
对象类
第204章建立:
Attribute Class
属性类
第205章建立:
Relation Class
关系类
第206章建立:
State Class
状态类
第207章建立:
Scene Class
场景类
现在需要解决一个更基础的工程问题:
Class 定义出来以后,机器运行时如何真正产生一个可以被感知、更新、计算和操作的 Object Instance?
因此,本章不再讨论“什么是对象”,而是进入:
Class
类
↓
Object Instance
对象实例
↓
Current State
当前状态
208.1 Class 不是现实对象
在 PHP OOP 中:
class Object
{
}
只是一个结构定义。
它本身并不是现实中的某一个具体对象。
例如:
Object Class
对象类
只是规定:
一个对象应该具有什么结构
真正运行以后才产生:
Object Instance
对象实例
例如:
$egg = new Object();
此时:
Object Class
↓
new
↓
$egg
↓
Object Instance
208.2 Object Instance|对象实例
Object Instance 是:
Object Class 在当前运行环境中形成的一个具体对象。
例如:
Object Class
↓
new
↓
Egg Instance
可以同时存在:
Egg #001
Egg #002
Egg #003
它们来自同一个 Class:
Object Class
但每一个 Instance 都具有自己的:
Element
Attribute
Relation
State
208.3 为什么必须使用 Instance
ICAI 面对的是现实世界中的具体对象。
例如:
鸡蛋A
鸡蛋B
鸡蛋C
它们虽然都可以归属于:
Egg Object Type
但它们的实时状态不同:
Egg A
Position = ...
Pressure = 0.10
Egg B
Position = ...
Pressure = 0.00
Egg C
Position = ...
Pressure = 0.25
因此:
Class
描述共同结构。
而:
Instance
保存具体对象的实时信息。
208.4 Object Identity|对象身份
每一个 Object Instance 必须具有自己的身份。
例如:
$egg = new Object(
1001,
'Egg'
);
其中:
ID = 1001
Type = Egg
再创建:
$egg2 = new Object(
1002,
'Egg'
);
于是:
Egg Class
│
├── Egg Instance #1001
│
└── Egg Instance #1002
两个对象属于同一种对象类型,但不是同一个对象。
208.5 Object Instance 的基本结构
可以把 Object Instance 看成:
Object Instance
│
├── ID
├── Type
├── Elements
├── Attributes
├── Relations
└── Current State
其中最重要的是:
Current State
当前状态
因为 ICAI 处理的不是静态对象,而是:
持续变化的现实对象。
208.6 Current State|当前状态
一个对象不能只表示:
Egg
还必须知道:
这个 Egg 现在怎么样?
例如:
Egg #1001
Position = [20,10,30]
Pressure = 0.12
Velocity = 0
Contact = true
Stability = 0.91
这些实时数据经过状态计算以后形成:
Current State
当前状态
例如:
State = being_contacted
因此:
Object Instance
↓
Current State
是运行时非常重要的一层。
208.7 State 属于 Instance,而不是 Class
这是本章一个重要原则。
Class 可以定义:
Egg Object
但是 Class 不应该保存:
Egg #1001 当前在哪里
Egg #1001 当前受到多大压力
Egg #1001 当前是否被抓取
因为这些都是 Instance 的实时信息。
因此:
Class
↓
定义结构
而:
Instance
↓
保存当前现实状态
形成:
Object Class
↓
Object Instance
↓
Current State
208.8 PHP Object Instance
建立基础 Object:
<?php
class Object
{
protected $id;
protected $type;
protected $name;
protected $attributes = array();
protected $relations = array();
protected $state = null;
public function __construct(
$id,
$type,
$name = null
) {
$this->id = $id;
$this->type = $type;
$this->name = $name;
}
public function getId()
{
return $this->id;
}
public function getType()
{
return $this->type;
}
public function getName()
{
return $this->name;
}
}
现在:
$egg = new Object(
1001,
'physical_object',
'Egg'
);
就形成了:
Object Instance
ID = 1001
Type = physical_object
Name = Egg
208.9 Instance Attribute|实例属性
继续把第204章的 Attribute 接入。
public function addAttribute(Attribute $attribute)
{
$this->attributes[$attribute->getName()] = $attribute;
}
于是:
$egg->addAttribute($position);
$egg->addAttribute($pressure);
$egg->addAttribute($force);
形成:
Egg Instance
│
├── Position
├── Pressure
└── Force
这些属性属于:
Egg #1001
而不是所有 Egg 的公共状态。
208.10 Instance Relation|实例关系
同样,Relation 是具体对象之间的关系。
例如:
Hand #3001
↓
contacts
↓
Egg #1001
不是:
Hand Class
↓
contacts
↓
Egg Class
因此 Relation Instance 必须连接:
Object Instance
↓
Relation Instance
↓
Object Instance
也就是:
Hand Instance
↓
Relation
↓
Egg Instance
208.11 Current State 的更新
Object Instance 必须能够更新状态。
public function setState(State $state)
{
$this->state = $state;
}
读取:
public function getState()
{
return $this->state;
}
于是:
$egg->setState($eggState);
形成:
Egg Instance
↓
Current State
208.12 状态不是固定的
例如最初:
Egg #1001
State = stationary
机械手靠近:
State = being_approached
接触:
State = contacted
抓取:
State = held
移动:
State = moving
释放:
State = released
注意:
这不是给鸡蛋写:
Egg.php
然后把所有行为写死。
而是同一个:
Object Instance
随着实时数据、属性和关系发生变化:
Current State
不断更新。
208.13 Object Instance 是动态的
因此:
Object Instance
不是:
创建一次
↓
永远不变
而是:
Create
创建
↓
Observe
感知
↓
Update
更新
↓
Evaluate
计算
↓
State Change
状态变化
↓
Continue
继续运行
这就是后面 Cognitive Runtime 的对象基础。
208.14 从实时数据到对象实例
在 ICAI 中,Object Instance 并不一定必须由人工直接写死。
可以由实时数据逐步形成:
Real-Time Data
实时数据
↓
Element
元素
↓
Element Group
元素集合
↓
Object Instance
对象实例
例如传感器获得:
Position
Pressure
Contact
Velocity
Shape
系统通过 Object Model 将这些元素组织成:
Egg Instance
于是:
Real World
现实世界
↓
Real-Time Data
↓
Element
↓
Object Instance
208.15 Object Instance 与 Scene Instance
第207章建立了 Scene。
因此现在可以形成:
Scene Instance
↓
Object Instance
例如:
Scene #5001
│
├── Hand #3001
├── Egg #1001
└── Table #2001
每一个都是具体 Instance。
而不是 Class。
完整结构:
Scene Instance
│
├── Object Instance
│ ├── Attributes
│ └── Current State
│
├── Object Instance
│ ├── Attributes
│ └── Current State
│
└── Relations
208.16 一个完整实例
例如当前场景:
Scene #5001
其中:
Hand #3001
Egg #1001
Table #2001
Egg 当前:
Position = [20,10,30]
Pressure = 0.15
Velocity = 0
Contact = true
于是:
Egg #1001
↓
Attributes
↓
Current State
↓
contacted
同时:
Hand #3001
↓
contacts
↓
Egg #1001
最终形成:
Scene #5001
│
├── Hand #3001
│
├── Egg #1001
│ │
│ └── Current State
│
├── Table #2001
│
└── Hand #3001
↓
contacts
↓
Egg #1001
208.17 Instance 与行为逻辑的连接
到这里,ICAI 的对象已经具备:
Identity
身份
Attributes
属性
Relations
关系
Current State
当前状态
下一步才能真正讨论:
Current State
↓
Cognition
↓
Method
↓
Action
也就是说:
行为不是直接从 Class 产生,而是从运行中的 Object Instance 当前状态出发。
这对于模拟人的行为逻辑非常重要。
人不是面对:
Egg Class
而是面对:
这个具体的鸡蛋
并根据:
它现在在哪里
它现在是否接触
它现在受到多大压力
它现在是否稳定
决定下一步行为。
208.18 不为每个对象写专用行为程序
同样保持前面确定的原则:
不能建立:
GrabEgg.php
GrabGlass.php
GrabFruit.php
GrabBottle.php
然后分别编写固定行为。
而应该:
Object Instance
↓
Current State
↓
Dynamic Parameters
↓
Method
↓
Action
例如:
Object = Egg
Pressure = 0.15
Distance = 0
Stability = 0.91
这些参数进入后面的 Method。
方法根据动态输入计算动作。
因此:
对象不同、状态不同、参数不同,并不意味着必须重新编写一套行为程序。
这才符合你前面提出的“模拟人的行为逻辑”。
208.19 Object Instance 的生命周期
一个完整 Object Instance 可以经历:
Create
创建
↓
Detect
检测
↓
Instantiate
实例化
↓
Update
更新
↓
Relate
建立关系
↓
State Change
状态变化
↓
Cognition
认知
↓
Action
动作
↓
Feedback
反馈
↓
Update
再次更新
因此 Object Instance 实际上是:
连接现实世界数据与机器行为逻辑的运行对象。
208.20 本章软件结构
到第208章,可以形成:
Object Class
│
├── Object Identity
├── Attribute Collection
├── Relation Collection
└── State
↓
Object Instance
↓
Current State
更完整地:
Real-Time Data
↓
Element Instance
↓
Object Instance
│
├── Attributes
│
├── Relations
│
└── Current State
↓
Scene Instance
208.21 本章核心结论
第208章真正解决的是:
如何让 ICAI 的“对象类”进入实时运行,成为一个具有身份、属性、关系和当前状态的具体对象实例。
因此:
Class
类
↓
定义对象结构
Object Instance
对象实例
↓
代表现实中的具体对象
Current State
当前状态
↓
表示这个具体对象此时此刻的现实状态
最终形成:
Object Class
对象类
↓
Instantiate
实例化
↓
Object Instance
对象实例
↓
Attributes
属性
↓
Relations
关系
↓
Current State
当前状态
而这个 Object Instance 将成为后续认知方法、行为逻辑和动作执行的直接运行主体。
换句话说,从这一章开始,ICAI 中的 Object 不再只是理论上的“认知对象”,而开始成为一个可以在软件运行时持续存在、持续变化、持续被计算的工程对象。