swift - 神经网络如何从无法直接控制的外部条件的测试输出中学习
问题描述
为了简化问题并希望得到答案,我将提供我正在尝试做的事情的简化版本。
设置固定条件:
- 房间内允许的最大氧气量 = 100,000 单位
- 保持室内的目标氧气量 = 100,000 单位
- 每秒最大空气处理周期 == 每秒 3.0 个周期(最小值为 0.3)
- 每秒使用的能量(瓦特)是这个公式:(100w *cycles_per_second)SQUARED
- 每个“循环”添加到空气中的最大氧气 = 100 个单位(最少 0 个单位)
- 1 人每秒消耗 10 单位 O2
- 最多可入住 100 人(最少 1 人)
- 每个周期都会处理输入,并且每个周期都可以更改输出 - 但是,如果将输出作为输入反馈回来,它只会影响下一个周期。
可以说我有这些输入:
- A. 房间内的当前氧气(范围:为简单起见,0 到 1000 单位 - 可以标准化)
- B. 房间内的当前占用率(最大容量 0 到 100 人)OR/AND 可以更改为房间内所有人每秒使用的 O2 总量(每秒 0 到 1000 个单位)
- C. 空气处理每秒的当前周期(每秒 0.3 到 3.0 个周期)
- D.当前使用的能量(也就是上面的每秒电流周期*100再平方)
- E. 每个循环添加到空气中的当前氧气(0 到 100 个单位)
(可能的输出作为输入反馈?):
- F. 之前对每秒周期数的更改(+ 或 - 0.0 到 0.1 个周期/秒)
- G. 以前的周期 每个周期添加的 O2 单位(每个周期从 0 到 100 个单位)
- H. 之前更改为当前最多入住人数(0 至 100 人)
以下是我的程序可以采取的行动(输出):
- 通过递增/递减(每秒 0.0 到 0.1 个周期)改变每秒周期数
- 更改每个周期添加的 O2 单位(从每个周期 0 到 100 个单位)
- 更改当前最大入住人数(0 到 100 人)-(基本上允许强制减少入住人数,然后使其正常化回最大人数)
该计划的目标是保持以下平衡:
- 房间内接近 100,000 单位的 O2
- 永远不要让空间降至 0 单位的 O2。
- 允许目前每个房间最多可容纳 100 人,而不会强行移走人员(因为房间中的氧气会随着时间的推移而耗尽并且接近 0 个单位,应将人员从房间中移出至最低限度,然后允许最大限度地恢复随着越来越多的 02 添加回房间,增加到 100)
- 并理想地使用维持上述两个条件所需的最小能量(瓦特)。例如,如果房间的氧气减少到 90,000 单位,而目前房间里有 10 人(使用 02 每秒 100 单位),那么不要以每秒 3.0 个周期(90 千瓦)和每秒 100 单位的速度运行在 50 秒内总共补充 300 个单位(比消耗的 100 个单位多出 200 个单位)以补充不足的 10,000 个单位,总共使用了 4500 千瓦。- 以每秒 2.0 个周期 (40 kw) 的速度运行会更理想,这将在 100 秒内每秒产生 200 个单位(比消耗的单位多出 100 个单位),以补充 10,000 个单位的不足并总共使用使用 4000 千瓦。
注意:入住率可能会根据无法控制的外部因素从第二次波动到第二次(假设人们自由进出房间)。系统的唯一控制是通过及时更改下一个周期允许的最大容量来强制将人员移出房间和/或阻止新人进入房间(假设系统可以这样做)。我们不希望系统仅仅因为它每秒只能为 30 人全功率运行提供足够的 O2 输出而强制降低容量。我们有大量可用的氧气,需要一段时间才能耗尽到危险水平,并且需要系统强制降低容量。
我的问题:
有人可以向我解释一下我可以如何配置这个神经网络,以便它可以通过监控所需的结果来从它所采取的每个动作(周期)中学习。我在这里遇到的挑战是,我在该主题上找到的大多数文章都假设您知道正确的输出答案(即:我知道 A、B、C、D、E 输入都是特定值,那么输出 1 应该增加 0.1 个周期每秒)。
但我想要的是满足我在上面的目标中列出的条件。因此,每次程序执行一个循环并假设它决定尝试增加每秒循环次数,结果是可用 O2 的下降量要么低于前一个循环,要么现在增加回 100,000,然后该输出可以被认为比减少每秒周期数或保持每秒当前周期数更正确。我在这里进行了简化,因为有多个变量会产生“理想”的结果——但我认为我已经说明了我所追求的。
代码:
对于这个测试练习,我使用了一个名为 Swift-AI 的 Swift 库(特别是它的 NeuralNet 模块:https ://github.com/Swift-AI/NeuralNet
因此,如果您想定制与该库相关的响应,这将是有帮助的,但不是必需的。我更多的是寻找如何设置网络的逻辑,然后根据我上面列出的条件将其配置为对自身进行初始和迭代重新训练。我会假设在足够的周期和不同的条件之后的某个时候,它会设置适当的权重来处理任何未来的条件,并且重新训练的影响会越来越小。
解决方案
这是一个控制问题,而不是预测问题,因此您不能只使用监督学习算法。(正如您所注意到的,您没有直接通过反向传播学习的目标值。)您仍然可以使用神经网络(如果您真的坚持的话)。看看强化学习。但是,如果您已经知道在采取诸如强迫人们离开之类的行动时氧气水平会发生什么变化,您为什么要通过数百万次反复试验的评估来学习如此简单的事实,而不是将其编码到模型中呢?
我建议看看模型预测控制。如果不出意外,您应该研究那里的问题是如何形成的。或者甚至可能只是普通的旧PID 控制。用很少的状态变量为这个过程建立一个好的动态模型似乎真的很容易。
您可能在该模型中有一些未知参数需要“在线”学习。但是一个简单的 PID 控制器已经可以容忍和补偿一些不确定性。与从头开始学习一般的因果结构相比,微调一些参数要容易得多。它可以做到,但它涉及尝试所有可能的操作。就您的算法所知,最好的行动可能是通过杀死氧气消耗者将其永久减少到零,然后以很少的能量维持氧气水平而获得巨大的回报。当算法对问题一无所知时,它将不得不尝试一切以发现效果。
推荐阅读
- sql - CURSOR 的使用会提高在 SQL 中使用 PIVOT 进行查询的性能/速度吗?
- python - Python Linux IBM Lotus Notes 9 - 导出数据库
- python - 如何使用 Python 从我的 CSV 文件生成嵌套的 JSON 数据
- c# - 外键部署到 SQL 服务器的问题 - 代码优先 - 空外键
- javascript - 在 base64 中发送更大的图像时,Nodemailer 崩溃
- git - 如何列出所有分支中每个作者的最新提交?
- vba - IBM MAXIMO:如何使用 REST API 从 PR 创建 PO
- java - 无法运行程序“AdoptOpenJDK\jdk-8.0.232.09-hotspot\jre\bin\java.exe”:CreateProcess 错误=206,文件名或扩展名太长
- node.js - RDS 管理控制台中显示的 sequelize 和连接中最大连接池大小的差异
- javascript - ES6中没有变量声明的对象解构赋值