强化学习编程实战-2马尔可夫决策过程

2.1 从多臂赌博机到马尔可夫决策过程

        如图2-1,图中A为多臂赌博机,B为一堆鸳鸯,其中左上角为雄性鸳鸯,右上角为雌性鸳鸯,B展示的任务是雄性鸳鸯绕过障碍物找到词性鸳鸯。跟多臂赌博机不同的是,雄性鸳鸯经过一次运动后会运动到另外一个位置,即系统B的状态发生了变化,而多臂赌博机经过一次动作后,其状态仍然是原来的状态。(这里假设每次运动后,多臂赌博机所有的元素都不会发生变化)

        多臂学习机通过强化学习算法学到了在固定不变的状态下最优的动作。那么,对于动作后状态发生变化的系统,如何学习到最优的动作呢?

        我们仔细分析这类问题。如图2-2.

        我们将鸳鸯系统的整个状态空间离散为只包含100各状态的状态空间,雄性鸳鸯在每个状态都有四个可行的动作,即向东、南、西、北四个方向移动。跟多臂赌博机不同的是,雄性鸳鸯需要做一系列的最优动作才能找到雌性鸳鸯。所以,雄性鸳鸯找到雌性鸳鸯是一个序贯决策问题。

        然后,强化学习不是万能的,他不能解决所有的序贯决策问题,只能解决建模为马尔可夫决策过程(MDP)过程的序贯决策问题。

        马尔可夫决策可以用一个五元组(S,A,P,R,\gamma)来描述。其中S为状态空间,A为动作空间,P为状态转移概率,R为回报函数,\gamma为折扣因子。

        (1)状态S

        在解决实际问题时,最关键的是如何表示要解决问题的状态。一个准则是,状态的表示因该使得状态满足马尔可夫性。(系统的下一个状态只与当前状态有关,与之前的状态无关)

        例1:如图2-3为经典的基于DQN解决雅达利游戏Breakthrough的例子。在该例子中,状态的表示为连续的4帧图像s_t{}=[i_t{},i_{t-1},i_{t-2},i_{t-3}],其中i_t{}为t时刻的游戏画面帧。这样表示,是为了让其满足马尔可夫性。

        例2:在图2-2中,我们将鸳鸯的整个运动空间离散成拥有100个状态的状态空间,每个状态表示一个位置。状态空间S={0,1,...,99}.

        对于许多实际问题,我们往往并不能精确地或者人为地表示出状态s_t{},而仅仅能得到观测历史和动作历史,即h_t{}=a_0,o_1,a_1,o_2,...,a_{t-1},o_{t},这个时候,我们往往可以用机器学习的方法将状态空间的学习表示出来。即

        对于有些问题,我们无法知道整个系统的真实状态s,只能知道部分信息。比如游戏地图,我们只知道当前的地图,而不是全部地图。此类问题,称之为部分可观马尔可夫决策。

(2)动作空间A

        动作空间是指智能空间可以采取的所有动作的集合。动作空间可以是离散也可以是连续空间。比如雅丽达游戏,动作可以分为17个离散动作;19x19的围棋动作空间为362个离散动作;32自由度机器人的动作空间为32维的连续空间。

        智能体的策略定义在动作集上。策略==在给定状态处可行动作空间的动作分布==在状态s_t处,智能体选择每个可行动作的概率或者概率密度。

        常用的策略分离散策略和连续策略。

        ①   离散策略

其中q_*{}(s,a)为行为值函数。

        ②\varepsilon-greedy策略:

        ③玻尔兹曼策略:

        ④连续策略:

        (3)状态转移概率P

        状态转移概率是指给定当前状态St和动作a_t{},转移到状态s_{t+1}的概率分布,即

        这里的状态转移概率P==系统模型,强化学习算法常常分为无模型和有模型,其中的模型是指状态转移概率P.

        (4)回报函数R

        R是给定状态s_{t} ,采取动作a_{t}后,智能体得到的回报,即 r=R(s_{t},a_{t}).

        一般来讲,回报是人为设定的回报。比如,雅达利游戏中,回报R来自游戏的得分。R也可以来自某些得分函数。

        强化学习算法往往对回报函数R非常敏感,不同的回报函数对于收敛性和学习速度影响非常大。稀疏回报的问题,强化学习算法的效率很低。因此,实际中常用Reward Shaping技术将稀疏回报变为稠密回报

        当拥有专家数据,并且回报函数R未知时,可以通过逆向强化学习的方法从专家数据中学习回报函数。当回报无法人为给出时,可以利用机器学习的方法利用数据进行学习。

        (5)折扣因子\gamma

        折扣因子\gamma是衰减未来的回报对当前状态值的贡献,取值常为0~1。一般,完成一次任务需要的步数越多,折扣因子\gamma的取值越接近1.

        那么,如何用马尔可夫决策过程来描述一个序贯决策?

        如图2-4所示为机器人找金币的例子。在该例子中,机器人并不知道金币在哪里,只能通过与网络环境进行交互找到最优策略。

        下面用马尔可夫决策过程的5个元素来描述机器人找金币问题。

(1)状态空间S

        S={1,2,3,4,5,6,7,8}

(2)动作空间A

        A={'e','s','w','n'}

(3)状态转移概率P

       机器人的运动规则,即碰到网格边界仍然保持原来的位置,否则按照运动学更新位置。

(4)回报函数R

         机器人每走一格回报为0;遇到金币的回报为1,游戏结束;进入死亡区6或者8的回报为-1,游戏结束。

(5)折扣因子\gamma

        可以取0-1,这里取0.85

        

那么,如何利用马尔可夫决策过程进行学习得到最优策略呢?

        所有的学习算法都从数据中进行学习,强化学习也不例外。强化学习从马尔可夫链数据中进行学习。马尔可夫链数据==一个马尔可夫决策过程序列数据。比如在图2-4给出的机器人找金币的例子中,马尔可夫链数据为:

        该数据链是机器人在状态1时采取往东的动作,得到回报0,并进入状态2;在状态2时采取往东的动作,得到回报0,进入状态3;在状态3时采取往南的动作,得到回报1,并进入终止状态,游戏结束。

        那如何从这个数据链中学习?

        强化学习的目标==找到每个状态s处的最优策略。

        \pi(s_{t})来表示策略,那如何说一个策略 \pi_{1}(s_{t})比另一个策略\pi_{2}(s_{t})更优?--->值函数的定义。在相同的状态s_t下,比较两个策略的值函数\nu _\pi (s_t),值函数大的策略更优。该值函数反映了整个序贯决策。

        最常用的值函数的定义为折扣累积回报的期望

其中折扣累积回报为

        用同样的方法可以定义行为值函数

        ①行为值函数q_\pi(s,a):衡量的是在状态s处,采取动作a后转移到状态s',并从状态s'开始执行策略\pi所得到的折扣累积回报的期望。可以评估在后继状态策略为\pi的情况下,当前状态处每个动作的好坏。

        ②值函数\nu _\pi(s_t):衡量的是在状态s处便开始执行策略\pi所得到的折扣累积回报的期望。可以评估在当前状态下直接采取策略\pi的好坏

        如果我们定义一个量 :动作a的优势函数A(s,a)=q_\pi(s,a)-\nu _\pi(s_t),那么它的物理意义是当智能体在状态s采取动作a所得到的折扣累计回报的期望比采取策略\pi所得到的折扣累积回报的期望高多少;差值>0,说明在该状态处采取动作a比执行策略\pi好。

        如何从马尔可夫决策链数据中学习最优的策略?(给出值函数和行为值函数之后)-->如何从马尔可夫决策链数据中学习值函数最大的策略

        ①最优值函数的定义:\nu ^{*}(s)为所有策略中值最大的状态值函数

        ②最优行为值函数:q^{*}(s,a)为所有策略中行为值函数最大的。

         智能体决策系统可以利用马尔科夫决策过程(S,A,P,R,\gamma)来描述,智能体在策略Π下产生的马尔可夫决策数据链表示为

        对应折扣累积回报G(St),在随机策略Π下,马尔可夫决策数据链\tau产生的概率为p(\tau)强化学习如何通过学习的方法找到最优的策略并使得如下值函数最大?

         对于(2-10)有很多种强化学习方法,最主要的分为两类:①利用值函数②利用直接策略搜索,两者可以融合,形成表演家-评论家(AC)的方法。

        强化学习中的典型问题:

        ①状态表示问题

        复杂时,利用深度神经网络进行自动特征提取是目前长常用的方法之一。

        ②置信分配问题

        ③探索与利用平衡问题

        ④策略梯度的方差与偏差平衡问题

        在直接策略搜索算法中,最常用的是策略梯度的方法。然而,由于无模型,策略的梯度只能从数据中通过估计得到,这便涉及到策略梯度估计方法的偏差和方差问题。偏差和方差。

        ⑤on-policy和off-policy问题当然越小越好,但有时两者确实矛盾的。

        on-policy:同策略==指智能体从当前策略产生的数据中进行学习,可以使智能体的学习稳定。缺点:只向当前策略产生的数据进行学习,因此学习效率和样本利用率低。

        off-policy:异策略=指智能体从其他策略产生的数据进行学习。可以向任何策略产生的数据进行学习,也可以向智能体过去已经产生的数据进行学习,因此学习效率和样本利用率高。缺点:容易产生误差,学习不稳定。

2.2 马尔科夫决策过程代码实现

        在本节中,要实现的是下图的鸳鸯系统。

         ①为了渲染出图2-5的图像,使用pygame包。

        pip install pygame

        加载pygame库后,引入pygame库中的函数,同时在程序中用到的包还有包random、数值计算包numpy。

        ②加载完必要的包后,声明一个鸳鸯类YuanYangEnv来构建鸳鸯环境。包括成员函数:

        初始化__init__()、重置环境reset、状态转换为像素坐标state_to_position、像素坐标转换为状态position_to_state、状态转移transform、游戏结束控制gameover、游戏渲染render、雄鸟碰撞检测collide和雄鸟是否找到雌鸟find。

__init__中定义马尔可夫决策过程的几个元素(S,A,P,R,\gamma),其中状态空间S由一个元组states来表示,元组中的元素为0,1,2,...,99,表示雄鸟的100个状态。动作空间A由元组actions组成,折扣因子为gamma,可设为0.8。由值函数的定义,每个状态处都有一个对应的值函数,因此值函数v可以用一个10x10的表格value来表示,由于开始并不知道值函数的大小,因此初始值都为0.马尔可夫决策过程中的状态转移概率P由子函数transforn来描述。

       类YuanYangEnv初始化函数下面的代码主要设置渲染属性。用viewer来表示一个渲染窗口,screen_size表示窗口大小,bird_position表示雄鸟当前的位置坐标,雄鸟在x方向每动作一次行走的像素距离为120,在y方向每动作一次行走的像素为90;每个障碍物的大小为120*90。在该环境中,一共有两堵障碍物墙,分别用obstacle1和obstacle2来表示,每堵障碍物墙由8个小的障碍物构成。雄鸟的初始位置bird_male_ini_position,和当前位置bird_male_position都为【0,0】,雌鸟的初始位置为bird_female_position=[1080,0].

        ③碰撞检测函数collide()

        用标志flag、flag1、flag2分别表示是否与障碍物、障碍物墙1、障碍物墙2进行碰撞。

        先检测雄鸟是否与第1堵障碍物墙发生碰撞,检测的算法为找到雄鸟与第1堵墙所有障碍物x方向和y方向最近的障碍物的坐标差,并判断最近的坐标差是否大于一个最小运动距离,如果>=,那么就不会发生碰撞。再检测第2堵墙,最后检测雄鸟是否超出了边界,如果超出了,也判定为碰撞。最后返回碰撞标志位。

        ④雄鸟找到雌鸟的判断子函数 find()

        设置标志flag,判断雄鸟当前位置和雌鸟位置的坐标差,当该值<最小运动距离时判断为找到。

        ⑤状态到像素坐标变换的函数state_to_position()

        在马尔可夫决策过程中用的是状态描述,因此需要转换。

        ⑥像素坐标到状态转换的函数position_to_state()

        环境重置函数reset()

        随机产生一个合法的初始位置,该位置不能再障碍物处,也不能在此雌鸟的位置,因此用一个while循环来产生一个符合条件的初始位置。

        ⑧状态转移概率模型P和回报函数 transform

        在transform()函数中,首先判断当前坐标是否与障碍物碰撞或者是否是终点,如果是,那么结束本次转换。如果当前没有与障碍物碰撞或者没有在雌鸟的位置,那么根据运动学进行像素位置坐标的转换。最后判断下一个状态是否与障碍物发生碰撞,以及是否找到雌鸟。

        回报函数的设置为如果没找到雌鸟,立即回报为0;如果与障碍物碰撞,回报为-1;如果找到雌鸟立即回报为1。

        ⑨游戏结束函数gameover()和环境渲染函数render()

        为了将游戏很直观地呈现出来,我们调用pygame包进行游戏的控制。

        里面的图像下载如何用load.py来进行下载

        ⑩主函数

        声明一个鸳鸯环境的实例yy,然后调用渲染函数将系统绘制出来,最后调用循环语句检查是否要结束游戏渲染。

        如下图

        生成的太大,电脑上没有完整显示。需要后面调整一下。

        有了仿真训练环境,后面章节将会介绍如何通过强化学习使得雄鸟找到雌鸟。

        代码如下:

        mdp.py

# 导入必要的包
import pygame
from load import *
import random
import numpy as np# 鸳鸯环境类
class YuanYangEnv:def __init__(self):# 初始化self.states=[]for i in range(0,100):self.states.append(i)self.actions=['e','s','w','n']self.gamma=0.8self.value=np.zeros((10,10))#设置渲染属性self.viewer=Noneself.FPSCLOCK=pygame.time.Clock()#屏幕大小self.screen_size=(1200,900)self.bird_position=(0,0)self.limit_distance_x=120self.limit_distance_y=90self.obstacle_size=[120,90]self.obstacle1_x=[]self.obstacle1_y=[]self.obstacle2_x=[]self.obstacle2_y=[]for i in range(8):#第一个障碍物self.obstacle1_x.append(360)if i<=3:self.obstacle1_y.append(90*i)else:self.obstacle1_y.append(90*(i+2))#第二个障碍物self.obstacle2_x.append(720)if i<=4:self.obstacle2_y.append(90*i)else:self.obstacle2_y.append(90*(i+2))self.bird_male_init_position=[0.0,0.0]  #雄鸟初始位置self.bird_male_position=[0,0]           #雄鸟当前位置self.bird_female_init_position=[1080,0] #雌鸟初始位置#碰撞检测函数def collide(self,state_position):flag=1 flag1=1flag2=2#判断第1个障碍物dx=[]dy=[]for i in range(8):dx1=abs(self.obstacle1_x[i]-state_position[0])dx.append()dy1=abs(self.obstacle1_y[i]-state_position[1])dy.append()mindx=min(dx)mindy=min(dy)if mindx>=self.limit_distance_x or mindy>=self.limit_distance_y:flag1=0#判断第2个障碍物second_dx=[]second_dy=[]for i in range(8):dx2=abs(self.obstacle2_x[i]-state_position[0])second_dx.append(dx2)dy2=abs(self.obstacle2_y[i]-state_position[1])second_dy.append(dy2)mindx=min(second_dx)mindy=min(second_dy)if mindx>=self.limit_distance_x or mindy>=self.limit_distance_y:flag2=0if flag1==0 and flag2==0:flag=0#判断是否边界碰撞if state_position[0]>1080 or state_position[0]<0 or state_position[1]>810 or state_position[1]<0:flag=1return flag#雄鸟找到雌鸟的判断def find(self,state_position):flag=0if abs(state_position[0]-self.bird_female_init_position[0])<self.limit_distance_x and abs(state_position[1]-self.bird_female_init_position[1])<self.limit_distance_y:flag=1return flag#状态转换为坐标def state_to_position(self,state):i=int(state/10)j=state%10position=[0,0]position[0]=120*jposition[1]=90*jreturn position#坐标转换为状态def position_to_state(self,position):i=position[0]/120j=position[1]/90return int(i+10*j)#环境重置函数def reset(self):#随机产生初始状态flag1=1flag2=1while flag1 or flag2==1:state=self.states[int(random.random()*len(self.states))]state_position=self.state_to_position(state)flag1=self.collide(state_position)flag2=self.find(state_position)return state#状态转移概率模型Pdef transform(self,state,action):#将当前状态转换为坐标current_position=self.state_to_position(state)next_position=[0,0]flag_collide=0flag_find=0flag_collide=self.collide(current_position)    #判断当前坐标是否与障碍物碰撞flag_find=self.find(current_position)          if flag_collide==1 or flag_find==1:return state,0,True#状态转移if action=='e':next_position[0]=current_position[0]+120next_position[1]=current_position[1]if action=='s':next_position[0]=current_position[0]next_position[1]=current_position[1]+90if action=='w':next_position[0]=current_position[0]-120next_position[1]=current_position[1]if action=='n':next_position[0]=current_position[0]next_position[1]=current_position[1]-90#判断next_state是否与状态碰撞flag_collide=self.collide(next_position)#如果碰撞,回报为-1,并结束if flag_collide==1:return self.position_to_state(next_position),-1,True#判断是否是终点flag_find=self.find(next_position)if flag_find==1:return self.position_to_state(next_position),1,Truereturn self.position_to_state(next_position),0,False#游戏结束控制def gameover(self):for event in pygame.event.get():if event.type==quit:exit()#渲染游戏def render(self):if self.viewer is None:pygame.init()#画一个窗口self.viewer=pygame.display.set_mode(self.screen_size,0,32)pygame.display.set_caption('yuanyang')#下载图片self.bird_male=load_bird_male()self.bird_female=load_bird_female()self.background= load_background()self.obstacle=load_obstacle()self.viewer.blit(self.bird_male,self.bird_male_init_position)self.viewer.blit(self.bird_female,self.bird_female_init_position)self.viewer.blit(self.background,(0,0))self.font=pygame.font.SysFont('times',15)self.viewer.blit(self.background,(0,0))#画直线for i in range(11):pygame.draw.lines(self.viewer,(255,255,255),True,((120*i,0),(120*i,900)),1)pygame.draw.lines(self.viewer,(255,255,255),True,((0,90*i),(1200,90*i)),1)self.viewer.blit(self.bird_female,self.bird_female_init_position)#画障碍物for i in range(8):self.viewer.blit(self.obstacle,(self.obstacle1_x[i],self.obstacle1_y[i]))self.viewer.blit(self.obstacle,(self.obstacle2_x[i],self.obstacle2_y[i]))#画小鸟self.viewer.blit(self.bird_male,self.bird_male_position)#画值函数for i in range(10):for j in range(10):surface=self.font.render(str(round(float(self.value[i,j]),3)),True,(0,0,0))self.viewer.blit(surface,(120*i+5,90*j+70))pygame.display.update()self.gameover()self.FPSCLOCK.tick(30)#主函数进行测试
if __name__=='__main__':yy=YuanYangEnv()yy.render()while True:for event in pygame.event.get():if event.type==quit:exit()

        里面用的图片需要下载,存在resources文件夹中。

        load.py

import pygame
import os
from pygame.locals import *
from sys import  exit
#得到当前工程目录
current_dir = os.path.split(os.path.realpath(__file__))[0]
print(current_dir)
#得到文件名
bird_file = current_dir+"/resources/bird.png"
obstacle_file = current_dir+"/resources/obstacle.png"
background_file = current_dir+"/resources/background.png"
#创建小鸟,
def load_bird_male():bird = pygame.image.load(bird_file).convert_alpha()return bird
def load_bird_female():bird = pygame.image.load(bird_file).convert_alpha()return bird
#得到背景
def load_background():background = pygame.image.load(background_file).convert()return background
#得到障碍物
def load_obstacle():obstacle = pygame.image.load(obstacle_file).convert()return obstacle

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/372475.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringCloud应用框架】Nacos集群配置

第八章 Spring Cloud Alibaba Nacos之集群配置 文章目录 一、Linux版NacosMySql生产环境配置具体配置&#xff1a; 二、Nacos集群配置更改Nacos启动命令配置原理具体配置测试启动总结 一、Linux版NacosMySql生产环境配置 上一篇博客中已经了解了Nacos生产环境下需要搭建集群配…

angular 请求响应拦截

在module中provide 对请求做一些操作 对响应做一些操作 import { Injectable } from angular/core; import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpResponse } from angular/common/http; import { Observable, throwError } from rxjs; import { catc…

[ControlNet] Adding Conditional Control to Text-to-Image Diffusion Models

1、目的 让预训练好的大型DDPM模型支持额外的输入条件&#xff08;如Canny edges、Hough lines、user scribbles、segmentation maps、human key points、shape normals、depths等&#xff09; 不同于image-to-image translation致力于学习不同domain之间的映射&#xff0c;Con…

【Mac】Folder Icons for mac(文件夹个性化图标修改软件)软件介绍

软件介绍 Folder Icons for Mac 是一款专为 macOS 设计的应用程序&#xff0c;主要用于个性化和定制你的文件夹图标。以下是它的主要特点和使用方法&#xff1a; 主要特点&#xff1a; 个性化文件夹图标 Folder Icons for Mac 允许用户为 macOS 上的任何文件夹定制图标。你…

C嘎嘎:类和对象(一)

目录 面向过程和面向对象的初步认识 类的引入 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 类对象模型 如何计算类对象大小 结构体内存对齐规则 this指针 this指针的引出 this指针的特性 类的6个默认成员函数 构造函数 概念 特性 …

前端vue打印后端对象为[object,object]

今天给自己项目进行编写前端页面时&#xff0c;惊讶的发现&#xff0c;自己进行打印后端传递的对象&#xff0c;一直显示未[object,object]&#xff0c;如下图所示&#xff1a; 感觉很奇怪&#xff0c;于是我猜测是不是自己获取的返回数据的问题&#xff0c;在进行添加了datat…

关于Linux的操作作业!24道题

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Sleuth--链路追踪

1 链路追踪介绍 在大型系统的微服务化构建中&#xff0c;一个系统被拆分成了许多模块。这些模块负责不同的功能&#xff0c;组合成 系统&#xff0c;最终可以提供丰富的功能。在这种架构中&#xff0c;一次请求往往需要涉及到多个服务。互联网应用构建 在不同的软件模块集上&am…

鸿蒙‘ohpm‘ 不是内部或外部命令,也不是可运行的程序-解决方案

&#x1f525; 博客主页&#xff1a; 小韩本韩&#xff01; ❤️ 感谢大家点赞&#x1f44d;收藏⭐评论✍️ 在鸿蒙的DevEco Studio的终端下输入 ohpm -v 或者 你需要下载第三方ohpm包的时候提示‘ohpm‘ 不是内部或外部命令&#xff0c;也不是可运行的程序- 主要是因为我们…

Redies基础篇(一)

Redis 是一个高性能的key-value数据库。Redies支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作&#xff0c;而且这些操作都是原子性的&#xff…

idea2024破解安装教程

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 &#x1f324;️下载安装 &a…

基于Java Web的考编论坛网站的设计与实现+lw+源码+讲解+调试+视频演示

第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料&#xff0c;分析人员可以根据这些信息确定出本系统具备的功能&#xff0c;分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作&#xff0c;但…

ElasticSearch学习篇14_《检索技术核心20讲》进阶篇之大倒排索引

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243&#xff0c;文档形式记录笔记。 内容 主要是海量数据的大倒排索引的一些原理设计思想&#xff0c;ES底层就是基于这些设计思想以及原理&#xff0c;主要涉及读写分离、索引分层等…

CSS上下悬浮特效

要实现一个上下悬浮的特效&#xff0c;可以使用CSS的keyframes规则和动画属性。以下是一个简单的示例&#xff1a; 代码示例 /* 定义一个名为floating的动画 */ keyframes floating {0% {transform: translateY(0); /* 初始位置 */}50% {transform: translateY(-4px); /* 向上…

EDI安全:如何在2024年保护您的数据免受安全和隐私威胁

电子数据交换&#xff08;EDI&#xff09;支持使用标准化格式在组织之间自动交换业务文档。这种数字化转型彻底改变了业务通信&#xff0c;消除了对纸质交易的需求并加速了交易。然而&#xff0c;随着越来越依赖 EDI 来传输发票、采购订单和发货通知等敏感数据&#xff0c;EDI …

cfDNA甲基化疾病早筛研究思路分享

游离DNA&#xff08;Circulating free DNA&#xff0c;cfDNA&#xff09;是人体组织释放到血液等循环体系中降解的DNA片段&#xff0c;是一种新型的肿瘤分子标志物。ctDNA甲基化是重要的表观学修饰之一&#xff0c;可以在不改变基因序列的情况下&#xff0c;改变遗传表现&#…

【基于R语言群体遗传学】-13-群体差异量化-Fst

在前几篇博客中&#xff0c;我们深度学习讨论了适应性进化的问题&#xff0c;从本篇博客开始&#xff0c;我们关注群体差异的问题&#xff0c;建议大家可以先看之前的博客&#xff1a;群体遗传学_tRNA做科研的博客-CSDN博客 一些新名词 Meta-population:An interconnected gro…

名企面试必问30题(二十七)——你能为公司带来什么呢?

回答一&#xff1a; “首先&#xff0c;我具备扎实的软件测试专业知识和丰富的实践经验。我能够运用各种测试方法和工具&#xff0c;确保公司产品的质量&#xff0c;降低产品上线后的风险。 其次&#xff0c;我善于发现问题和解决问题。在测试过程中&#xff0c;我不仅能找出软…

Open3D 从体素网格构建八叉树

目录 一、概述 1.1体素网格 1.2八叉树构建 1.3应用 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2体素网格 3.3八叉树 3.4体素网格 一、概述 八叉树&#xff08;Octree&#xff09;是一种树状数据结构&#xff0c;用于递归地将三维空间划分为…

Java面试题--JVM大厂篇之深入解析G1 GC——革新Java垃圾回收机制

目录 引言: 正文&#xff1a; 一、G1 GC的区域划分及其作用 1. 伊甸园区&#xff08;Eden Region&#xff09; 2. 幸存者区&#xff08;Survivor Region&#xff09; 3. 老年代区&#xff08;Old Generation Region&#xff09; 二、区域划分的优势: 三、图片解析: 结…