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

GAMES104:17 游戏引擎的玩法系统:高级AI-学习笔记

文章目录

  • 课前QA
  • 一,层次任务网络(Hierarchical Tasks Network,HTN)
    • 1.1 HTN Framework
    • 1.2 HTN Task Types
      • 1.2.1 Primitive Task基本任务
      • 1.2.2 Compound Task符合任务
    • 1.3 Planning
    • 1.4 Replan
    • 1.5 总结
  • 二,目标导向行为规划Goal-Oriented Action Planning(GOAP)
    • 2.1 GOAP Structure
      • 2.1.1 Goal Set
      • 2.1.2 Action Set
    • 2.2 Backward Planning
    • 2.3 Build States-Action-Cost Graph
    • 2.4 GOAP 总结
  • 三,蒙特卡洛树搜索Monte Carlo Tree Search(MCTS)
    • 3.1 States and Actions
    • 3.2 Simulation 的基础概念
    • 3.3 Iteration Steps迭代
      • 3.3.1 Selection — Expandable Node
      • 3.3.2 Expansion and Simulation
    • 3.3 MCTS 总结
  • 四,机器学习基础Machine Learning Basic
    • 4.1 Markov Decision Process(MDP)马尔可夫决策过程
  • 五,Build Advanced Game AI
    • 5.1 State
    • 5.2 Actions
    • 5.3 Rewards
    • 5.4 NN architectures
    • 5.5 Training Strategy
    • 5.6 Hybrid混合策略


课前QA

  • 怎么看待 AI 读取玩家操作指令:可以简单读取一下,让 AI 更智能,但不能给太高权限(收集所有信息)
  • AI行为的预算:AI 可以低频地更新底层的行为(比如1s一次),高频地更新细节的行为,根据权重和优先级调整,比如单机的ai时间预算可以比较高
  • 能不能将 AI 计算用网络服务器计算:可以,专门计算 AI的服务器或者分布式计算都可以,但是需要信息上传的时间,分布式还需要上传多份

一,层次任务网络(Hierarchical Tasks Network,HTN)

层次任务网络是经典的游戏 AI 技术。

  • 上一课的行为树更像是一个无脑的反应机器,其根据设定功能行为,是有构的;
  • 而HTN是从任务或目标出发,把目标分为几个步骤,步骤内可以包含不同选项,并根据自身状态选择合适的行为一次完成步骤,完全类似人的思考过程,可以更好地表达 AI 自身的意志和驱动力。

1.1 HTN Framework

在这里插入图片描述
World State :AI 对世界的主观认知(而不是真实世界的客观描述),反馈到Planner
Sensors :传感器、感知器,从游戏中抓取状态
HTN Domain:层次化树状 task
Planner :制定的计划 task
plan runner:执行计划,在 task 结束后更新 World State

1.2 HTN Task Types

1.2.1 Primitive Task基本任务

primitive task 一般表示一个具体的动作或行为。见上图左,每个 primitive task 都有 precondition( world state properties)、action 以及 effects (改变properties)三个要素。

1.2.2 Compound Task符合任务

见上图右,compound task 由很多method构成,每个method都有自己的precondition;我们把这些方法按照一定的优先级组织起来并且在执行时按照优先级高到低的顺序进行选择(更像||的逻辑)。每个method还可以包含其它的 primitive task 或者 compound task,当方法内所有的 task 都执行完毕则表示任务完成。(感觉是行为树的拓展包装)

在这里插入图片描述

1.3 Planning

接下来就可以进行规划了,我们从 root task 出发不断进行展开逐步完成每个任务。

  1. 从 root task 开始检查 precondition,选择一个满足条件的 compound task

  2. 对这个当前指向的 compound task 展开

    在这个展开的 task 中,先把 world state 拷贝一份,然后检查 precondition,如果满足,就假设这个 task 里的 action 全部可以执行成功,并把其 effect 修改到拷贝的 world state里(带着目的预测)。如果执行时发现不能成功执行,再层层返回false,去选择下一个task

  3. 重复第二步直到没有 task 为止

最后输出的plan里就只有Primitive Task,再把plan交给runner执行

  • Run plan:依次执行 task,直到所有 task 都成功或者有一个 task 失败(游戏时动态的,可能决策时可以,执行到这里时又不行了)

1.4 Replan

  • 需要重新计划的情况:
    1. 在Run plan时有task执行失败,就需要重新计划;
    2. 计划成功执行完后,或者没有task时,需要计划下一步动作;
    3. world state被修改后被sensor感应到时,也需要重新计划

1.5 总结

  • 优点:HTN 和 BT 非常相似,但是是BT的高阶版本,但HTN更加灵活、符合人的直觉、也更易于设计师进行掌握;可以带着目的预测,任务计划也更长程
  • 缺点:由于用户行为不可预测,因此task很容易失败或满足不了precondition;并且world state与任务effect影响对设计师是挑战(比如忘记设置某个条件;或者如果 task 链路过长但是环境变化很快,那么 AI 的行为就会变化很快,看上去振动一样)

二,目标导向行为规划Goal-Oriented Action Planning(GOAP)

GOAP方法更加自动化,并且不同于向前planning,GOAP是backward planning;因此和前面介绍过的方法相比 GOAP 一般会更适合动态的环境。-----虚幻的EQS就是基于GOAP

2.1 GOAP Structure

GOAP 的整体结构与 HTN 非常相似,只是 domain 被替换为 goal set 和 action set。

在HTN中,所谓“目标Goal”是几个task集合成的,写在注释里的;而在GOAP中“目标”有非常严格的数学定义,可以数学表达;并且在HTN中的计划,而在GOAP中应该叫“规划”
在这里插入图片描述

2.1.1 Goal Set

goal set 表示 AI 所有可以达成的目标。在 GOAP 中需要显式地用相应的状态来定义。

Goal有Precondition、Priority优先级、States状态集合三个属性,状态集合就是用来描述目标的。
在这里插入图片描述

2.1.2 Action Set

action set 类似 primitive task ,它表示 AI 可以执行的行为,它包含precondition、effct和cost三个属性。其中cost是由开发者定义的代价权重,用于排序优先级(代价低的优先)

action set 没有树状结构,所以要用 cost 来选 action

2.2 Backward Planning

GOAP在规划时会从目标来Backward倒推所需要执行的动作,反向规划是一种类似人类的思考方式:
1.在优先级排序的目标序列中选取第一个precondition已经满足的目标goal。
2. 然后查询实现目标需要满足的状态state,筛选目前world state中没有满足的state,存入“待满足state”堆栈。
3. 依次获取堆栈里的state,并找到其满足其对应的action,加入plan堆栈
4. 如果action也有未满足的state需求,也把这些state加入存入“待满足state”堆栈,(递归),直到所有的状态需求都得到了满足。

在这里插入图片描述

GOAP 中除了“能够达成目标”以外,最核心的点就在于如何选择最小代价路径达成目标,包括选择目标和选择action。这个问题可以转换为路径规划为题,可以用代价图来求解。

2.3 Build States-Action-Cost Graph

有向图里的节点是state 的组合,起点是 goal 的 states,终点是当前states;不同节点之间的有向边表示可以执行的动作,边的权重则是动作的代价。

这样整个规划问题就等价于在有向图上的最短路径问题。

在这里插入图片描述

这里可以通过上节课提过的A* 算法来求解(用未满足状态的个数来进行启发式计算???),这样不能保证找到最优的最短路,但也因此带给游戏更多真实性

2.4 GOAP 总结

  • 优点:比起HTN更加动态灵活(HTN容易导致precondition与effect混乱),并更够解耦 AI 的目标与行为
  • 缺点:比BT、FSM、HTN都慢(HTN最快),并且state与action的定义非常复杂

三,蒙特卡洛树搜索Monte Carlo Tree Search(MCTS)

上边的方法听起来都是程序设定好的行为,和真正的AI没啥关系,接下来就会讲到机器学习驱动的ai了。不过先介绍一下本节的蒙特卡洛树搜索方法作为过渡,它介于设定程序与真AI之间。AlphaGo 就是基于 MCTS 来实现的。

MCTS是一种自动plannning的方法,表现更多样。思路是在进行决策时首先模拟成千上万种可行的动作,然后从这些动作中选择最好的那个来执行(就像下围棋一样)。
MCTS 的核心是 Monte Carlo方法(Monte Carlo method),它指出定积分可以通过随机采样的方法来进行估计。

3.1 States and Actions

以围棋为例,MCTS 会根据当前棋盘上的状态来估计落子的位置(也根据规则来,不是纯随机)。

从数学的角度来看,我们把棋盘上棋子的位置称为状态(state),同时把落子的过程称为行为(action)。这样就形成了有向图中的一个step,如下图。

在这里插入图片描述
如果把数以百万计的模拟落子行为表现在图里,就会形成一个行为树(state space/tree),并在这个行为树中计算最优解。并且每走一步,都会重建这个行为树(优化:以下一步的节点重建树,重用一些node),以确保未来都是最优解
在这里插入图片描述

3.2 Simulation 的基础概念

模拟(simulation)是 MCTS 中的重要一环,指的是AI利用当前的default policy策略快速地完成整个游戏过程。

default policy 相当于预先存好的棋谱,根据这个棋谱我可以立即查到胜率,然后根据策略多次模拟计算胜率(赢得次数/模拟总次数)。
(就算根据策略路径模拟到win的结果,但实际也不一定能赢。)

  • Backpropagate:当一条路径模拟结果是失败后,会把结果从下向上传递来更新整个决策分支上的胜率
    在这里插入图片描述

3.3 Iteration Steps迭代

  1. 选择一个最有希望,且没有被完全展开的节点,
  2. 展开它,
  3. 并进行探索模拟
  4. 更新胜率
    在这里插入图片描述

但这样推演需要的算力太大了,如下图,才4步就有这么多。因此需要一些优化。在这里插入图片描述

3.3.1 Selection — Expandable Node

优先选择可拓展的节点,也就是可能性没有穷尽的 node。这里需要在两种策略中找到平衡:

  1. exploitation开发 :选择胜率高的节点
  2. exploration探索:选择模拟次数少的节点

这两种策略的权衡也是机器学习中的重点,更是我们人生选择需要权衡的地方~

那么怎么平衡呢?用UCB来评估:

  • 上界置信区间UCB (Upper Confidence Bounds)
    在这里插入图片描述
    这里还增加了一个常数C方便调整:

C 增大,访问少的更多被选中
C 减小,胜率高的更多被选中,更保守

  • 应用方法:每次都从根节点开始,层层寻找 UCB 最大的子节点,直到子节点还没模拟出结果(可拓展)
    在这里插入图片描述

3.3.2 Expansion and Simulation

对找到的节点探索时可以模拟一次或者一组,然后把模拟的结果自下而上进行更新。

迭代结束条件:超过规定次数或者内存不够时就结束

  • 然后只需要回到根节点选择一个最优的子节点进行执行即可。选择策略:
  1. max child 找 Q 最大(赢得次数最多)
  2. robust child 找 N 最大(模拟次数最多->因为在选择模拟节点是已经用UCB筛选过了)
  3. max-robust child 找 Q 和 N 最大,如果没有就继续拓展树
  4. secure child 综合考虑 Q 和 N–>下界置信区间LCB(Lower Confidence Bounds)

在这里插入图片描述

3.3 MCTS 总结

  • 优点:表现更多样化(有随机数),全自动决策,适合搜索空间巨大的决策问题
  • 缺点:计算复杂度大所以难以用在实时游戏中,并且复杂游戏中也难以定义状态和行为
  • MCTS适合回合制、行动导致的数值反馈明显的游戏

四,机器学习基础Machine Learning Basic

  • 为什么游戏ai需要机器学习

之前的游戏 AI 的行为的所有 action 都是设计师设计好的,但是深度学习得到的 action 可能是设计师意想不到的,可以提供无限可能性和更多新鲜感。尽管目前基于机器学习的游戏 AI 技术大多还处于试验阶段,但已经有一些很优秀的项目值得借鉴和学习,包括 DeepMind 的 AlphaStar 以及 OpenAI 的 Five 等。

  • machine learning 的四种类型:
    1. Supervised Learning监督学习:本质是分类器,是从标注数据总学习分类(有猫、没猫)
    2. Unsupervised Learning无监督学习:本质是聚类,是从无标注数据中学习分类
    3. Semi-supervised Learning半监督学习:从大量无标注数据一小点有标注数据中学习分类
    4. Reinforcement Learning强化学习:在reward激励函数和反馈函数的相互作用下,自己学习形成合理的策略policy。

强化学习是游戏 AI 技术的基础,其难点在于激励经常是滞后的导致难以学习。

4.1 Markov Decision Process(MDP)马尔可夫决策过程

它是强化学习的理论基础。在 MDP中智能体对环境的感知称为状态(state),环境对于智能体的反馈称为奖励(reward)。MDP 的目标是让智能体通过和环境不断的互动来学习到如何在不同的环境下进行决策,这样的一个决策函数称为策略(policy)。

在这里插入图片描述

  • MDP 数学模型
  1. 环境是变化的,从某一个状态到另一个状态是有概率失败的,所以用𝑝 (𝑠′ |𝑠, 𝑎) 表达采取动作 a 后状态从 s 转到 s’ 的概率
  2. 决策(Policy)中可能有多种行为,𝜋 (𝑎 |𝑠) = 𝑃 (𝐴𝑡 = 𝑎 |𝑆𝑡 = 𝑠) 是在状态 s 下采取行为 a 的概率
  3. 在计算总reward时,因为策略是不靠谱的,所以认为在第一步时得到的奖励是一定的,但在后续的steps中得到的奖励就要逐步乘以一个系数,如 G t = R t + 1 + γ R t + 2 + γ 2 R t + 3 … … G_t = R_{t+1} + γR_{t+2}+γ^2R_{t+3}…… Gt=Rt+1+γRt+2+γ2Rt+3……「马尔科夫过程核心:把事情变成离散的step by step」
  • 后续再根据概率、reward的数学模型,用比如梯度优化法,去优化policy

五,Build Advanced Game AI

在游戏中构建ai决策最重要的事构建游戏的Observation,也就是能够定量化表达游戏中所有的状态,使之可以被电脑感知,在此基础上再利用ai进行决策。

  • 深度强化学习(deep reinforcement learning, DRL)决策过程
    1. State:对世界状态的描述,如资源,友军,敌人,血量等
    2. Action:直接对游戏对象做出操作,也有模拟人类操作的(鼠标点击等)
    3. Reward:大到胜负,小到各种动作奖励
    4. NN design:神经网络的拓补结构和选型及结构,根据游戏机制不同
    5. Training Strategy:神经网络的训练策略

5.1 State

s t a t e = m a p + g a m e s t a t i s t i c s + u n i t s + p l a y e r d a t a state = map + game statistics + units + player data state=map+gamestatistics+units+playerdata
智能体可以直接从游戏环境获得的信息包括地图、统计数据、场景中的单位以及资源数据等。

  • Maps

Heights高地
Visibility: fog of war视野:战争迷雾
Creep
Entity owners
Alerts警报
Pathable可寻路
Buildable可建造

  • Units Information一帧中每个unit块中的信息

在这里插入图片描述

5.2 Actions

在 AlphaStar 中智能体的行为还取决于当前选中的单位。
在这里插入图片描述

5.3 Rewards

奖励函数的设计对于模型的训练以及最终的性能都有着重要的影响。

在 AlphaStar 中使用了非常简单的奖励设计,智能体仅在获胜时获得+1的奖励;并判断相同情况下 AI 的操作和人类的操作的比较,如果不一样就给惩罚(在AlphaStar中这个操作相关的反馈总体在-1~1之间,有自己的权重)。

而在 OpenAI Five (dota)中则采用了更加复杂的奖励函数,与打塔、受伤害、杀英雄等等都相关,这样就可以让ai有各种行为倾向。

5.4 NN architectures

在这里插入图片描述
上图是 AlphaStar体系结构图,其中使用了不同种类的神经网络来处理不同类型的输入数据,

  • 对于定长输入(比如资源数量、等级等)使用了 MLP(Multi-Layer Perception);
  • 对于图像数据(比如2d 地图、可走可建造图)使用了 ResNet(属于卷积神经网络CNN);
  • 对于非定长的序列(比如场上的不同种类的敌人数量)使用了 Transformer;
  • 这些encoder之后一起放到 LSTM (Long-Short Term Memory)进行处理,LSTM可以记忆历史数据并反馈到策略中
  • 最后再逐操作模块decoder。
    「有些游戏还有Raycast数据(模拟人的视角)、Mesh数据等需要处理」

5.5 Training Strategy

如果一个空白模型暴力去学习以上这些复杂的逻辑内容去做决策,那需要的算力、时间、金钱都难以承受。因此就需要一定的训练策略,比如先将大量人类操作行为投入,用监督学习的方式先训练出一个差不多的策略模型,再去优化。

比如AlphaStar 的训练过程中首先使用了监督学习的方式来从人类玩家的录像中进行学习,然后再用强化学习的方法来进行自我训练(自己的自己的变种、旧版本等去打,相当于双手互搏),来寻找全局最优解(而不是局部最优解)。

在这里插入图片描述

  • 强化学习or监督学习?

试验结果分析表明基于监督学习训练的游戏 AI 其行为会比较接近于人类玩家,但基本无法超过人类玩家的水平;而基于强化学习训练的 AI 则可能会有超过玩家的游戏水平,不过需要注意的是使用强化学习可能需要非常多的训练资源。

因此对于游戏AI到底是使用监督学习还是使用强化学习进行训练需要结合实际的游戏环境进行考虑。对于奖励比较密集的环境可以直接使用强化学习进行训练,而对于奖励比较稀疏的环境则推荐使用监督学习。
在这里插入图片描述

5.6 Hybrid混合策略

在控制一些宏观行为的时候可以使用神经网络,在控制细节行为的时候可以用设计师配置的行为树等等

相关文章:

GAMES104:17 游戏引擎的玩法系统:高级AI-学习笔记

文章目录 课前QA一,层次任务网络(Hierarchical Tasks Network,HTN)1.1 HTN Framework1.2 HTN Task Types1.2.1 Primitive Task基本任务1.2.2 Compound Task符合任务 1.3 Planning1.4 Replan1.5 总结 二,目标导向行为规…...

【Unity】Unity中获取网络时间进行每日和每月刷新

直接上代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;public class DateChecker : MonoBehaviour {private DateTime lastCheckedDate; //上次刷新日数据的日期private DateTime lastMonthUtc; //上次刷新月数据的日期T…...

微信小程序上传组件封装uploadHelper2.0使用整理

一、uploadHelper2.0使用步骤说明 uploadHelper.js ---上传代码封装库 cos-wx-sdk-v5.min.js---腾讯云,对象存储封装库 第一步,下载组件代码,放置到自己的小程序项目中 第二步、 创建上传对象,执行选择图片/视频 var _this th…...

力扣每日打卡挑战 3184. 构成整天的下标对数目 I

给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 整天 定义为时间持续时间是 24 小时的 整数倍 。 例如&#xff0c;1 天是 24 小时&#xff0c…...

The First:Starknet如何让以太坊更快更安全?

随着区块链技术需求的持续增长&#xff0c;当前技术在可扩展性和隐私保护方面的局限性愈发凸显&#xff0c;以太坊网络便是其中的典型代表。为有效应对这些挑战&#xff0c;第二层扩展解决方案的重要性日益凸显。这些方案旨在将部分交易处理转移至以太坊主链之外&#xff0c;以…...

【计算机网络 - 基础问题】每日 3 题(五十三)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…...

便携式移动消防炮:灵活灭火新选择

在当今快速发展的社会中&#xff0c;火灾安全问题一直是公众安全的重要组成部分。无论是家庭、办公场所还是大型工业区&#xff0c;火灾的发生都可能带来不可预测的巨大损失&#xff0c;传统消防固定系统往往无法迅速适应多变的火场环境&#xff0c;特别是对于那些发生在高层建…...

18.VScode写Java项目的教程

VScode写Java项目的教程 1.首先必选先安装Java解释器2.安装插件Java Extension Pack3.创建项目创建项目结构选择项目类型 4.测试结果源码内容 今天用一台老式笔记本写代码&#xff0c;IDEA跑不动就准备用VScode突然间就蒙了&#xff0c;怎么创建项目啊&#xff1f;于是就有了这…...

本地生活便民信息服务小程序源码系统 PHP+MySQL组合开发 带完整的安装代码包以及搭建部署教程

系统概述 地方门户分类信息网站源码系统是一个基于PHP和MySQL开发的强大平台&#xff0c;旨在帮助用户轻松搭建地方性的分类信息网站。该系统集成了众多实用功能&#xff0c;支持用户自由发帖、浏览和搜索各类信息&#xff0c;如二手交易、求职招聘、房屋租售、生活服务、商家…...

Java项目实战II基于微信小程序的原创音乐平台{UNIAPP+SSM+MySQL+Vue}(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字音乐…...

【个人同步与备份】电脑(Windows)与手机/平板(Android)之间文件同步

文章目录 1. syncthing软件下载2. syncthing的使用2.1. 添加设备2.1.1. syncthing具备设备发现功能&#xff0c;因此安装好软件&#xff0c;只需确认设备信息是否对应即可2.1.2. 如果没有发现到&#xff0c;可以通过设备ID连接2.1.3. 设置GUI身份验证用户&#xff0c;让无关设备…...

代码随想录算法训练营第46期Day37,38,39,41

这几天晚上看比赛&#xff0c;就把刷题耽误了。还好是开新章节&#xff0c;前面的题都比较简单。 然后周天做完了又忘记发了 动态规划 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数 Day37前两道题太简单…...

点跟踪论文—RAFT: Recurrent All-Pairs Field Transforms for Optical Flow-递归的全对场光流变换

点目标跟踪论文—RAFT: Recurrent All-Pairs Field Transforms for Optical Flow-递归的全对场光流变换 读论文RAFT密集光流跟踪的笔记 RAFT是一种新的光流深度网络结构&#xff0c;由于需要基于点去做目标的跟踪&#xff0c;因此也是阅读了像素级别跟踪的一篇ECCV 2020的经典…...

jmeter学习(6)逻辑控制器-循环

循环执行 1、循环读取csv文件的值 2、foreach 读取变量&#xff0c;变量数字后缀有序递增&#xff0c;通过counter实现 ${__V(typeId${typeIdNum})} beansell断言 String typeIdNum vars.get("typeIdNum"); String response prev.getResponseDataAsString(); …...

unity学习笔记-安装与部署

unity学习笔记-安装与部署 unity & visual studio下载unityvisual studio 创建工程项目内的布局介绍初始化项目各目录介绍1. 场景视图&#xff08;Scene&#xff09;2. 游戏视图&#xff08;Game&#xff09;3. 层次结构视图&#xff08;Hierarchy&#xff09;4. 检查器视图…...

Django+MySQL接口开发完全指南

前言 本文将详细介绍如何使用Django结合MySQL数据库开发RESTful API接口。我们将从环境搭建开始&#xff0c;一步步实现一个完整的接口项目。 环境准备 首先需要安装以下组件&#xff1a; Python 3.8Django 4.2MySQL 8.0mysqlclientdjangorestframework 安装命令 # 创建虚…...

CentOS7上下载安装 Docker Compose

Docker Compose简要介绍&#xff08;想直接看安装步骤的请跳转到[必要的安装步骤]&#xff09; Docker Compose 是一个用于定义和管理多容器 Docker 应用的工具&#xff0c;它可以通过一个简单的 YAML 文件&#xff08;docker-compose.yml&#xff09;来配置应用程序的服务、网…...

虚拟机的 NAT 模式 或 Bridged 模式能够被外界IPping通

如果虚拟机使用的是 NAT 模式 或 Bridged 模式&#xff0c;通常可以让外部网络&#xff08;例如互联网&#xff09;访问虚拟机。NAT 和 Bridged 模式的不同之处在于它们如何将虚拟机连接到宿主机和外部网络。以下是这两种模式的详细说明&#xff1a; 1. NAT 模式 在 NAT 模式…...

C# 使用Dll的几种方法举例

使用 DLL&#xff08;动态链接库&#xff09;是 C# 开发中常见的任务之一。DLL 文件包含可以在运行时加载的代码和数据&#xff0c;允许程序共享功能和资源&#xff0c;降低程序的内存占用并促进代码的复用。本篇文章将深入探讨 C# 中使用 DLL 的多种方法&#xff0c;并提供相关…...

什么是不同类型的微服务测试?

大家好&#xff0c;我是锋哥。今天分享关于【什么是不同类型的微服务测试&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 什么是不同类型的微服务测试&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 微服务架构中的测试可以分为多种类…...

Docker 拉取镜像时配置可用镜像源(包含国内可用镜像源)

在/etc/docker/daemon.json中写入如下内容(如果文件不存在请新建该文件)&#xff1a; { "registry-mirrors":["https://registry.docker-cn.com"] } 重新加载 json 配置文件&#xff1a; sudo systemctl daemon-reload重启 docker 服务&#xff1a; sud…...

International Symposium on Artificial Intelligence Innovations

计算机科学&#xff08;Computer Science&#xff09;&#xff1a; 算法、自动化软件工程、生物信息学和科学计算、计算机辅助设计、计算机动画、计算机体系结构、计算机建模、计算机网络、计算机安全、计算机图形学与图像处理、数据库与数据挖掘、数据压缩、数据加密、数字信号…...

Golang笔记_day10

Go面试题&#xff08;三&#xff09; 1、什么是channel&#xff0c;为什么它可以做到线程安全 在Go语言中&#xff0c;channel是一种类型&#xff0c;它可以用来在协程之间传递数据通过共享内存来通信&#xff1a; 通过共享内存来通信是指多个线程或进程直接访问相同的内存区域…...

mlir learn

https://github.com/j2kun/mlir-tutorial 学习这个项目 https://www.jeremykun.com/2023/08/10/mlir-getting-started/ get start 用我的mac编译一下试试看 然后遇到架构不对的问题 因为他的提交默认是x86 https://github.com/j2kun/mlir-tutorial/pull/1/commits/5a267e269d57…...

Windows安装RabbitMQ 4.0.2(图文教程)

本章教程,主要记录在Windows 10上RabbitMQ 4.0.2的安装过程。 一、下载安装包 1、官方下载(速度不稳定) Erlang:https://github.com/erlang/otp/releases/download/OTP-26.0/otp_win64_26.0.exe RabbitMQ 4.0.2:https://github.com/rabbitmq/rabbitmq-server/releases/do…...

分布式系统中为什么需要使用消息队列

本文转载自 linkedkeeper.com 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。 当今市面上有很多主流的消息中间件&#xff0c;如老牌的ActiveMQ、RabbitMQ&#…...

Linux环境配置(学生适用)

1.挑选最便宜的云服务器 如腾讯云服务器&#xff0c;华为云服务器&#xff0c;百度云服务器等等…… 2.找到你的云服务器实例&#xff0c;然后找到你的公网IP。 3.云服务器实例 ---更多 --- 重置root密码 (一定要重置&#xff09; 4. 下载并安装 xshell 或者其他登陆软件 xshel…...

麦禾软件:Mac用户找免费开源工具的最佳选择

抖知书老师推荐&#xff1a; ​麦禾软件已经成为众多Mac用户的必备平台&#xff0c;尤其对于那些经常寻找免费、开源、正版软件的用户来说&#xff0c;绝对是一个福音。随着科技的不断进步和用户需求的提升&#xff0c;安全、便捷的软件下载体验成为用户选择平台的核心标准。而…...

OpenCV4.8 开发实战系列专栏之 08 - 通道分离与合并

大家好&#xff0c;欢迎大家学习OpenCV4.8 开发实战专栏&#xff0c;长期更新&#xff0c;不断分享源码。 专栏代码全部基于C 与Python双语演示&#xff0c;专栏答疑群 请联系微信 OpenCVXueTang_Asst 本文关键知识点&#xff1a; OpenCV中默认imread函数加载图像文件&#…...

iOS 18.1 RC 版本发布,修复iPhone16随机重启、浏览视频卡顿等bug

今日&#xff0c;苹果发布 iOS 18.1 RC 版本升级&#xff0c;内部版本号为 22B82。 iOS 18.1 RC 也就是 iOS 18.1 准正式版&#xff0c;如果没有大的 Bug&#xff0c;这将是 iOS 18.1 正式版发布前最后一次更新&#xff0c;正式版预计下周向消费者推送。 该 RC 版除了为海外用…...