首页 理论 架构 工程 文档 白皮书 著作 研究 案例 下载 博客 关于 开始使用 →

第205章 Relation Class|关系类 建立对象之间的动态关系

第205章 Relation Class|关系类

建立对象之间的动态关系

第204章已经完成:

Element
 ↓
Object
 ↓
Attribute

此时,ICAI 已经能够描述一个对象本身。

例如:

Egg Object
鸡蛋对象
 │
 ├── Position
 ├── Distance
 ├── Pressure
 ├── Force
 └── Stability

但是现实世界并不是由一个个孤立对象组成的。

真正的场景中存在大量对象之间的关系:

Hand → near → Egg
Hand → contacts → Egg
Egg → on → Table
Obstacle → near → Egg

而且这些关系会随着现实状态不断变化。

因此,本章建立:

Object
对象
 ↓
Relation Class
关系类
 ↓
Relation Instance
关系实例

205.1 Relation|关系

ICAI 中的 Relation(关系)用于描述:

一个对象与另一个对象之间当前存在的认知关系。

最基本的关系结构:

Relation=(Subject,Type,Object,State)Relation=(Subject,Type,Object,State)

即:

Subject
主体

Type
关系类型

Object
目标对象

State
关系状态

例如:

Hand → near → Egg

可以表示为:

Subject = Hand
Type    = near
Object  = Egg
State   = active

因此 Relation 本身也是一个软件对象。


205.2 为什么关系不能只是字符串

传统程序可能直接保存:

$relation = "hand_near_egg";

但是这对于 ICAI 不够。

系统需要知道:

谁?
与谁?
什么关系?
什么时候建立?
当前是否有效?
关系强度是多少?
关系是否正在变化?

因此:

"near"

只是关系类型。

真正的 Relation 应该是:

Hand
 +
near
 +
Egg
 +
Current State

205.3 Relation Class|关系类

建立基础 Class:

class Relation
{
    protected $subject;
    protected $type;
    protected $object;
    protected $state;
    protected $timestamp;
}

这里:

subject
关系主体

type
关系类型

object
关系目标

state
关系状态

timestamp
关系时间

205.4 Constructor|关系构造

class Relation
{
    protected $subject;
    protected $type;
    protected $object;
    protected $state;
    protected $timestamp;

    public function __construct(
        Object $subject,
        $type,
        Object $object
    ) {
        $this->subject = $subject;
        $this->type = $type;
        $this->object = $object;
        $this->state = 'active';
        $this->timestamp = time();
    }
}

于是可以创建:

$relation = new Relation(
    $hand,
    'near',
    $egg
);

形成:

Hand
 ↓
near
 ↓
Egg

205.5 Relation Instance|关系实例

Class 只是关系结构。

真正运行的是 Relation Instance:

$handEggRelation = new Relation(
    $hand,
    'near',
    $egg
);

此时:

Relation Class
      ↓
Relation Instance
      ↓
Hand → near → Egg

同一个 Relation Class 可以创建大量不同关系实例:

Hand → near → Egg

Hand → contacts → Egg

Egg → on → Table

Obstacle → near → Egg

并不需要为每一种关系建立独立 PHP 程序。


205.6 Subject / Object|主体与目标

Relation 必须能够明确两个对象。

例如:

Hand → contacts → Egg

其中:

Subject = Hand
Object  = Egg

代码:

public function getSubject()
{
    return $this->subject;
}

public function getObject()
{
    return $this->object;
}

因此系统可以获得:

$relation->getSubject();
$relation->getObject();

205.7 Relation Type|关系类型

关系类型是 Relation 的核心。

例如:

near
接近

far
远离

contacts
接触

holds
持有

on
位于其上

inside
位于内部

blocks
阻挡

moves_toward
向……移动

supports
支撑

代码:

public function getType()
{
    return $this->type;
}

例如:

$relation->getType();

返回:

contacts

205.8 动态关系

ICAI 最重要的不是建立静态关系,而是建立:

Dynamic Relation|动态关系。

例如机械手靠近鸡蛋:

Distance = 20cm

此时:

Hand → far → Egg

继续移动:

Distance = 5cm

关系变成:

Hand → near → Egg

继续移动:

Distance = 0

变成:

Hand → contacts → Egg

所以:

far
 ↓
near
 ↓
contacts

关系随着实时状态发生变化。


205.9 Relation State|关系状态

因此 Relation 需要自己的 State:

protected $state;

例如:

active
inactive
unknown
expired

提供:

public function getState()
{
    return $this->state;
}

public function updateState($state)
{
    $this->state = $state;
    $this->timestamp = time();
}

于是:

Relation
 ↓
State
 ↓
Dynamic Update

205.10 Relation Value|关系强度

某些关系并不是简单的 True / False。

例如:

Distance
距离

Contact Force
接触力度

Similarity
相似程度

Support
支撑程度

因此 Relation 后面可以拥有动态 Value:

Rt=f(O1,O2,Xt)R_t=f(O_1,O_2,X_t)

例如:

Hand → near → Egg
Distance = 0.05

再变成:

Distance = 0.01

关系仍然是 near,但关系状态已经发生变化。

这一层为后面的动态认知计算留下空间。


205.11 Relation 与 Object

Relation 不是孤立存在的。

它连接两个 Object:

Object A
   │
   ↓
Relation
   ↓
Object B

例如:

Hand
 ↓
contacts
 ↓
Egg

因此一个场景可以拥有:

Hand → near → Egg
Hand → on → Table
Egg → on → Table
Obstacle → near → Egg

最终形成关系网络:

Hand
 │
 ├── near → Egg
 │
 └── on → Table

Egg
 │
 └── on → Table

Obstacle
 │
 └── near → Egg

这已经开始接近 Scene 的结构。


205.12 Relation Collection|关系集合

与 Object 拥有多个 Element 一样,系统也需要管理多个 Relation。

可以建立:

class RelationManager
{
    protected $relations = array();

    public function addRelation(Relation $relation)
    {
        $this->relations[] = $relation;
    }

    public function getRelations()
    {
        return $this->relations;
    }
}

于是:

RelationManager
      │
      ├── Hand → near → Egg
      ├── Hand → contacts → Egg
      ├── Egg → on → Table
      └── Obstacle → near → Egg

形成动态关系集合。


205.13 Relation 的变化

现实场景中,关系会产生:

Create
创建

Update
更新

Change
变化

Remove
解除

例如:

Hand → near → Egg

继续运动:

Hand → contacts → Egg

抓取成功:

Hand → holds → Egg

松开:

Hand → holds → Egg
        ↓
Relation Removed

因此 Relation 是一个生命周期对象


205.14 不为场景编写关系程序

这里必须保持前面确定的工程原则。

不能:

EggSceneRelation.php
GlassSceneRelation.php
FruitSceneRelation.php

而应该:

Relation Class
      ↓
Relation Instance

例如:

Hand → contacts → Egg

Hand → contacts → Glass

Hand → contacts → Fruit

使用的仍然是:

Relation

区别来自:

Object
+
Attribute
+
State

而不是来自完全不同的程序。


205.15 Relation 与动态认知

到这里:

Object
 ↓
Attribute
 ↓
Relation

ICAI 已经不再只是知道:

“这里有一个鸡蛋。”

而开始知道:

“机械手正在接近鸡蛋。”

进一步:

“机械手已经接触鸡蛋。”

再进一步:

“机械手正在持有鸡蛋。”

这意味着机器认知开始从:

Object Recognition
对象识别

进入:

Object Relationship
对象关系

而关系是 Scene 形成的基础。


205.16 Relation Class 基础实现

本章可以先建立干净的基础版本:

<?php

class Relation
{
    protected $subject;
    protected $type;
    protected $object;
    protected $state;
    protected $timestamp;

    public function __construct(
        Object $subject,
        $type,
        Object $object
    ) {
        $this->subject = $subject;
        $this->type = $type;
        $this->object = $object;
        $this->state = 'active';
        $this->timestamp = time();
    }

    public function getSubject()
    {
        return $this->subject;
    }

    public function getType()
    {
        return $this->type;
    }

    public function getObject()
    {
        return $this->object;
    }

    public function getState()
    {
        return $this->state;
    }

    public function getTimestamp()
    {
        return $this->timestamp;
    }

    public function updateState($state)
    {
        $this->state = $state;
        $this->timestamp = time();
    }
}

205.17 一个最简单的运行实例

建立三个 Object:

$hand = new Object(
    1001,
    'device',
    'Robot Hand'
);

$egg = new Object(
    1002,
    'physical_object',
    'Egg'
);

$table = new Object(
    1003,
    'environment',
    'Table'
);

建立关系:

$relation1 = new Relation(
    $hand,
    'near',
    $egg
);

$relation2 = new Relation(
    $egg,
    'on',
    $table
);

运行时得到:

Robot Hand
     │
     ↓ near
     │
    Egg
     │
     ↓ on
     │
   Table

这已经不是静态文本描述,而是:

Object Instance
+
Relation Instance

构成的实际软件对象关系。


205.18 本章形成的结构

到第205章结束:

Element
元素
 ↓
Object
对象
 ↓
Attribute
属性
 ↓
Relation
关系

软件层面:

Element Class
      ↓
Object Class
      ↓
Attribute Class
      ↓
Relation Class

运行层面:

Element Instance
      ↓
Object Instance
      ↓
Attribute Instance
      ↓
Relation Instance

最终形成:

        Object A
           │
           ↓
       Relation
           ↓
        Object B

205.19 本章核心结论

Relation Class 将 ICAI 从“单个对象认知”推进到“对象之间的动态关系认知”。

而且 Relation 本身也是一个可以:

Create
创建

Update
更新

Evaluate
评价

Change
变化

Remove
解除

的软件对象。

因此 ICAI 的软件对象体系进一步形成:

Real-Time Data
实时数据
 ↓
Element
元素
 ↓
Object
对象
 ↓
Attribute
属性
 ↓
Relation
关系

下一章进入:

第206章 State Class|状态类

核心解决:

Object
+
Attribute
+
Relation
+
Real-Time Change
        ↓
State
状态

也就是让 ICAI 不只是知道对象和关系是什么,而能够明确表示:

对象、属性和关系在当前这一时刻究竟处于什么状态。

Leave a Reply

Your email address will not be published. Required fields are marked *