首页 > 滚动 > > 内容页

天天观察:30分钟吃掉DQN算法

2023-06-22 06:37:12 程序员客栈

表格型方法存储的状态数量有限,当面对围棋或机器人控制这类有数不清的状态的环境时,表格型方法在存储和查找效率上都受局限,DQN的提出解决了这一局限,使用神经网络来近似替代Q表格。

本质上DQN还是一个Q-learning算法,更新方式一致。为了更好的探索环境,同样的也采用epsilon-greedy方法训练。

在Q-learning的基础上,DQN提出了两个技巧使得Q网络的更新迭代更稳定。


【资料图】

经验回放(Experience Replay): 使用一个经验池存储多条经验s,a,r,s",再从中随机抽取一批数据送去训练。

固定目标(Fixed Q-Target): 复制一个和原来Q网络结构一样的Target-Q网络,用于计算Q目标值。

公众号算法美食屋后台回复关键词:torchkeras,获取本文notebook源码~

不了解强化学习的同学,推荐先阅读:Q-learning解决悬崖问题

一,准备环境

gym是一个常用的强化学习测试环境,可以用make创建环境。

env具有reset,step,render几个方法。

倒立摆问题

环境设计如下:

倒立摆问题环境的状态是无限的,用一个4维的向量表示state.

4个维度分别代表如下含义

cart位置:-2.4 ~ 2.4cart速度:-inf ~ infpole角度:-0.5 ~ 0.5 (radian)pole角速度:-inf ~ inf

智能体设计如下:

智能体的action有两种,可能的取值2种:

0,向左1,向右

奖励设计如下:

每维持一个步骤,奖励+1,到达200个步骤,游戏结束。

所以最高得分为200分。

倒立摆问题希望训练一个智能体能够尽可能地维持倒立摆的平衡。

import gym import numpy as np import pandas as pd import timeimport matplotlibimport matplotlib.pyplot as pltfrom IPython import displayprint("gym.__version__=",gym.__version__)%matplotlib inline#可视化函数:def show_state(env, step, info=""):    plt.figure(num=10086,dpi=100)    plt.clf()    plt.imshow(env.render())    plt.title("step: %d %s" % (step, info))    plt.axis("off")    display.clear_output(wait=True)    display.display(plt.gcf())    plt.close()    env = gym.make("CartPole-v1",render_mode="rgb_array") # CartPole-v0: 预期最后一次评估总分 >180(最大值是200)env.reset()action_dim = env.action_space.n   # CartPole-v0: 2obs_shape = env.observation_space.shape   # CartPole-v0: (4,)

gym.__version__= 0.26.2

env.reset()done = Falsestep = 0while not done:        action = np.random.randint(0, 1)    state,reward,done,truncated,info = env.step(action)    step+=1    print(state,reward)    time.sleep(1.0)    #env.render()     show_state(env,step=step)    #print("step {}: action {}, state {}, reward {}, done {}, truncated {}, info {}".format(\    #        step, action, state, reward, done, truncated,info))    display.clear_output(wait=True)

可以看到,没有训练智能体之前,我们采取随机动作的话,只维持了10步,倒立摆就因为倾斜角度超出范围而导致游戏结束。?

二,定义Agent

DQN的核心思想为使用一个神经网络来近似替代Q表格。

Model: 模型结构, 负责拟合函数 Q(s,a)。主要实现forward方法。

Agent:智能体,负责学习并和环境交互, 输入输出是numpy.array形式。有sample(单步采样), predict(单步预测), 有predict_batch(批量预测), compute_loss(计算损失), sync_target(参数同步)等方法。

import torch from torch import nnimport torch.nn.functional as Fimport copy class Model(nn.Module):    def __init__(self, obs_dim, action_dim):                # 3层全连接网络        super(Model, self).__init__()        self.obs_dim = obs_dim        self.action_dim = action_dim         self.fc1 = nn.Linear(obs_dim,32)        self.fc2 = nn.Linear(32,16)        self.fc3 = nn.Linear(16,action_dim)    def forward(self, obs):        # 输入state,输出所有action对应的Q,[Q(s,a1), Q(s,a2), Q(s,a3)...]        x = self.fc1(obs)        x = torch.tanh(x)        x = self.fc2(x)        x = torch.tanh(x)        Q = self.fc3(x)        return Q    model = Model(4,2)model_target = copy.deepcopy(model)model.eval()model.forward(torch.tensor([[0.2,0.1,0.2,0.0],[0.3,0.5,0.2,0.6]]))model_target.eval() model_target.forward(torch.tensor([[0.2,0.1,0.2,0.0],[0.3,0.5,0.2,0.6]]))

tensor([[-0.1148,  0.0068],        [-0.1311,  0.0315]], grad_fn=)

import torch from torch import nn import copy class DQNAgent(nn.Module):    def __init__(self, model,         gamma=0.9,        e_greed=0.1,        e_greed_decrement=0.001        ):        super().__init__()                self.model = model        self.target_model = copy.deepcopy(model)          self.gamma = gamma # reward 的衰减因子,一般取 0.9 到 0.999 不等                self.e_greed = e_greed  # 有一定概率随机选取动作,探索        self.e_greed_decrement = e_greed_decrement  # 随着训练逐步收敛,探索的程度慢慢降低                self.global_step = 0        self.update_target_steps = 200 # 每隔200个training steps再把model的参数复制到target_model中                    def forward(self,obs):        return self.model(obs)        @torch.no_grad()    def predict_batch(self, obs):        """ 使用self.model网络来获取 [Q(s,a1),Q(s,a2),...]        """        self.model.eval()        return self.forward(obs)            #单步骤采样        def sample(self, obs):        sample = np.random.rand()  # 产生0~1之间的小数        if sample < self.e_greed:            action = np.random.randint(self.model.action_dim)  # 探索:每个动作都有概率被选择        else:            action = self.predict(obs)  # 选择最优动作        self.e_greed = max(            0.01, self.e_greed - self.e_greed_decrement)  # 随着训练逐步收敛,探索的程度慢慢降低        return action        #单步骤预测       def predict(self, obs):  # 选择最优动作        obs = np.expand_dims(obs, axis=0)        tensor = torch.tensor(obs,dtype=torch.float32).to(self.model.fc1.weight.device)        pred_Q = self.predict_batch(tensor)        action = torch.argmax(pred_Q,1,keepdim=True).cpu().numpy()          action = np.squeeze(action)        return action            def sync_target(self):        """ 把 self.model 的模型参数值同步到 self.target_model        """        self.target_model.load_state_dict(self.model.state_dict())        def compute_loss(self, obs, action, reward, next_obs, done):                # 每隔200个training steps同步一次model和target_model的参数        if self.global_step % self.update_target_steps == 0:            self.sync_target()        self.global_step += 1                        # 从target_model中获取 max Q" 的值,用于计算target_Q        self.target_model.eval()        next_pred_value = self.target_model(next_obs)        best_value = torch.max(next_pred_value, dim = 1,keepdim=True).values         target = reward.reshape((-1,1)) + (            torch.tensor(1.0) - done.reshape(-1,1)) * self.gamma * best_value                #print("best_value",best_value.shape)        #print("target",target.shape)        # 获取Q预测值        self.model.train()        pred_value = self.model(obs)          action_onehot = F.one_hot(action.reshape(-1),                num_classes = self.model.action_dim).float()        prediction = torch.sum(pred_value*action_onehot,dim= 1,keepdim=True)                #print("pred_value",pred_value.shape)        #print("action_onehot",action_onehot.shape)        #print("prediction",prediction.shape)                # 计算 Q(s,a) 与 target_Q的均方差,得到loss        loss = F.smooth_l1_loss(target,prediction)        return loss 

agent = DQNAgent(model,gamma=0.9,e_greed=0.1,                 e_greed_decrement=0.001) 

agent.predict_batch(torch.tensor([[2.0,3.0,4.0,2.0],[1.0,2.0,3.0,4.0]]))

tensor([[-0.1596, -0.0481],        [-0.0927,  0.0318]])

loss = agent.compute_loss(torch.tensor([[2.0,3.0,4.0,2.0],[1.0,2.0,3.0,4.0],[1.0,2.0,3.0,4.0]]),          torch.tensor([[1],[0],[0]]),          torch.tensor([[1.0],[1.0],[1.0]]),         torch.tensor([[2.0,3.0,0.4,2.0],[1.0,2.0,3.0,4.0],[1.0,2.0,3.0,4.0]]),         torch.tensor(0.9))print(loss)

tensor(0.5757, grad_fn=)

三,训练Agent

import randomimport collectionsimport numpy as npLEARN_FREQ = 5 # 训练频率,不需要每一个step都learn,攒一些新增经验后再learn,提高效率MEMORY_SIZE = 2048    # replay memory的大小,越大越占用内存MEMORY_WARMUP_SIZE = 512  # replay_memory 里需要预存一些经验数据,再开启训练BATCH_SIZE = 128   # 每次给agent learn的数据数量,从replay memory随机里sample一批数据出来

#经验回放class ReplayMemory(object):    def __init__(self, max_size):        self.buffer = collections.deque(maxlen=max_size)    # 增加一条经验到经验池中    def append(self, exp):        self.buffer.append(exp)    # 从经验池中选取N条经验出来    def sample(self, batch_size):        mini_batch = random.sample(self.buffer, batch_size)        obs_batch, action_batch, reward_batch, next_obs_batch, done_batch = [], [], [], [], []        for experience in mini_batch:            s, a, r, s_p, done = experience            obs_batch.append(s)            action_batch.append(a)            reward_batch.append(r)            next_obs_batch.append(s_p)            done_batch.append(done)        return np.array(obs_batch).astype("float32"), \            np.array(action_batch).astype("int64"), np.array(reward_batch).astype("float32"),\            np.array(next_obs_batch).astype("float32"), np.array(done_batch).astype("float32")    def __len__(self):        return len(self.buffer)    

from torch.utils.data import IterableDataset,DataLoader  class MyDataset(IterableDataset):    def __init__(self,env,agent,rpm,stage="train",size=200):        self.env = env        self.agent = agent         self.rpm = rpm if stage=="train" else None        self.stage = stage        self.size = size             def __iter__(self):        obs,info = self.env.reset() # 重置环境, 重新开一局(即开始新的一个episode)        step = 0        batch_reward_true = [] #记录真实的reward        while True:            step += 1            action = self.agent.sample(obs)             next_obs, reward, done, _, _ = self.env.step(action) # 与环境进行一个交互            batch_reward_true.append(reward)                        if self.stage=="train":                self.rpm.append((obs, action, reward, next_obs, float(done)))                if (len(rpm) >MEMORY_WARMUP_SIZE) and (step % LEARN_FREQ == 0):                    #yield batch_obs, batch_action, batch_reward, batch_next_obs,batch_done                    yield self.rpm.sample(BATCH_SIZE),sum(batch_reward_true)                    batch_reward_true.clear()                        else:                obs_batch = np.array([obs]).astype("float32")                action_batch = np.array([action]).astype("int64")                reward_batch = np.array([reward]).astype("float32")                next_obs_batch = np.array([next_obs]).astype("float32")                done_batch = np.array([float(done)]).astype("float32")                batch_data = obs_batch,action_batch,reward_batch,next_obs_batch,done_batch                yield batch_data,sum(batch_reward_true)                batch_reward_true.clear()                            if self.stage =="train":                next_action = self.agent.sample(next_obs) # 训练阶段使用探索策略            else:                next_action = self.agent.predict(next_obs) # 验证阶段使用模型预测结果             action = next_action            obs = next_obs               if done:                if self.stage=="train" and len(self.rpm)

#ReplayMemory预存数据while len(ds_train.rpm)

1347167272511521

def collate_fn(batch):    samples,rewards = [x[0] for x in batch],[x[-1] for x in batch]     samples = [torch.from_numpy(np.concatenate([x[j] for x in samples])) for j in range(5)]     rewards = torch.from_numpy(np.array([sum(rewards)]).astype("float32"))    return samples,rewards dl_train = DataLoader(ds_train,batch_size=1,collate_fn=collate_fn)dl_val = DataLoader(ds_val,batch_size=1,collate_fn=collate_fn)

for batch in dl_train:    break

import sys,datetimefrom tqdm import tqdmimport numpy as npfrom accelerate import Acceleratorfrom torchkeras import KerasModelimport pandas as pd from copy import deepcopyclass StepRunner:    def __init__(self, net, loss_fn, accelerator=None, stage = "train", metrics_dict = None,                  optimizer = None, lr_scheduler = None                 ):        self.net,self.loss_fn,self.metrics_dict,self.stage = net,loss_fn,metrics_dict,stage        self.optimizer,self.lr_scheduler = optimizer,lr_scheduler        self.accelerator = accelerator if accelerator is not None else Accelerator()        def __call__(self, batch):                samples,reward = batch        #torch_data = ([torch.from_numpy(x) for x in batch_data])        loss = self.net.compute_loss(*samples)                #backward()        if self.optimizer is not None and self.stage=="train":            self.accelerator.backward(loss)            if self.accelerator.sync_gradients:                self.accelerator.clip_grad_norm_(self.net.parameters(), 1.0)            self.optimizer.step()            if self.lr_scheduler is not None:                self.lr_scheduler.step()            self.optimizer.zero_grad()                                    #losses (or plain metric)        step_losses = {self.stage+"_reward":reward.item(),                        self.stage+"_loss":loss.item()}                #metrics (stateful metric)        step_metrics = {}        if self.stage=="train":            if self.optimizer is not None:                step_metrics["lr"] = self.optimizer.state_dict()["param_groups"][0]["lr"]            else:                step_metrics["lr"] = 0.0        return step_losses,step_metrics    class EpochRunner:    def __init__(self,steprunner,quiet=False):        self.steprunner = steprunner        self.stage = steprunner.stage        self.accelerator = steprunner.accelerator        self.net = steprunner.net        self.quiet = quiet            def __call__(self,dataloader):        dataloader.agent = self.net         n = dataloader.size  if hasattr(dataloader,"size") else len(dataloader)        loop = tqdm(enumerate(dataloader,start=1),                     total=n,                    file=sys.stdout,                    disable=not self.accelerator.is_local_main_process or self.quiet,                    ncols=100                   )        epoch_losses = {}        for step, batch in loop:             if step

keras_model = KerasModel(net= agent,loss_fn=None,        optimizer=torch.optim.Adam(agent.model.parameters(),lr=1e-2))dfhistory = keras_model.fit(train_data = dl_train,    val_data=dl_val,    epochs=600,    ckpt_path="checkpoint.pt",    patience=100,    monitor="val_reward",    mode="max",    callbacks=None,    plot= True,    cpu=True)

四,评估Agent

# 评估 agent, 跑 3 次,总reward求平均def evaluate(env, agent, render=False):    eval_reward = []    for i in range(2):        obs,info = env.reset()        episode_reward = 0        step=0        while step<300:            action = agent.predict(obs)  # 预测动作,只选最优动作            obs, reward, done, _, _ = env.step(action)            episode_reward += reward            if render:                show_state(env,step,info="reward="+str(episode_reward))            if done:                break            step+=1        eval_reward.append(episode_reward)    return np.mean(eval_reward)

#直观显示动画env = gym.make("CartPole-v1",render_mode="rgb_array") evaluate(env, agent, render=True)

可以看到,训练完成之后,我们的agent已经变得非常的智能了,能够维持倒立摆的平衡超过200s。?

288.5

五,保存Agent

torch.save(agent.state_dict(),"dqn_agent.pt")

万水千山总是情,点个在看行不行???

本文notebook源码,以及更多有趣范例,可在公众号算法美食屋后台回复关键词:torchkeras,获取~

x 广告
最近更新

天天观察:30分钟吃掉DQN算法

2023-06-22

重点聚焦!曼谷爱情故事之拜托(关于曼谷爱情故事之拜托介绍)

2023-06-22

破而后立否极泰来_破而后立

2023-06-22

海口两级法院公开宣判4起毒品犯罪案件-天天观焦点

2023-06-22

焦点要闻:具有这六个特征的人,无论现在混的如何,早晚都能出人头地

2023-06-21

宁德时代:拟使用不超78亿元闲置募集资金进行现金管理 -天天观速讯

2023-06-21

你的美式豪华之旅,由林肯航海家开启!

2023-06-21

【播资讯】有我的地方就是江湖(对于有我的地方就是江湖简单介绍)

2023-06-21

世界热头条丨电脑开机后马上进入睡眠

2023-06-21

有臭氧中度污染风险!河北6月下旬空气质量预报来了_环球热点

2023-06-21

全球热门:河南天壕新能拟北交所IPO 募资3亿元

2023-06-21

高压锅压牛肉需要多长时间? 环球通讯

2023-06-21

电力需求猛增 美国得州电价短短几小时上涨80%!_焦点资讯

2023-06-21

经典与创新融合,“老派”和“新派”比拼,这个端午,枫泾粽子热销

2023-06-21

CBC基本金属一周要闻精选(6.19-6.21) 快看

2023-06-21

法治课代表|遗产继承的八个常见误区!

2023-06-21

环球微资讯!公安部:2022年全国破获3.5万起毒品犯罪案件

2023-06-21

安卓手机充电充不进去解决方法(安卓手机充电充不进去)-天天微速讯

2023-06-21

【世界新视野】桐柏县毕业生档案邮寄地址+电话

2023-06-21

盐城市财政局盐城市政府采购网(盐城市财政局网站) 环球短讯

2023-06-21

西安市义务教育招生入学 学区划分方案21日公布 百事通

2023-06-21

经开区企业快讯|天博检验顺利通过ISO15189实验室认可现场复评审

2023-06-21

赣州获专项资金3.568亿元

2023-06-21

2023浙江绍兴市柯桥区中国轻纺城第二小学教育选调部分在职教师8人公告 世界信息

2023-06-21

徐榛蔚回娘家推花莲丰年节 张善政开心畅聊

2023-06-21

当前速读:煌上煌鸭脖加盟 煌上煌鸭脖加盟总店

2023-06-21

每日讯息!华润置地完成发行15亿超短期融资券 利率为2.25%

2023-06-21

独库公路恢复通车 好风景这样带来好前景→ 当前要闻

2023-06-21

签约揭牌! 天融信与湖北大学共建研究生工作站、实习实践基地

2023-06-21

世界百事通!6月21日双枪科技发布公告,其股东减持72.07万股

2023-06-21

再惠(上海)网络科技有限公司荣获2023年中国餐饮SaaS行业拳头奖两项大奖

2023-06-21

天天百事通!“2023山东夏日消费季”启动

2023-06-21

世界速看:《那年那兔那些事儿》动画电影备案公示:已同意拍摄

2023-06-21

tracy是什么意思啊_Tracy是什么意思

2023-06-21

胡亚丹陈若琳(胡亚丹)-每日报道

2023-06-21

【快播报】苹果被裁定就工会问题非法审问员工

2023-06-21

美核心通胀仍在持续 金价还有下跌空间

2023-06-20

创建平安校园自查自评报告

2023-06-20

天天新消息丨福立旺涨20.01%

2023-06-20

马文浩:咬牙坚持 小“菜鸟”终飞国赛

2023-06-20

环球头条:统招共用、定向招生……各地这样织牢基层医疗卫生服务网底

2023-06-20

贷款市场报价利率下调降低实体经济融资成本 激发有效融资需求|今日热闻

2023-06-20

23津城建CP007票面利率为7.4400% 全球快消息

2023-06-20

上海财大emba(上海财大EMBA)

2023-06-20

航空工业洪都:抓出成效 抓出特色

2023-06-20

金至尊黄金价格今天多少一克(2023年06月20日)

2023-06-20

环球热资讯!逆战fps不稳定怎么办_打游戏fps不稳定怎么办

2023-06-20

饭店开业首日突遇暴雨,食客积水中就餐,当地水务局曾发布洪水黄色预警 环球观点

2023-06-20

继百度、阿里之后,腾讯加入模型即服务赛道!MaaS或将成为评判云服务新标准

2023-06-20

安卓平板趋势新品取得高增长 京东618成交额同比增速超65%|天天热点评

2023-06-20

中国消防救援学院在山西招收10名青年学生-每日快播

2023-06-20

何园这处景观要老天赏脸 游客打卡注雨观瀑|全球今日讯

2023-06-20

热点![快讯]金银河31万限售股6月21日解禁

2023-06-20

你好,我想问一下,在发生争执时录视频涉嫌侵权和违法嘛 全球实时

2023-06-20

女子称母亲到派出所接受询问后死亡 官方最新通报来了

2023-06-20

中国男性腰围标准_男性腰围标准 环球快资讯

2023-06-20

浪潮信息三年投90亿研发生态伙伴超2万家 聚焦算力年内股价涨1.6倍三基金进股东前十 环球热资讯

2023-06-20

足球——U17亚洲杯:中国平塔吉克斯坦

2023-06-20

宋人文集概述_天天快资讯

2023-06-20

小姨妈19日足球赛事推荐:威尔士不败拿分-实时

2023-06-19

【天天速看料】word背景颜色如何去掉_word背景颜色怎么去掉

2023-06-19

空客与沙特公司达成67亿美元直升机生产协议

2023-06-19

我们已经看到LG在LGV30上执行了其新的智能手机发布策略-环球今日讯

2023-06-19

聚焦:恋上黑涩会大结局_恋上黑涩会的剧情简介

2023-06-19

最新快讯!空客与沙特达成67亿美元直升机合同

2023-06-19

高通、联发科找到共同点了:骁龙8G3、天玑9300 AI性能爆发

2023-06-19

国足主力阵容保持稳定,主帅透露有新面孔首发,两个位置可能变化-环球动态

2023-06-19

深圳黑牌照是什么意思_黑牌照是什么意思 世界新消息

2023-06-19

中国财险(02328)预期将于7月28日派发末期股息每股0.478元

2023-06-19

男性身高153_男性身高152

2023-06-19

2023年吉林省养老金上调方案细则和退休职工涨工资新消息(预估)|每日快看

2023-06-19

西安经开区:“城管蓝”为中考护航 用心答好“静音卷”

2023-06-19

天天关注:平舆县邮政分公司 开展安全生产警示教育活动

2023-06-19

《一元二次方程的解法》说课稿

2023-06-19

*ST天山(300313.SZ):公司的经营状况已经发生了一些变化

2023-06-19

广东省惠州市2023-06-14 21:00发布暴雨黄色预警

2023-06-19

华工科技6月19日盘中涨幅达5% 前沿热点

2023-06-19

曼伞村(关于曼伞村介绍) 环球聚焦

2023-06-19

摩托艇——水中蛟龙 全球最新

2023-06-19

迪巴拉:梅西代表着足球中一些特别的东西 人们对阿根廷有认同感

2023-06-19

环球观天下!有凤来仪_对于有凤来仪简单介绍

2023-06-19

新华全媒+丨从“农机专业村”看小麦机收变化 最新

2023-06-19

武汉二手房挂牌飙升至近19万套,“一个购房人十几个中介抢”,“首付分期”“首付贷”再现 天天实时

2023-06-19

抢墒播种!山东省农业农村厅提示

2023-06-19

六年级上册数学圆的面积练习题(圆的面积周长练习题) 今日热闻

2023-06-19

[视频]【在希望的田野上】抢抓农时 各地夏收夏种压茬推进_天天播资讯

2023-06-19

每日速看!国内首款市域C型动车组在上海亮相

2023-06-19

世界实时:鹤城区:着力优化营商环境,护航中小企业发展

2023-06-18

天天亮点!全球速讯:杨紫和范丞丞官宣恋情,太甜了!

2023-06-18

新华全媒+丨从“农机专业村”看小麦机收变化

2023-06-18

世纪天鸿:鸿助教是一款由公司基于大语言模型研发的教师端助教产品

2023-06-18

车市终于逐月改善!头部新能源企业强者恒强,这些智能化零部件公司也将受益

2023-06-18

排尿困难意外查出癌症,小伙一举动挽救父亲生命,送上最好的节日礼物

2023-06-18

炎炎夏日最好不要衬衫配西装裤,今年流行这样穿,时髦干练显年轻

2023-06-18

3 8 16 27 41找规律填数_3 8-热讯

2023-06-18

世界观热点:vivo S17系列收获如潮般好评,优秀产品力获得广泛认可

2023-06-18

环球即时看!海锅股份: 关于设立募集资金专项账户并签订募集资金监管协议的公告

2023-06-18

食用可可粉能减肥?听听专家怎么说

2023-06-18

焦点日报:吉林省通化县发布高温蓝色预警

2023-06-18

霍启刚:中国香港代表团备战充分 对亚运期待已久_全球焦点

2023-06-18

嘉定区气象局发布暴雨黄色预警【Ⅲ级/较重】【2023-06-18】 今日快看

2023-06-18

上市公司有哪些类型_上市公司有哪些|全球微头条

2023-06-18

从东京回来了!马云现身杭州:观看阿里全球数学竞赛决赛

2023-06-18

每日资讯:最美文字短句(最美文字)

2023-06-18

京东产品经理能力模型.xls-焦点播报

2023-06-18

简讯:mp3怎么用教学_mp3怎么用

2023-06-18

实现自我价值英文 实现自我价值 环球今日报

2023-06-17

今日热文:粽子飘香迎端午

2023-06-17

华强北的手表,汤主的测评来了!

2023-06-17

总预算超77.2亿!中国移动启动云化核心网设备新建部分集采_环球信息

2023-06-17

美媒:施瓦辛格称,如果宪法允许他将参加2024年大选 天天热议

2023-06-17

水准仪使用及计算方法图解_水准仪使用及计算方法 头条焦点

2023-06-17

给领导发文件怎么说(发文件给领导应该怎么说)-世界看点

2023-06-17

聚焦:株洲市夏季冲浪节暨云龙水上乐园第九季开园仪式举行

2023-06-17

全球看点:中考考生考前突发“气胸”,医护人员全程暖心护考

2023-06-17

世界观速讯丨长图丨夏日来信 龙舟之乡道县邀您奔赴一场“龙船之约”

2023-06-17

从村超爆火到国足4-0,中国足球一夜重回正轨,高洪波说到做到

2023-06-17

无公害麦田收获 一次京郊山村的品牌农产品实践|全球要闻

2023-06-17

世界滚动:太省了?!梅西当着镜头将掉在地上的食物捡起吃掉❗

2023-06-17

环球快播:人民币大幅反弹 北上资金两天净流入近200亿元

2023-06-17

美国的英语全称是什么? “美国”还配得上中国人的“美”称吗? 看热讯

2023-06-17

没有蒜怎么煮好番薯叶?

2023-06-17

思锐民间组织管理信息系统 世界新消息

2023-06-17

里德:若离开华子会让我心碎 无论首发替补我会优先考虑留森林狼

2023-06-17

【世界时快讯】有一种惊艳,就在石家庄的夏夜里!

2023-06-16

安肾汤|世界今日报

2023-06-16

全球实时:用“非遗”打开成都的夏天

2023-06-16

全球看点:华为张顺茂:共建工业智能体 推进工业新四化

2023-06-16

环球报道:朱元璋闭关锁国的原因_闭关锁国的原因

2023-06-16

石滩镇:村民分工包粽子感受端午文化传递温暖_观热点

2023-06-16

县和区的财政区别_县和区的区别-天天热闻

2023-06-16

俄总统助理:普京计划访问土耳其

2023-06-16

孟村回族自治县气象台发布高温橙色预警【Ⅱ级/严重】【2023-06-16】 当前看点

2023-06-16

快资讯丨火箭军工程大学在海南招生13人

2023-06-16

焦点消息!爱辉区气象台发布大风蓝色预警【IV级/一般】【2023-06-16】

2023-06-16

如何看待北航10系专业分流_如何看待北航陈小武 全球今头条

2023-06-16

世界看热讯:未来一周海南有大范围35℃以上高温天气

2023-06-16

女生为什么肾不好的原因_女生为什么会肾不好 环球实时

2023-06-16

环球视讯!焦点资讯:商务部推动出台支持恢复和扩大消费的系列政策措施

2023-06-16

新手如何设置无线路由器密码_怎样设置无线路由器密码

2023-06-16

家里面网卡|前沿热点

2023-06-16

净水器什么牌子的好?HR7精密材质与科技智慧结合打造高端水质

2023-06-16

焦点热讯:天津市滨海新区发布高温红色预警

2023-06-16

s弯怎么看点打方向盘_s弯怎么看点打方向盘_环球微动态

2023-06-16

天天消息!俄官员:西方在全球经济领域影响力下降

2023-06-16

七台河:高企培育交出亮眼成绩单

2023-06-16

汞齐有毒吗_汞齐

2023-06-16

【世界新视野】科学幼小衔接,龙江路小学新津分校迎“小客人”到访

2023-06-16

重大转机!辽宁失意人被打一针强心剂 能就此重返巅峰?-环球实时

2023-06-16

SMM锌早评

2023-06-16

当前观察:DNF赛丽亚的爱任务怎么做_游戏DNF赛丽亚的爱任务怎么做

2023-06-16

天天热推荐:苹果手机中调时间的具体操作教程

2023-06-16

智取生辰纲的主要人物是谁_智取生辰纲的主要人物介绍 天天新要闻

2023-06-16

百千万工程|高温下的坚守,只为畅通民生路!宅梧明靖线改造火热推进

2023-06-15

英飞凌推出新一代1200 V CoolSiC MOSFET 适用于汽车应用

2023-06-15

创业板推出时间表_创业板推出时间

2023-06-15

襄阳樊城王伙小学:开展消防疏散演练 提高防灾应急能力|环球快看点

2023-06-15

1299元,中国电信发布麦芒A20手机,5000mAh大电池,2TB云盘空间

2023-06-15

中粮大悦城荣获2022年度城市商业杰出运营商

2023-06-15

刘洲成发长文洗白自己_刘洲成发型

2023-06-15

视频怎么去水印手机剪映_视频怎么去水印

2023-06-15

湖南公示10个纺织行业新模式新业态典型案例 长沙这些企业上榜

2023-06-15

四川长虹投资新设科技发展公司 经营范围含电池制造

2023-06-15

江苏昆山千灯镇开展青年手绘乡村活动

2023-06-15

当前快讯:租房政策指南:在北京上学租房必须是大产权的才可以吗?

2023-06-15

教育系统推进“互联网+就业”模式 助力高校毕业生更好就业_天天微头条

2023-06-15

广西幼师在第十一届“挑战杯”广西大学生课外学术科技作品竞赛中获得历史最佳成绩

2023-06-15

全球快播:58安居客研究院研究总监陆骑麟解读5月70城房价:短期内楼市依旧有“二次探底”可能性

2023-06-15

环球资讯:直击论坛现场:中外嘉宾眼中的全球人权治理

2023-06-15

港股光伏太阳能股走高,福莱特玻璃涨超5%

2023-06-15

环球报道:中欧班列(武汉)密集开行 助“湖北造”走出国门

2023-06-15

国家发改委:围绕扩大有效投资 着力推动投资高质量发展 热资讯

2023-06-15

全球速递!华豫之门最新报名时间(华豫之门怎样报名)

2023-06-15

每日热文:世纪华通:有VR红色游戏、通过VR体验的数字疗法等VR领域应用

2023-06-15

杰克极限闪击林炜翔,一人追击四人!TES零封FPX,斩获五连胜! 当前资讯

2023-06-15

男子大晚上蹲在车前干这事......视频拍下全过程

2023-06-15

世界焦点!同学英文新年祝福语_同学英文

2023-06-15

云南国旅服务怎么样_云南国旅怎么样

2023-06-15

世界快看:淘宝每日一猜6月15号答案,天猫618淘宝大赢家今日答案

2023-06-15

感恩企业的简短短语 感恩企业的句子|全球报资讯

2023-06-15

指标之王MACD金叉,大地海洋或迎来最佳买入时机!看13次金叉数据 全球简讯

2023-06-14

高质量发展,深圳靠什么?_滚动

2023-06-14

“博物馆在行动”论坛举办:聚焦博物馆在铸牢中华民族共同体意识等方面之实践|关注

2023-06-14

虚拟内存怎么设置较好

2023-06-14

小学秋季运动会开幕式校长致辞_小学秋季运动会感悟400字

2023-06-14

环球播报:多家股份行下调存款利率

2023-06-14

揽金109.94亿元!北京土拍再掀热潮,3宗地触顶成交|世界简讯

2023-06-14

环球简讯:热评丨进度超八成!颗粒归仓,稳住粮食安全“压舱石”

2023-06-14

中原银行:董事长郭浩的任职资格获核准_全球信息

2023-06-14

红腹锦鸡能吃吗 多少钱一只 环球新视野

2023-06-14

视频|1公斤金条说买就买?上海警方捣毁“黄金洗钱”团伙 重点聚焦

2023-06-14

人工智能能否带来“超级阅读”|当前时讯

2023-06-14

新筑股份:晟天新能源目前主要以集中式光伏发电站投资建设运营为主-世界新要闻

2023-06-14

西南地区三大铁路干线集中修圆满收官

2023-06-14

科创浪潮奔涌大湾区|焦点讯息

2023-06-14

打卡机时间不准怎么调_打卡机怎么调时间

2023-06-14

每日热闻!中国国家能源局:鼓励并网运行超过15年的风电场开展改造升级

2023-06-14

全球快看点丨吸功大法能不能吸金刚不坏神功_吸功大法

2023-06-14

焦点速递!高考采访“最强嘴替”为啥引发关注?

2023-06-14

三六零(601360):6月13日北向资金增持1818.86万股

2023-06-14