Unity 波函数坍缩算法随机地图生成

Unity 波函数坍缩算法随机地图生成

  • 波函数
    • 波函数基本概念
      • 位置空间波函数
      • 动量空间波函数
      • 两种波函数之间的关系
      • 波函数的本征值和本征态
      • 波函数坍缩
    • 熵是什么
      • 熵作为状态函数
      • 时间之箭
    • 实现原理
      • 举个例子:2D迷宫地图生成
    • Unity 如何实现
      • 前期准备
      • 单元格代码
      • 瓦片地图代码
      • 波函数代码
        • 熵检查方法
        • 坍缩方法
        • 有效性方法
        • 完整代码
    • 脚本搭载
    • 实现 效果
    • 可扩展效果

波函数

波函数基本概念

在量子力学里,量子系统的量子态可以用波函数(英语:Wave function)来描述。薛定谔方程设定波函数如何随着时间流逝而演化。
波函数 ψ(r,t) 是一种复值函数,表示粒子在位置 r 、时间 t 的概率幅,它的绝对值平方 |ψ(r,t)|² 是在位置 r 、时间 t 找到粒子的概率密度。以另一种角度诠释,波函数 ψ(r,t) 是“在某时间、某位置发生相互作用的概率幅”。

设想经典力学里的谐振子系统(A-B),一条弹簧的一端固定不动,另一端有一个带质量圆球;
在量子力学里,(C-H)展示出同样系统的薛定谔方程的六个波函数解。
横轴坐标表示位置,竖轴坐标表示波函数概率幅的实部(蓝色)或虚部(红色)。
(C-F)是定态,(GH)不是定态。定态的能量为驻波振动频率与约化普朗克常数的乘积。
这里简单了解一下就行。

在这里插入图片描述

位置空间波函数

我们主要用到的就是这个位置空间波函数,不过也不用管,了解基本概念就行

假设一个自旋为零的粒子移动于一维空间。这粒子的量子态以波函数表示为 ψ(r,t) ;其中,x 是位置,是时间。波函数是复值函数。测量粒子位置所得到的结果不是决定性的,而是概率性的。粒子的位置 x 在区间 [a,b](即 a ≤ x ≤b )的概率为 Pa ≤ Px ≤ Pb

在这里插入图片描述

其中,** t** 是对于粒子位置做测量的时间。
换句话说 |ψ(r,t)|² 是粒子在位置 x 、时间 t 的概率密度。
这导致归一化条件:在位置空间的任意位置找到粒子的概率为 100%

在这里插入图片描述

好了终于打完了,真不好写。简单来说就是你想在什么时候吃饭就会在什么时候吃饭。
由于世界的不确定性,当你决定做什么的时候,就证明你已经做了什么事情。
完了,还解释不清楚了。
也可以这么理解,当你喝咖啡的时候你喝奶茶的概率就变成 0,你喝咖啡的概率就变成 1。
就先这样理解吧,这个还真不好解释。

动量空间波函数

这个算是扩展,看不看都行

在动量空间,粒子的波函数便是为 ψ(p,t) ;其中 p 是一维动量,值域从 ** -∞ ** 到 +∞。测量粒子动量所得到的结果不是决定性的,而是概率性的。粒子的动量 p 在区间 [a,b](a ≤ p ≤ b) 的概率为
在这里插入图片描述

动量空间波函数的归一条件是:

在这里插入图片描述

两种波函数之间的关系

位置空间波函数与动量空间波函数彼此是对方的傅里叶变换。他们各自拥有的信息相同,任何一种波函数都可以用来计算粒子的相关性质。两种波函数之间的关系为
在这里插入图片描述

波函数的本征值和本征态

在量子力学中,,态就意味着函数,因为量子力学的状态是用波函数来描述的,因此只要是态,,就是波函数。
本征函数定义:如果一个算符A作用在一个函数上,等于一个常数a乘以这个函数, 就说该函数是这个算符本征值为a的本征函数。
如果是非简并的本征态,,本征值和本征态存在着一 一对应的关系。 量子力学中属于不同本征值的本征态一定相互正交(厄米算符性质)
如果是简并的本征态,属于同一本征值的本征态的线性组合依然是该算符的本征态, 不再存在着一一对应的关系,但依然可以组合成相互正交的本征函数。

本征值和本征态

在这里插入图片描述

波函数坍缩

波函数坍缩(wave function collapse)指的是某些量子力学体系与外界发生某些作用后波函数发生突变,变为其中一个本征态或有限个具有相同本征值的本征态的线性组合的现象。波函数坍缩可以用来解释为何在单次测量中被测定的物理量的值是确定的,尽管多次测量中每次测量值可能都不同。

双缝干涉实验

在这里插入图片描述

熵是什么

熵是一种测量在动力学方面不能做功的能量总数,也就是当总体的熵增加,其做功能力也下降熵的量度正是能量退化的指标。熵亦被用于计算一个系统中的失序现象,也就是计算该系统混乱的程度。
熵是一个描述系统状态的函数,但是经常用熵的参考值和变化量进行分析比较它在控制论、概率论、数论、天体物理、生命科学等领域都有重要应用在不同的学科中也有引申出的更为具体的定义,是各领域十分重要的参量。

在这里插入图片描述

熵作为状态函数

首先,想象一个可逆过程,如果将系统从一个平衡状态A转移到另一个平衡状态B。假如再经过一个任何可逆过程将系统带回状态A,结果是熵的绝对变化等于零。这意味着在第一个过程中,熵的变化仅仅取决于初始与终结状态.由此可以定义一个系统的任何平衡状态的熵。选择一个参照状态R,定义它的熵为,任何平衡状态X的熵为:

因为这个积分式与热转移过程无关,所以当作为熵的定义。

时间之箭

熵是在物理学领域中似乎暗示只朝向一个特定行进方向的量,有时被称为时间之箭。随着时间的推移,热力学第二定律:孤立系统的熵状态永远只会增加,不会减少。因此,从这个角度看,熵的测量被看作是一种时钟。

实现原理

我们假定你有图案的一些“局部信息 A ”,也就是说,图案中的一小块应该长成什么样子,以及这些小块之间的一些重叠关系能否出现。图案中的一小块我们用一个固定大小的小图片来表示。如果你还知道这些小块之间出现几率的比例就更好了。当然不知道也没有关系,我们可以假定它们的出现几率差不多。那么我们的目标就是生成一个图片,使得其所有的局部(也就是固定大小的小区域)都是在之前的“局部信息”中出现过的,并且出现的几率和之前给出的“局部信息”的几率尽量相近。

最小不确定性原则:
在每次迭代中,选择具有最小可能图案数的格子进行确定性坍缩,这有助于减少错误和回溯的可能性。兼容性检查:
当一个格子的波函数坍缩时,必须检查它与相邻格子的兼容性,以确保生成的地图符合局部规则。概率分布:
波函数的坍缩基于概率分布,这意味着算法可以生成具有随机性的地图,同时保持整体的连贯性和规则性。
示例1:切片A 是已经确定的地图,那么连接处 瓦片地图出现的概率就是下面这张图

在这里插入图片描述

示例2:切片A 是已经确定的地图,那么连接处 瓦片地图出现的概率就是下面这张图
这里考虑的是四方,可以自己进行扩展。

在这里插入图片描述

举个例子:2D迷宫地图生成

假设我们要用波函数坍缩算法在Unity中生成一个2D迷宫地图,这个地图由墙壁和路径组成。1. 定义基本单元:
墙壁瓦片:表示迷宫中的墙壁,不可通过。
路径瓦片:表示迷宫中的开放路径,可以通行。2. 初始化波函数:
我们有一个10x10的网格,每个格子的波函数包含墙壁和路径两种可能的状态。3. 建立局部规则:
规则定义了路径瓦片周围不能有4个连续的墙壁瓦片,以避免形成死胡同或封闭区域。
墙壁瓦片则可以与任何类型的瓦片相邻。4. 确定性坍缩:
假设我们从左上角开始,选择一个格子进行坍缩,由于没有其他信息,这个格子有相等的机会成为墙壁或路径。
假设我们随机选择路径瓦片,那么这个格子的波函数就坍缩为路径瓦片。5. 传播更新:
坍缩后,我们需要更新相邻格子的波函数。例如,如果选择了路径瓦片
那么它的直接邻居不能全部是墙壁瓦片,以避免形成死胡同。6. 迭代过程:
接下来,我们选择下一个熵最小的格子进行坍缩,重复这个过程,直到整个网格都被填充。7. 生成地图:
最终,我们根据每个格子坍缩后的状态,实例化对应的Unity预制体。
例如,路径瓦片可能是一个可通行的平面,而墙壁瓦片可能是一个不可通行的障碍物。
假设我们的迷宫网格如下:[墙壁, 路径, 墙壁, ..., 路径]
[路径, 路径, 路径, ..., 墙壁]
[墙壁, 墙壁, 路径, ..., 路径]
...
[路径, 墙壁, 路径, ..., 墙壁]现在,我们从左上角开始,第一个格子坍缩为路径瓦片,然后根据规则更新相邻格子的波函数。
比如,第一个格子的右边和下边的格子不能同时是墙壁瓦片。
其实还挺好理解的。

Unity 如何实现

前期准备

1. 新建一个工程,根据自己使用的创建就行,我这里使用的是 2022.30
2. 准备 自己喜欢并且可以连续的网片地图
3. 最好写一个实现流程或者思维导图(不写也行,写的话会更有条理一些)

在这里插入图片描述

单元格代码

根据你想要实现的效果,设置单元地图预制体。
这个代码的作用就是地图生成缓存
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 单元格
/// </summary>
public class Cell_ZH : MonoBehaviour
{/// <summary>/// 坍缩布尔/// </summary>public bool _Collapsed;/// <summary>/// 瓦片地图/// </summary>public Tile_ZH[] _Tileoptions;/// <summary>/// 创建单元格/// </summary>/// <param name="_CollapseState"></param>/// <param name="_Tiles"></param>public void CreateCell(bool _CollapseState, Tile_ZH[] _Tiles){_Collapsed = _CollapseState;_Tileoptions = _Tiles;}/// <summary>/// 重建 单元/// </summary>/// <param name="_Tiles"></param>public void RecreateCell(Tile_ZH[] _Tiles){_Tileoptions = _Tiles;}
}
脚本搭载以及预制体

在这里插入图片描述

在这里插入图片描述

瓦片地图代码

就是生成瓦片地图相关的概率分布,没坍缩之前都是均等的。
当然也可以扩展成八方和 3D 的。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 瓦片地图
/// </summary>
public class Tile_ZH : MonoBehaviour
{//可增加 瓦片类型  比如左上角 右上角 左下角 右下角等[Header("上方 相邻数组")]public Tile_ZH[] _UpNeighbours;[Header("右边 相邻数组")]public Tile_ZH[] _RigihtNeighbours;[Header("下方 相邻数组")]public Tile_ZH[] _DownNeighbours;[Header("左边 相邻数组")]public Tile_ZH[] _LeftNeighbours;
}
脚本搭载以及预制体

在这里插入图片描述

在这里插入图片描述

波函数代码

熵检查方法
主要作用就是:创建一个临时网格列表,移除已坍缩的单元格,按照瓦片选项数组长度对单元格排序优先处理选项最少的单元格。
    /// <summary>/// 检查熵/// 临时网格获取/// </summary>/// <returns></returns>private IEnumerator CheckEntropy(){// 临时网格数组,用于存储当前未坍缩的单元格List<Cell_ZH> _TempGrid = new List<Cell_ZH>(_GridCompoents);// 从临时网格中移除所有已经坍缩的单元格_TempGrid.RemoveAll(c => c._Collapsed);// 按照 _Tileoptions 数组的长度进行排序,长度最小的单元格优先处理_TempGrid.Sort((a, b) => { return a._Tileoptions.Length - b._Tileoptions.Length; });// 获取最小的 _Tileoptions 数组的长度int _ArrLenght = _TempGrid[0]._Tileoptions.Length;int _StopIndex = default;// 查找最小长度的单元格群组,并获取停止索引for (int i = 0; i < _TempGrid.Count; i++){if (_TempGrid[i]._Tileoptions.Length > _ArrLenght){_StopIndex = i;break;}}// 如果找到了停止索引,就移除后续的单元格,只保留熵最低的一组if (_StopIndex > 0){_TempGrid.RemoveRange(_StopIndex, _TempGrid.Count - _StopIndex);}// 等待一段时间后开始坍缩单元格yield return new WaitForSeconds(0.01f);// 调用 CollapseCell 方法,对选中的单元格群组进行坍缩处理CollapseCell(_TempGrid);}
坍缩方法
主要作用就是:随机选择一个单元格进行坍缩,设置坍缩状态并选择一个瓦片进行实例化调用 UpdateGeneration() 方法更新网格。
    /// <summary>/// 单元格 坍缩/// 获取当前单元格 确定变量/// </summary>/// <param 临时网格="_TempGrid"></param>private void CollapseCell(List<Cell_ZH> _TempGrid){//随机瓦片数组int _RandIndex = UnityEngine.Random.Range(0, _TempGrid.Count);//获取当前随机的地图Cell_ZH _CellToCollapse = _TempGrid[_RandIndex];//坍缩布尔设置_CellToCollapse._Collapsed = true;//获取当前单元格坍缩值//print(UnityEngine.Random.Range(0, _CellToCollapse._Tileoptions.Length));if (_CellToCollapse._Tileoptions != null && _CellToCollapse._Tileoptions.Length > 0){Tile_ZH _SelectedTile = _CellToCollapse._Tileoptions[UnityEngine.Random.Range(0, _CellToCollapse._Tileoptions.Length)];_CellToCollapse._Tileoptions = new Tile_ZH[] { _SelectedTile };_CellToCollapse._Tileoptions = new Tile_ZH[] { _SelectedTile };Tile_ZH _FoundTile = _CellToCollapse._Tileoptions[0];//实例化当前地图Instantiate(_FoundTile, _CellToCollapse.transform.position * 4.73f, Quaternion.identity, GameObject.Find("Model").transform);//网格更新UpdateGeneration();}}
有效性方法
主要作用就是:这个方法比较重要确保当前单元格的瓦片选项在有效选项列表中如果没有有效选项,添加一个默认选项。
    /// <summary>/// 有效性 检查/// </summary>/// <param 功能单元格列表="_OptionList"></param>/// <param 有效性单元格列表="_ValidOptions"></param>private void CheckValidity(List<Tile_ZH> _OptionList, List<Tile_ZH> _ValidOptions){// 有效性检查 布尔bool _HasValidOptions = false;// 单元格列表比对for (int x = _OptionList.Count - 1; x >= 0; x--){var _Element = _OptionList[x];// 检查有效性单元格列表是否包含当前单元格数据if (!_ValidOptions.Contains(_Element)){// 如果不包含就进行移除处理_OptionList.RemoveAt(x);}else{_HasValidOptions = true;}}// 如果没有找到任何有效选项,采取措施if (!_HasValidOptions){// 保留一个默认的选项(这里可以根据具体情况设定)if (_OptionList.Count == 0 && _ValidOptions.Count > 0){// 添加一个有效性选项中的第一个作为默认选项_OptionList.Add(_ValidOptions[0]); }else if (_OptionList.Count == 0){// 如果确实没有任何有效选项,则添加一个兜底选项(可以是一个最常用或最不影响整体的瓦片)// 假设第一个瓦片是兜底选项_OptionList.Add(_TileObjects[0]); }Debug.Log("没有有效选项,回退操作");}}
完整代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;/// <summary>
/// 波函数
/// </summary>
public class WaveFunctiopn_ZH : MonoBehaviour
{[Header("地图尺寸")]public int _Dimensions;[Header("平铺对象数组")]public Tile_ZH[] _TileObjects;[Header("网格数组")]public List<Cell_ZH> _GridCompoents;[Header("单元格")]public Cell_ZH _CellObj;//迭代    int _Iterations = 0;private void Awake(){_GridCompoents = new List<Cell_ZH>();InitializeGrid();}/// <summary>/// 网格初始化/// </summary>void InitializeGrid(){for (int y = 0; y < _Dimensions; y++){for (int x = 0; x < _Dimensions; x++){//根据地图大小 生成单元格Cell_ZH _NewCell = Instantiate(_CellObj, new Vector2(x, y), Quaternion.identity, GameObject.Find("Model").transform);//单元格创建_NewCell.CreateCell(false, _TileObjects);//网格数组添加_GridCompoents.Add(_NewCell);}}StartCoroutine(CheckEntropy());}/// <summary>/// 检查熵/// 临时网格获取/// </summary>/// <returns></returns>private IEnumerator CheckEntropy(){// 临时网格数组,用于存储当前未坍缩的单元格List<Cell_ZH> _TempGrid = new List<Cell_ZH>(_GridCompoents);// 从临时网格中移除所有已经坍缩的单元格_TempGrid.RemoveAll(c => c._Collapsed);// 按照 _Tileoptions 数组的长度进行排序,长度最小的单元格优先处理_TempGrid.Sort((a, b) => { return a._Tileoptions.Length - b._Tileoptions.Length; });// 获取最小的 _Tileoptions 数组的长度int _ArrLenght = _TempGrid[0]._Tileoptions.Length;int _StopIndex = default;// 查找最小长度的单元格群组,并获取停止索引for (int i = 0; i < _TempGrid.Count; i++){if (_TempGrid[i]._Tileoptions.Length > _ArrLenght){_StopIndex = i;break;}}// 如果找到了停止索引,就移除后续的单元格,只保留熵最低的一组if (_StopIndex > 0){_TempGrid.RemoveRange(_StopIndex, _TempGrid.Count - _StopIndex);}// 等待一段时间后开始坍缩单元格yield return new WaitForSeconds(0.01f);// 调用 CollapseCell 方法,对选中的单元格群组进行坍缩处理CollapseCell(_TempGrid);}/// <summary>/// 单元格 坍缩/// 获取当前单元格 确定变量/// </summary>/// <param 临时网格="_TempGrid"></param>private void CollapseCell(List<Cell_ZH> _TempGrid){//随机瓦片数组int _RandIndex = UnityEngine.Random.Range(0, _TempGrid.Count);//获取当前随机的地图Cell_ZH _CellToCollapse = _TempGrid[_RandIndex];//坍缩布尔设置_CellToCollapse._Collapsed = true;//获取当前单元格坍缩值//print(UnityEngine.Random.Range(0, _CellToCollapse._Tileoptions.Length));if (_CellToCollapse._Tileoptions != null && _CellToCollapse._Tileoptions.Length > 0){Tile_ZH _SelectedTile = _CellToCollapse._Tileoptions[UnityEngine.Random.Range(0, _CellToCollapse._Tileoptions.Length)];_CellToCollapse._Tileoptions = new Tile_ZH[] { _SelectedTile };_CellToCollapse._Tileoptions = new Tile_ZH[] { _SelectedTile };Tile_ZH _FoundTile = _CellToCollapse._Tileoptions[0];//实例化当前地图Instantiate(_FoundTile, _CellToCollapse.transform.position * 4.73f, Quaternion.identity, GameObject.Find("Model").transform);//网格更新UpdateGeneration();}}/// <summary>/// 网格迭代更新/// </summary>private void UpdateGeneration(){//缓存单元格数组List<Cell_ZH> _NewGeneraTionCell = new List<Cell_ZH>(_GridCompoents);for (int y = 0; y < _Dimensions; y++){for (int x = 0; x < _Dimensions; x++){//快查算法var _Index = x + y * _Dimensions;//如果当前单元格已经坍缩 就直接 breakif (_GridCompoents[_Index]._Collapsed){_NewGeneraTionCell[_Index] = _GridCompoents[_Index];                   }//如果没有坍缩else{//创建瓦片地图索引List<Tile_ZH> _Options = new List<Tile_ZH>();foreach (var item in _TileObjects){_Options.Add(item);}//四方检测//上方单元格检测if (y>0){//索引查找Cell_ZH _Up = _GridCompoents[x + (y - 1) * _Dimensions];List<Tile_ZH> _ValidOptions= new List<Tile_ZH>();foreach (Tile_ZH _PossibleOptions in _Up._Tileoptions){var _ValOptions = Array.FindIndex(_TileObjects, _Obj => _Obj == _PossibleOptions);var _Valid = _TileObjects[_ValOptions]._UpNeighbours;_ValidOptions = _ValidOptions.Concat(_Valid).ToList();}//单元格有效性检查CheckValidity(_Options,_ValidOptions);}//右侧单元格检测if (x<_Dimensions-1){Cell_ZH _Right = _GridCompoents[x +1+y  * _Dimensions].GetComponent<Cell_ZH>();List<Tile_ZH> _ValidOptions = new List<Tile_ZH>();foreach (Tile_ZH _PossibleOptions in _Right._Tileoptions){var _ValOptions = Array.FindIndex(_TileObjects, _Obj => _Obj == _PossibleOptions);var _Valid = _TileObjects[_ValOptions]._LeftNeighbours;_ValidOptions = _ValidOptions.Concat(_Valid).ToList();}//单元格有效性检查CheckValidity(_Options, _ValidOptions);}//下方 单元格检测if (y<_Dimensions-1){Cell_ZH _Down = _GridCompoents[x + (y+1) * _Dimensions].GetComponent<Cell_ZH>();List<Tile_ZH> _ValidOptions = new List<Tile_ZH>();foreach (Tile_ZH _PossibleOptions in _Down._Tileoptions){var _ValOptions = Array.FindIndex(_TileObjects, _Obj => _Obj == _PossibleOptions);var _Valid = _TileObjects[_ValOptions]._DownNeighbours;_ValidOptions = _ValidOptions.Concat(_Valid).ToList();}//单元格有效性检查CheckValidity(_Options, _ValidOptions);}//左侧 单元格检测if (x>0){Cell_ZH _Left = _GridCompoents[x -1+y  * _Dimensions].GetComponent<Cell_ZH>();List<Tile_ZH> _ValidOptions = new List<Tile_ZH>();foreach (Tile_ZH _PossibleOptions in _Left._Tileoptions){var _ValOptions = Array.FindIndex(_TileObjects, _Obj => _Obj == _PossibleOptions);var _Valid = _TileObjects[_ValOptions]._RigihtNeighbours;_ValidOptions = _ValidOptions.Concat(_Valid).ToList();}//单元格有效性检查CheckValidity(_Options,_ValidOptions);}//瓦片地图编号//数组位置等于该瓦片位置Tile_ZH[] _NewTileList = new Tile_ZH[_Options.Count];for (int i = 0; i < _Options.Count; i++){_NewTileList[i] = _Options[i];}//瓦片地图创建_NewGeneraTionCell[_Index].RecreateCell(_NewTileList);}}}//瓦片地图 通用组件判定_GridCompoents = _NewGeneraTionCell;//迭代次数 增加_Iterations++;//如果迭代次数 小于设置的瓦片地图大小if (_Iterations<_Dimensions*_Dimensions){//就再次进行熵 检查StartCoroutine(CheckEntropy());}}/// <summary>/// 有效性 检查/// </summary>/// <param 功能单元格列表="_OptionList"></param>/// <param 有效性单元格列表="_ValidOptions"></param>private void CheckValidity(List<Tile_ZH> _OptionList, List<Tile_ZH> _ValidOptions){// 有效性检查 布尔bool _HasValidOptions = false;// 单元格列表比对for (int x = _OptionList.Count - 1; x >= 0; x--){var _Element = _OptionList[x];// 检查有效性单元格列表是否包含当前单元格数据if (!_ValidOptions.Contains(_Element)){// 如果不包含就进行移除处理_OptionList.RemoveAt(x);}else{_HasValidOptions = true;}}// 如果没有找到任何有效选项,采取措施if (!_HasValidOptions){// 保留一个默认的选项(这里可以根据具体情况设定)if (_OptionList.Count == 0 && _ValidOptions.Count > 0){// 添加一个有效性选项中的第一个作为默认选项_OptionList.Add(_ValidOptions[0]); }else if (_OptionList.Count == 0){// 如果确实没有任何有效选项,则添加一个兜底选项(可以是一个最常用或最不影响整体的瓦片)// 假设第一个瓦片是兜底选项_OptionList.Add(_TileObjects[0]); }Debug.Log("没有有效选项,回退操作");}}}

脚本搭载

在这里插入图片描述

实现 效果

在这里插入图片描述

波函数坍缩算法示例工程: 示例工程

可扩展效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

希望这些信息能够进一步满足您对Untiy 波函数坍缩算法 随机地图生成的需求。
如果您有任何特定的问题或需要更深入的讨论,请随时提出。

路漫漫其修远兮,与君共勉。

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

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

相关文章

jpg怎么转换成pdf?6个简单方法,实现jpg转换成pdf

你是否也曾想将jpg图片转换为pdf格式文档呢&#xff1f;亦或者在处理文档或制作报告时&#xff0c;不知道怎么才能更快地将多张图片整合成一个pdf文件呢&#xff1f;如果你正在寻找简单快速的方法&#xff0c;又有哪些工具可以帮助您完成图片转pdf呢&#xff1f;别着急&#xf…

“LOCAL_LISTENER”参数导致业务无法连接数据库,文末附Oracle连接故障检查监听的排查流程

1. 背景及问题 今天在Oracle BCV技术[1]做数据同步&#xff0c;建立生产库的测试库&#xff0c;需要DBA配合同步前后的停库和起库。在同步完起库后&#xff0c;有部门反应同步好的测试库连接不上去。 2. 问题排查 以我当前的知识储备&#xff0c;能想到的可能就是以下几点进…

深入浅出:你需要了解的用户数据报协议(UDP)

文章目录 **UDP概述****1. 无连接性****2. 尽最大努力交付****3. 面向报文****4. 多种交互通信支持****5. 较少的首部开销** **UDP报文的首部格式****详细解释每个字段** **UDP的多路分用模型****多路分用的实际应用** **检验和的计算方法****伪首部的详细内容****检验和计算步…

国内智能车零部件头号玩家引望:年出货300万套,估值1150亿

作者 |德新 编辑 |王博 8月19日&#xff0c;长安汽车发布公告&#xff0c;其联营企业阿维塔科技在当日的董事会上&#xff0c;通过了对引望公司的投资方案议案。 阿维塔将在8月20日与华为签约&#xff0c;阿维塔将出资115亿元&#xff0c;对引望公司持股10%&#xff0c;华为持…

用Maven开发Spring Boot 项目

一、初识 Spring Boot Spring Boot框架是一 套开源的后台开发框架&#xff0c; 继承了Spring MVC框架的前辈SSM框架的优秀特性&#xff0c;通过注解大幅减少程序员写配置的工作量。从企业开发角度来看&#xff0c;它提供了自动化配置&#xff0c;内嵌容器和兼容Maven等核心功…

设计模式六大原则(一)–单一职责原则(C#)

文章目录 1. 什么是单一职责原则&#xff1f;2. 单一职责原则的定义3. 单一职责原则的重要性4. 单一职责原则的示例&#xff08;C#&#xff09;5.如何判断是否违反单一职责原则6. 单一职责原则的应用场景7. 总结 在软件开发领域&#xff0c;设计模式是解决常见问题的经典解决方…

RK3588J正式发布Ubuntu桌面系统,丝滑又便捷!

本文主要介绍瑞芯微RK3588J的Ubuntu系统桌面演示&#xff0c;开发环境如下&#xff1a; U-Boot&#xff1a;U-Boot-2017.09 Kernel&#xff1a;Linux-5.10.160 Ubuntu&#xff1a;Ubuntu20.04.6 LinuxSDK&#xff1a; rk3588-linux5.10-sdk-[版本号] &#xff08;基于rk3…

如何使用mmdetection训练实例分割模型?

安装 anoconda 从官方网站下载并安装。 配置环境 conda create --name openmmlab python3.8 -y conda activate mmdet 安装 PyTorch 注意&#xff1a;这个步骤很关键&#xff0c;否则后面会出问题。一定要确保自己电脑当前安装和配置的cuda版本。 使用命令&#xff1a;nvcc …

做数据采集,你真的了解PLC插槽号吗?

有很多PLC可以在系统里配置多个独立CPU&#xff0c;各自有自己的任务。也有一些PLC&#xff0c;虽然只有一个CPU&#xff0c;但是&#xff0c;其位置是可变的。外部进行数据采集时&#xff0c;首先要搞明白采集目标是哪个CPU&#xff0c;否则&#xff0c;就会张冠李戴&#xff…

【运维】从一个git库迁移到另一个库

工作目录&#xff1a; /home/java/hosts 10.60.100.194 脚本 hosts / hostsShell GitLab (gbcom.com.cn) 核心代码

FFmpeg的入门实践系列一

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力! 江山如画&#xff0c;客心如若&#xff0c;欢迎到访&#xff0c;一展风采 文章目录 参考环境本系列的适用人群FFmpeg的简介FFmpeg…

win11安装python及pycharm与webots联合仿真

1、查看Windows系统 是否已安装Python及版本 【冰糖Python】Windows系统 查看已安装的Python版本_怎么确定windows上成功安装python-CSDN博客 好&#xff0c;确认没装下面装python37 2、安装python3.7.9 参考教程Python 3.82安装教程&#xff08;Windows11、超详细版&#x…

C语言基础(六)

一维数组&#xff1a; C语言中的数组是一种基本的数据结构&#xff0c;用于在计算机内存中连续存储相同类型的数据。 数组中的每个元素可以通过索引&#xff08;或下标&#xff09;来访问&#xff0c;索引通常是从0开始的。 数组的大小在声明时确定&#xff0c;并且之后不能改…

ansible搭建+ansible常用模块

ansible搭建 管理机安装ansible,被管理节点必须打开ssh服务 1.管理机安装ansible yum -y install ansible 2.查看版本 ansible --version ansible 2.9.27 3.查找配置文件 find /etc/ -name "*ansible*" /etc/ansible /etc/ansible/ansible.cfg 4.三台被管理机…

【中项第三版】系统集成项目管理工程师 | 第 15 章 组织保障

前言 本章的知识点预计上午会考1-2分&#xff0c;下午可能会考&#xff0c;一般与其他管理领域进行结合考查。学习要以教材为主。 目录 15.1 信息和文档管理 15.1.1 信息和文档 15.1.2 信息&#xff08;文档&#xff09;管理规则和方法 15.2 配置管理 15.2.1 基本概念 …

背包问题有前提

前言&#xff1a;这个有大前提的背包感觉不能用二进制拆分&#xff0c;不然搞不清楚 注意三维的顺便&#xff0c;第一维度是枚举物品&#xff0c;第二维度是倒序枚举空间&#xff0c;第三维度是枚举数量 题目地址 #include<bits/stdc.h> using namespace std;#define …

数据库:数据更新和视图

1 实验目的 &#xff08;1&#xff09;掌握SQL语言的数据更新功能&#xff1a; update 语句用于对表进行更新 delete 语句用于对表进行删除 insert 语句用于对表进行插入 &#xff08;2&#xff09;掌握对视图的操作&#xff1a; 视图的定义 视图的更新 基于视图的查询 …

基于推荐算法的景点攻略网站的设计与实现---附源码130855

摘 要 21世纪时信息化的时代&#xff0c;几乎任何一个行业都离不开计算机&#xff0c;将计算机运用于旅游景点分享也是十分常见的。过去使用传统广告方式对旅游景点进行推荐分享&#xff0c;造成了流程繁琐、难以维护&#xff0c;难于进准推荐给适合需求的人群等问题&#xff0…

详细扒一扒css的背景渐变(通俗易懂)

前言&#xff1a; CSS 渐变使您可以显示两种或多种指定颜色之间的平滑过渡。 CSS 定义了两种渐变类型&#xff1a; 线性渐变&#xff08;向下/向上/向左/向右/对角线&#xff09;径向渐变&#xff08;由其中心定义&#xff09; 下面来详细看看吧~ &#x1f308;&#x1f308;文…

qdma IP内部对于GT位置的约束

https://support.xilinx.com/s/question/0D52E00006hpphySAA/%E6%80%8E%E6%A0%B7%E7%AE%A1%E7%90%86pcie%E7%AD%89ip%E7%94%9F%E6%88%90%E7%9A%84xdc%E6%96%87%E4%BB%B6%E6%AF%94%E8%BE%83%E5%A5%BD?languageen_US GT约束的建议 qdma ip 对于GT的约束 # qdma ip 对于GT的约…