当前位置: 首页 > news >正文

强化学习QLearning 进行迷宫游戏和代码

强化学习是机器学习里面的一个分支。它强调基于环境而探索行动、学习,以取得最大化的预期收益。其灵感来源于心理学中的行为主义理论,既有机体如何在环境给予的奖励或者惩罚的刺激下,逐步形成对刺激的预期,产生能够最大利益的习惯性行为。简而言之,强化学习就是让机器学着如何在环境中通过不断的试错、尝试,学习、累积经验拿到高分.

强化学习基本结构

强化学习致力于控制一个计算机智能体,使之在未知环境中完成任务目标。

下图中给出强化学习基本机构。在一个未知“迷宫”环境中,计算机算法软件(探索机器人控制大脑)基于自身的控制策略行动。基本结构包括:

(1)智能体(Agent):探索机器人大脑,智能体的结构可以是一个神经网络,也可以是一个简单的算法,智能体的输入通常是状态(State),输出通常是策略(Policy);

(2)动作(Actions):是指动作空间。对于机器人玩迷宫游戏,只有上下左右移动方向可行动,那Actions就是上、下、左、右;

(3)状态(State):就是智能体的输入,机器人在迷宫中的位置;

(4)奖励(Reward):机器人进入某个状态时,能给智能体带来正奖励或者负奖励;

(5)环境(Environment):就是指机器人所走的迷宫,能接收action,返回state和reward。

1、强化学习决策过程

马尔科夫决策过程(MDP)为求解强化学习问题提供了数学框架。几乎所有的强化学习问题都可以建模为MDP。

在强化学习中,agent与environment按顺序在互动。在时刻 t1 ,agent会接收到来自环境的一个observation(观察),获取状态s1,基于这个状态s1 ,agent会做出动作a1  ,然后这个动作作用在环境上,于是agent可以接收到一个奖赏rt+1,并且agent就会到达新的状态s2,以此方式持续下去。agent与environment之间的交互就是产生了一个序列,如下图所示。

强化学习迷宫Q-Learning算法决策实现过程,就是马尔科夫决策过程(MDP)过程的实现,实践过程如下图所示。

强化学习基本要素

基于上述迷宫的案例,我们可以整理出思路里面出现的强化学习要素:

2.4.1. 马尔可夫决策过程(MDP)模型要素

马尔可夫决策过程(MDP)包含5个模型要素,状态(state)、动作(action)、策略(policy)、奖励(reward)和回报(return):

(1)环境的状态s,状态是对环境的描述,正如机器人在迷宫中的位置,也就是t时刻环境的状态st,体现为环境状态集中的某一个状态,在智能体做出动作后,状态会发生变化;MDP所有状态的集合是状态空间,状态空间可以是离散或连续的。

S= s1,s2,s3,s4,……,sπ

(2)机器人的动作A,动作是对智能体行为的描述,是智能体决策的结果。t时刻机器人采取的动作At,是它的动作集中某一个动作;MDP所有可能动作的集合是动作空间,动作空间可以是离散或连续的。

A= a1,a2,a3,a4,……,aπ

(3)环境的奖励R,奖励是智能体给出动作后,环境对智能体的反馈。是当前时刻状态、动作和下个时刻状态的标量函数。

 t时刻机器人在状态st ,采取的动作at对应的奖励rt+1 ,会在t+1时刻得到;

R = R(st, at,st+1)

(4)机器人的策略(policy)π,策略是指代表机器人采取动作的依据,即机器人会依据策略π来选择动作。最常见的策略表达方式是一个条件概率分布π(a|s), 即在状态s时采取动作a的概率。即π(a|s)=P(At = a| st=s),此时概率大的动作被机器人选择的概率较高。

(5)环境的状态转化模型,可以理解为一个概率状态机,它可以表示为一个概率模型,即在状态s下采取动作a ,转到下一个状态s’的概率,表示为Pass’ 。

2.4.2. 贝尔曼方程及其要素

贝尔曼方程(Bellman Equation)也被称作动态规划方程(Dynamic Programming Equation),用于求解马尔可夫决策过程(MDP)过程。

贝尔曼方程是动态规划(Dynamic Programming)这些数学最佳化方法能够达到最佳化的必要条件。此方程把“决策问题在特定时间怎么取值”以“来自初始选择的报酬比从初始选择衍生的决策问题的值”的形式表示。借此这个方式把动态最佳化问题变成简单的子问题,而这些子问题遵守从贝尔曼所提出来的“最优原理”。

几乎所有的可以用最优控制理论(Optimal Control Theory)解决的问题也可以通过分析合适的贝尔曼方程得到解决。然而,贝尔曼方程通常指离散时间(discrete-time)最佳化问题的动态规划方程。

贝尔曼方程的三个要素,策略函数、状态价值函数、状态——行为值函数(Q函数)(简称为动作价值函数)。

(1)回报(return),回报是奖励随时间步的积累,在引入轨迹的概念后,回报也是轨迹上所有奖励的总和。

    

(2)折扣因素,奖励衰减因子(γ),在[0,1]之间。如果为0,则是贪婪法,即价值只由当前延时奖励决定,如果是1,则所有的后续状态奖励和当前奖励一视同仁。大多数时候,我们会取一个0到1之间的数字,即当前延时奖励的权重比后续奖励的权重大。

折扣因素主要作用:

避免连续任务造成回报G无限大;

区分即时奖励和未来奖励的重要程度。

(3)状态值函数  机器人在策略π和状态s时,采取行动后的状态所处的最佳的(程度)价值(value),一般用 表示,是一个期望函数。

价值函数 一般可以表示为下式,不同的算法会有对应的一些价值函数变种,但思路相同:

(4)状态——行为值函数(Q函数)

机器人在策略π和状态s时,采取行动后的行为的所处的最佳的程度,一般用  表示,也是一个期望函数。

根据策略π从状态s 开始采取行动a所获得的期望回报,也就是贝尔曼方程,如下式所述:

(5)探索率ϵ,这个比率主要用在强化学习训练迭代过程中,由于我们一般会选择使当前轮迭代价值最大的动作,但是这会导致一些较好的但我们没有执行过的动作被错过。因此我们在训练选择最优动作时,会有一定的概率ϵ不选择使当前轮迭代价值最大的动作,而选择其他的动作。

Q-Learning算法

时序差分学习 (temporal-difference learning, TD learning):指从采样得到的不完整的状态序列学习,该方法通过合理的 bootstrapping,先估计某状态在该状态序列(episode)完整后可能得到的 return,并在此基础上利用累进更新平均值的方法得到该状态的价值,再通过不断的采样来持续更新这个价值。

时间差分(TD) 学习是蒙特卡罗(MC) 思想和动态规划(DP) 的结合。与MC方法 类似,TD方法 可以直接从经验中学习,而不需要知道环境模型。与 DP 类似,TD方法基于其他学习的估计值来更新估计值,而不用等待最终的结果。首先从预测(prediction)问题出发,建立给定策略 [公式] 对应的值函数 [公式] 的估计。对于控制(control)问题,DP、TD以及MC方法都使用了 广义策略迭代(GPI)的某种形式。这些方法中的不同点主要体现在解决预测问题方面。

Q-learning一种TD(Time Difference)方法,也是一种Value-based的方法。所谓Value-based方法,就是先评估每个action的Q值(Value),再根据Q值求最优策略  的方法。

在Q -值函数包含了两个可以操作的因素。

首先是一个学习率 learning rate(α),它定义了一个旧的Q值将从新的Q值哪里学到的新Q占自身的多少比重。值为0意味着代理不会学到任何东西(旧信息是重要的),值为1意味着新发现的信息是唯一重要的信息。

下一个因素被称为折扣因子discount factor(γ),它定义了未来奖励的重要性。值为0意味着只考虑短期奖励,其中1的值更重视长期奖励。

公式可以变换为:

因此:

  是指旧Q值在newQ(s,a)之中所占得比重

  是指为本次行动学习到的奖励(行动本身带来的奖励和未来潜在的奖励)。

3.3. Q-table

Q-Learning最终目标是获得回报G,这样需要保存训练过程中的轨迹上所有奖励的总和。因此设计了Q-table用于存储Q(s,a) ,创建一个二维表,可以存储每个state中每个action的未来预期的最大奖励值。这样我们可以知道每个state下的最佳action。

如下图迷宫,每个state(这里指的是方块)允许四种可能性的action,即上、下、左、右。

这个table就叫做Q-table(Q指的是这个action的预期奖励)。迷宫的Q-table中的列有四个action(上下左右行为),行代表state,每个单元格的值将是特定状态(state)和行动(action)下未来预期的最大奖励值

4. 迷宫游戏代码结构

迷宫游戏代码有三部分组成:

maze_env 是迷宫环境,基于Python标准GUI库Tkinter开发

RL_brain 是Q-Learning的核心实现

run_maze 是控制执行算法的代码

maze_env.py

import numpy as np
import time
import syssys.setrecursionlimit(10000)
if sys.version_info.major ==2:import Tkinter as tk
else:import tkinter as tk
UNIT = 40 #像素
MAZE_H = 6 #网格高度
MAZE_W = 6 #网格宽度class Maze(object):def __init__(self):self.action_space = ['u','d','l','r']self.n_actions = len(self.action_space)# self.title('迷宫')# self.geometry('{0}x{1}'.format(MAZE_H*UNIT,MAZE_W*UNIT))# 初始化窗口 画布self.window = tk.Tk()self.canvas = tk.Canvas(self.window,bg='white',height= MAZE_H*UNIT,width = MAZE_W*UNIT)self._build_maze()def _build_maze(self):h = MAZE_H * UNITw = MAZE_W * UNIT#创建画布,设计宽和高#创建栅格# 画线for c in range(0, w, UNIT):self.canvas.create_line(c, 0, c, h)for r in range(0, h, UNIT):self.canvas.create_line(0, r, w, r)# 陷阱self.hells = [self._draw_rect(3, 2, 'black'),self._draw_rect(3, 3, 'black'),self._draw_rect(3, 4, 'black'),self._draw_rect(3, 5, 'black'),self._draw_rect(4, 5, 'black'),self._draw_rect(1, 0, 'black'),self._draw_rect(1, 1, 'black'),self._draw_rect(1, 2, 'black'),self._draw_rect(1, 4, 'black'),self._draw_rect(1, 5, 'black')]self.hell_coords = []for hell in self.hells:self.hell_coords.append(self.canvas.coords(hell))# 奖励self.oval = self._draw_rect(4, 5, 'yellow')# 玩家对象self.rect = self._draw_rect(0, 0, 'red')self.canvas.pack()# color 颜色def _draw_rect(self, x, y, color):center = UNIT / 2w = center - 5x_ = UNIT * x + centery_ = UNIT * y + centerreturn self.canvas.create_rectangle(x_ - w,y_ - w,x_ + w,y_ + w,fill=color)def reset(self):self.canvas.update()time.sleep(0.5)self.canvas.delete(self.rect)self.rect = self._draw_rect(0, 0, 'red')self.old_s = Nonereturn self.canvas.coords(self.rect)# return self.window.coords(self.rect)# 走下一步def step(self,action):s = self.canvas.coords(self.rect)base_action = np.array([0,0])if action == 0: #upif s[1]>UNIT:base_action[1] -=UNITelif action == 1: #downif s[1] <(MAZE_H -1) * UNIT:base_action[1] += UNITelif action == 2: #rightif s[0] <(MAZE_W -1) * UNIT:base_action[0] += UNITelif action == 3:  # leftif s[0] >  UNIT:base_action[0] -= UNIT# 根据策略移动红块self.canvas.move(self.rect,base_action[0],base_action[1])s_ = self.canvas.coords(self.rect) #next state# 判断是否得到奖励或惩罚if s_ ==self.canvas.coords(self.oval):reward = 1done = Trues_ = 'terminal'elif s_ in self.hell_coords:reward = -1done = Trues_ = 'terminal'else:reward = 0done = Falseself.old_s = sreturn  s_,reward,donedef rander(self):time.sleep(0.1)self.canvas.update()
def update():t=0for t in range(10):s = env.reset()print(s)while True:env.rander()a = 2s,r,done = env.step(a)t+=1# print(t)if done:break
if __name__ == '__main__':print(sys.getrecursionlimit())env = Maze()env.window.after(100,update)env.window.mainloop()

RL_brain.py 是Q-Learning的核心实现

import numpy as np
import pandas as pdclass QLearningTable:def __init__(self,actions,learning_rate=0.01,reward_decay=0.9,e_greedy=0.9):self.actions = actionsself.lr = learning_rateself.gamma = reward_decayself.epsilon = e_greedyself.q_table = pd.DataFrame(columns=self.actions,dtype=np.float64)print(self.q_table)def choose_action(self,observation):self.check_state_exist(observation)if np.random.uniform()<self.epsilon:state_action = self.q_table.loc[observation,:]# 防止相同列值时取第一个列,所以打乱列的顺序action = np.random.choice(state_action[state_action==np.max(state_action)].index)else:action = np.random.choice(self.actions)return actiondef learn(self,s,a,r,s_):self.check_state_exist(s_)q_predict = self.q_table.loc[s,a] # q估计if s_ !='terminal':q_target = r + self.gamma*self.q_table.loc[s_,:].max() # q现实else:q_target = rself.q_table.loc[s,a]  += self.lr *(q_target - q_predict)# 检查状态是否存在def check_state_exist(self,state):if (state not in self.q_table.index):self.q_table = self.q_table.append(pd.Series([0]*len(self.actions),index= self.q_table.columns,name = state,))

run_maze.py 是控制执行算法的代码

from maze_env import Maze
from QLearn.RL_brain import QLearningTable
import numpy as np
def update1():for episode in range(100):#获取初始坐标observation = env.reset()# print(type(observation))print(observation)while True:# 刷新环境env.rander()#  Rl基于观测选择下一个动作action = RL.choose_action(str(observation))print(action)#  执行这个动作得到反馈(下一个状态observation_ 奖励reward 是否结束done)observation_,reward, done = env.step(action)# RL更新状态表Q-tableRL.learn(str(observation),action,reward,str(observation_))observation = observation_if done:breakif __name__ == '__main__':env = Maze()RL = QLearningTable(actions=list(range(env.n_actions)))env.window.after(10,update1) # 设置10ms的延迟env.window.mainloop()

运行之后的效果图:

 

相关文章:

强化学习QLearning 进行迷宫游戏和代码

强化学习是机器学习里面的一个分支。它强调基于环境而探索行动、学习&#xff0c;以取得最大化的预期收益。其灵感来源于心理学中的行为主义理论&#xff0c;既有机体如何在环境给予的奖励或者惩罚的刺激下&#xff0c;逐步形成对刺激的预期&#xff0c;产生能够最大利益的习惯…...

Vue2 第九节 过滤器

&#xff08;1&#xff09;定义&#xff1a;对要显示的数据进行特定格式化后再显示 &#xff08;2&#xff09;语法&#xff1a; ① 注册过滤器 1&#xff09;Vue.filter(name, callback) 全局过滤器 2&#xff09; new Vue({filters:{}}) 局部过滤器 ② 使用过滤器 1&…...

Swift 对象数组去重

使用 reduce 方法去重 使用 reduce 方法结合 contains 方法可以实现去重。reduce 方法用于将数组的元素进行累积计算&#xff0c;而 contains 方法用于检查元素是否已经存在于结果数组中。 struct SearchRecord: Equatable {let id: Intlet name: String }let records [Sear…...

代码随想录算法训练营day52 300.递增子序列 674.最长连续递增子序列 718.最长重复子数组

题目链接300.递增子序列 class Solution {public int lengthOfLIS(int[] nums) {int[] dp new int[nums.length];Arrays.fill(dp, 1);for(int i 0; i < nums.length; i){for(int j 0; j < i; j){if(nums[i] > nums[j]){dp[i] Math.max(dp[i], dp[j] 1);}}}int r…...

Android 面试题 虚拟机、进程、线程 七

&#x1f525; 安卓虚拟机 &#x1f525; 虽然Android程序是使用Java语言开发的&#xff0c;当然&#xff0c;现在也可以使用kotlin语言。但是实际上我们开发出来的Android程序并不能运行在JVM上&#xff0c;而是只能运行在一个类似JVM的Android虚拟机上。Android虚拟机有两种&…...

Flutter 状态组件 InheritedWidget

Flutter 状态组件 InheritedWidget 视频 前言 今天会讲下 inheritedWidget 组件&#xff0c;InheritedWidget 是 Flutter 中非常重要和强大的一种 Widget&#xff0c;它可以使 Widget 树中的祖先 Widget 共享数据给它们的后代 Widget&#xff0c;从而简化了状态管理和数据传递…...

<C++> 入门

在学习完C语言的基础上&#xff0c;继续开始C的学习。 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&#xff0c;对C学习有一定的帮助。 1. 补充C语言语法的不足&#xff0c;以及C是如…...

政策加持智能家居市场,涂鸦赋能客户打造“以人为本”智能生活新方式

7月18日&#xff0c;商务部等13部门联合发布了《关于促进家居消费若干措施的通知》&#xff08;以下简称《通知》&#xff09;&#xff0c;《通知》指出&#xff0c;创新培育智能消费&#xff0c;支持企业运用物联网、云计算、人工智能等技术&#xff0c;着重加快智能家电、智能…...

安全渗透初级知识总结-2

CIA三原则&#xff1a;保密性&#xff0c;完整性&#xff0c;可用性 https:解决了安全传输问题 核心技术&#xff1a;用非对称加密传输对称加密的秘钥&#xff0c;然后用对称秘钥通信 抓包&#xff1a;Wireshark、tshark、tcpdump valueof方法是一个所有对象都拥有的方法&am…...

数学建模的32种常规方法及案例代码

比赛期间整理的数学建模的32种常规方法及案例代码友情分享&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/18uDr1113a0jhd2No8O1Nog 提取码&#xff1a;xae5 在数学建模中&#xff0c;常规算法是指那些被广泛应用于各种问题求解的经典算法。这些算法覆盖了不同的数学…...

【Django+Vue】英文成绩管理平台--20230727

能够满足大部分核心需求&#xff08;标绿&#xff09;&#xff1a;报表部分应该比较难。 项目地址 前端编译 https://gitlab.com/m7840/toeic_vue_dist Vue源码 https://gitlab.com/m7840/toeic_vue Django源码 https://gitlab.com/m7840/toeic_python 项目架构 流程 …...

栈-模拟栈

实现一个栈&#xff0c;栈初始为空&#xff0c;支持四种操作&#xff1a; push x – 向栈顶插入一个数 x&#xff1b; pop – 从栈顶弹出一个数&#xff1b; empty – 判断栈是否为空&#xff1b; query – 查询栈顶元素。 现在要对栈进行 M 个操作&#xff0c;其中的每个…...

图观| 从王宝强、费翔、阿汤哥等新上映的电影聊聊图的智能推荐场景

从技术的视角来看&#xff0c;推荐系统本质上是在用户需求不明确的情况下&#xff0c;从海量的信息中为用户过滤出他可能感兴趣的信息的一种技术手段。 我们日常接触到的智能推荐有&#xff1a; 电商网站&#xff1a;如淘宝、天猫、京东、Amazon…… 生活服务&#xff1a;如美…...

Redis系列一:介绍

介绍 The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker. 相关资源 Redis 官网&#xff1a;https://redis.io/ 源码地址&#xff1a;https://github.com/redis/redis Redis 在线测试&#…...

Java 设计模式 - 单例模式 - 保证类只有一个实例

单例模式 - 保证类只有一个实例 为什么使用单例模式&#xff1f;单例模式的实现方式1. 饿汉式&#xff08;Eager Initialization&#xff09;2. 懒汉式&#xff08;Lazy Initialization&#xff09;3. 双重检查锁&#xff08;Double-Checked Locking&#xff09;4. 静态内部类&…...

第2章 JavaScript语法

准备工作 编写js需要准备一个编译器和游览器&#xff0c;js必须通过HTML/XHTML文档编写 js的编写位置 <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Docume…...

【Golang】Golang进阶系列教程--为什么 Go for-range 的 value 值地址每次都一样?

文章目录 前言现象无限循环相同地址 原因推荐阅读 前言 循环语句是一种常用的控制结构&#xff0c;在 Go 语言中&#xff0c;除了 for 关键字以外&#xff0c;还有一个 range 关键字&#xff0c;可以使用 for-range 循环迭代数组、切片、字符串、map 和 channel 这些数据类型。…...

小研究 - JVM 垃圾回收方式性能研究(三)

本文从几种JVM垃圾回收方式及原理出发&#xff0c;研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响&#xff0c;并通过最终测试数据对比&#xff0c;给出了不同应用场景下如何选择垃圾回收策略的方法。 目录 4 垃圾回收器性能比较 4.1 测试结果 5 结语 …...

java根据poi解析excel内容

一.HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook Apache POI包中的HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook的区别如下: HSSFWorkbook&#xff1a;一般用于操作Excel2003以前&#xff08;包括2003&#xff09;的版本&#xff0c;扩展名是.xls。 XSSFWorkbook&#xff1a;一…...

实验报告-Sublime配置默认语法,以配置Verilog语法为例

实验报告-Sublime配置默认语法,以配置Verilog语法为例 1,下载Verilog语法环境2,Sublime配置语法工作环境,以Verilog语法环境为例。3,打开一个新的Sublime,验证编辑器配置Verilog为默认语法成功!4,Sublime汉化1,下载Verilog语法环境 参考文献: 1,Sublime Text 4加载…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

解析“道作为序位生成器”的核心原理

解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制&#xff0c;重点解析"道作为序位生成器"的核心原理与实现框架&#xff1a; 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...

起重机起升机构的安全装置有哪些?

起重机起升机构的安全装置是保障吊装作业安全的关键部件&#xff0c;主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理&#xff1a; 一、超载保护装置&#xff08;核心安全装置&#xff09; 1. 起重量限制器 功能&#xff1a;实时监测起升载荷&a…...

C#最佳实践:为何优先使用as或is而非强制转换

C#最佳实践&#xff1a;为何优先使用as或is而非强制转换 在 C# 的编程世界里&#xff0c;类型转换是我们经常会遇到的操作。就像在现实生活中&#xff0c;我们可能需要把不同形状的物品重新整理归类一样&#xff0c;在代码里&#xff0c;我们也常常需要将一个数据类型转换为另…...