【论文复现】插秧机的任务规划

导读

在进行任务规划的时候,可以使用图论进行规划。每一个节点作为任务过程中的一个状态。而节点之间的连线既可以表示状态转移顺序,又可以用来表示活动名称。通过最大生成子图,我们可以求出状态之间的最短路径或者是最大流等问题。

那么,是不是知识图谱也能够构建这样一张图?同样是将状态作为节点,同样是将状态转变顺序作为节点间关系,同样是使用图论方法求解点与点之间的最短路径,同样是需要求解实际中的最大流问题。听起来一点问题都没有。

那么来试试?

广告

微信公众号上也有同步更新哦,快来看看吧!

在这里插入图片描述

现在扫码关注,以后你就是老粉啦!

数据集

为了更快地访问速度,我把数据和代码全部放在这里了:点击这里传送

开始实验

首先明确,我们要构建知识图谱的话就需要一个三元组,其中需要包括:

  • 主体
  • 客体
  • 关系

看起来很简单,试试看吧。

说到知识图谱的话,那一定就是py2neo了;说到csv文件读取的话,那一定就是pandas了。既然这样,我们就先来确定一下最基本的配置项:

import os
import pandas as pd
from py2neo import Node, Graph, Relationship, NodeMatcher
# 配置类
class CONFIG(enumerate):
  # Neo4j地址
  URL = 'http://172.17.0.1:1074'
  # 用户名
  USERNAME = 'neo4j'
  # 密码
  PASSWORD = 'password'
  # csv文件路径
  CSV = os.getcwd() + '/task_architect.csv'
  pass

然后我们再确认一下图的连接:

graph = Graph(
  CONFIG.URL,
  username=CONFIG.USERNAME,
  password=CONFIG.PASSWORD
)

如果Graph里的任何一个参数不正确,都会报连接失败的错。没有报错就是正确的。

为了更好地处理数据,我们把数据拉出来:

dictionary = pd.DataFrame({
  'subject': list(self.raw_data['subject']),
  'object': list(self.raw_data['object']),
  'relation': list(self.raw_data['relation'])
})

然后创建节点:

for key in dictionary['subject']:
  self.graph.create(Node('subject', name=key))
  pass
for key in dictionary['object']:
  self.graph.create(Node('object', name=key))
  pass

最后创建关系:

for item in range(0, len(self.dictionary)):
  matcher = NodeMatcher(graph)
  try:
    graph.create(
      Relationship(
        matcher.match('subject').where(f"_.name='{self.dictionary['subject'][item]}'").first(),
        dictionary['relation'][item],
        matcher.match('object').where("_.name='" + self.dictionary['object'][item] + "'").first()
      )
    )
    pass
  except AttributeError as ae:
    print(item, ae)
    pass
  pass
pass

在这里,where函数在官方文档里面的介绍应当是这样:

where('_.name="%s"' % string)

或者在Python3里面可以这样:

where(f'_.name="{ string }"')

但是实际上,也是可以直接加入参数:

where(name=string)

有了这些之后,我们最后来执行一下看看成果:

在这里插入图片描述

离谱!这建立的是个什么玩意儿!这和说好的任务状态网完全不一样啊!

那么,聪明的你,会在哪里看到蹊跷呢?

没错,节点的颜色不一样。

既然都是同一张网上的同类任务,那就一定是同样的类型、同样的颜色。

所以,在创建节点的时候,应当使用同样的类别。

开始实验V2.0

于是我们修改一下创建节点部分:

for key in set(
  dataImporter.raw_data['subject'])
  .union(set(
    dataImporter.raw_data['object']
  )):
      self.graph.create(Node('subject', name=key))
      pass

于是,所有的集合全部放在了一起,并且去掉了重复的内容。

既然节点改了,创建关系的部分也就需要修改一下:

for item in range(0, len(self.dictionary)):
  try:
    self.graph.create(
      Relationship(
        self.matcher.match('subject').where(f"_.name='{self.dictionary['subject'][item]}'").first(),
        self.dictionary['relation'][item],
        # 将标签从object改成subject
        self.matcher.match('subject').where(f"_.name='{self.dictionary['object'][item]}'").first()
      )
    )
    pass
  except AttributeError as ae:
    print(item, ae)
    pass
  pass
pass

可以看到,注释的地方和上面确实有所不同。

我们重新试试:

在这里插入图片描述

现在才看起来像一张网嘛。

最短路径

既然有了这样一张错综复杂的图,我们就能够使用图论进行分析了。不过,知识图谱也给我们封装好了一些求解最短路径的查询接口。

Neo4j中我们使用语句:

MATCH (r:subject{name:'副变速手柄切入“田间作业档”或“路上行驶档”'}),
      (s:subject{name:'推动主变速手柄'}),
      p=shortestpath((r)-[*..10]-(s))
RETURN p

意思就是:

  1. 确认起点 r r r
  2. 确认终点 s s s
  3. 查出 r r r s s s的最短路径 p p p
  4. 使用shortestpath查询语句。其中, r r r s s s之间的中括号表示查询条件,这里是指度最大为 10 10 10
  5. 返回路径 p p p

于是Neo4j中也返回了结果:

在这里插入图片描述

相当完美不是吗?

是不是有点能理解了呢?

参考文献

[1]汪鑫禹. 基于知识图谱的自主作业插秧机任务规划研究[D].安徽农业大学,2020.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ordinary_brony

代码滞销,救救码农

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值