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

C++builder中的人工智能(20):如何在C++中开发一个简单的Hopfield网络

在AI技术的发展历史中,模式识别模型是最伟大的AI技术之一,尤其是从像素图像中读取文本。其中一个是Hopfield网络(或称为Ising模型的神经网络或Ising–Lenz–Little模型),这是一种递归神经网络形式,由John J. Hopfield博士在1982年发明。Hopfield网络可以应用于模式识别,例如从像素图像中识别数字字符。在本文中,我们将使用C+ Builder开发一个简单的Hopfield网络GUI形式,它可以从像素模式中学习,并且我们可以通过测试一些最接近的模式来回忆它们。

目录

  • Hopfield网络在AI开发中是什么?
  • 如何训练Hopfield网络?
  • 如何在C+中开发一个简单的Hopfield网络?
  • 如何在C+ Builder中开发一个简单的Hopfield网络?
  • 如何在C+ Builder中测试一个简单的Hopfield网络应用?
  • C+ Builder中有关Hopfield网络的完整示例代码?

Hopfield网络在AI开发中是什么?

Hopfield网络的目的是存储数据模式,并根据部分输入回忆完整的数据模式。例如,Hopfield网络可以应用于8×8数字字符识别。我们可以在这个网络上训练一些字符,然后我们可以询问一个更接近的字符,如果它记住了训练过的字符或没有。我们可以使用这个Hopfield网络从图像中提取字符并将它们以ASCII形式放入文本文件中,这被称为模式识别。这个网络的良好行为是,即使字符的完整形式没有给出,它也能记住字符的完整形式。这个例子可以用于从文本中识别光学字符,如果字母的一小部分有变形或纸张脏污,Hopfield网络可能能记住这种类型的问题。在现代ML和AI应用中,有许多更有用的方法基于Hopfield网络,如当前的人工神经网络。

Hopfield网络(或称为Ising模型的神经网络或Ising–Lenz–Little模型)是一种递归神经网络形式,由John J. Hopfield博士在1982年发明。它由一个单层组成,包含一个或多个完全连接的递归神经元。Hopfield网络常用于自动关联和优化任务。Hopfield网络作为具有二进制阈值节点的内容可寻址存储系统。Hopfield网络还提供了一个基本模型,用于理解人脑和记忆如何被人工模拟。

如何训练Hopfield网络

如何在数字字符识别编程中应用这种方法?Hopfield网络如何在1和0像素上工作?我们可以将每个像素映射到Hopfield网络中的一个节点。我们可以在这个网络上训练正确的字符形式以识别每个字符。Hopfield网络在几次迭代后找到最可能的假设字符,并最终以训练的正确形式再现模式。如果我们有N个像素,这意味着我们的网络有NxN个权重,所以这个问题在计算上非常昂贵,可能在某些情况下很慢。例如,我们可以训练空白形式(空格)和这个“A”形式,如此进行即可。

Hopfield网络中的所有节点都用作输入和输出,并且它们完全相互连接。也就是说,每个节点是网络中每个其他节点的输入。我们可以将每个节点到自身的链接视为权重为0的链接。

我们可以轻松地训练Hopfield网络,我们只需要二进制数据来训练这个网络。正如我们所知,我们可以有二进制输入向量以及双极性输入向量。在Hopfield网络的训练过程中,权重在迭代中更新。

例如,对于一个由N个元素组成的3节点Hopfield网络数据矩阵和由NxN个元素组成的权重矩阵。以下是这些矩阵的3节点示例,

 

如何在C++中开发一个简单的Hopfield网络?

让我们创建一个简单的Hopfield网络C++ Builder示例如下。

按照给定的如下步骤创建一个简单的THopfield_Network类。

class THopfield_Network
{
private:std::vector<std::vector<int>> weights;
public:THopfield_Network(int numofNeurons) : weights(numofNeurons, std::vector<int>(numNeurons, 0)){}

我们将为这个类添加3个公共方法。首先,它将使用learn_pattern()方法从模式向量中学习,该方法定义如下,

// Learn from a pattern (update weights)
void learn_pattern(const std::vector<int>& pattern)
{for (int i = 0; i < pattern.size(); ++i){for (int j = 0; j < pattern.size(); ++j){if (i != j){weights[i][j] += pattern[i] * pattern[j];}}}
}

我们将使用update_neuron()方法更新我们的Hopfield网络神经元,该方法定义如下,

// Update neuron asynchronously
int update_neuron(const std::vector<int>& input, int neuronIndex)
{int sum = 0;for (int i = 0; i < input.size(); ++i){sum += weights[neuronIndex][i] * input[i];}return (sum >= 0) ? 1 : -1;
}

我们可以使用这个update_neuron方法通过以下定义的test()方法测试给定的输入模式,

//测试网络
std::vector<int> test(const std::vector<int>& input)
{std::vector<int> output(input);for (int i = 0; i < input.size(); ++i){output[i] = update_neuron(output, i);}return output;
}

作为结果,这个简单的Hopfield网络类将如下所示,

class THopfield_Network
{      private:std::vector<std::vector<int>> weights;   public:THopfield_Network(int numofNeurons) : weights(numofNeurons, std::vector<int>(numofNeurons, 0)){}// Learn from a pattern (update weights)void learn_pattern(const std::vector<int>& pattern){for (int i = 0; i < pattern.size(); ++i){for (int j = 0; j < pattern.size(); ++j){if (i != j){weights[i][j] += pattern[i] * pattern[j];}}}}// Update neuron asynchronouslyint update_neuron(const std::vector<int>& input, int neuronIndex){int sum = 0;for (int i = 0; i < input.size(); ++i){sum += weights[neuronIndex][i] * input[i];}return (sum >= 0) ? 1 : -1;}// Test the networkstd::vector<int> test(const std::vector<int>& input){std::vector<int> output(input);for (int i = 0; i < input.size(); ++i){output[i] = update_neuron(output, i);}return output;}  
};

现在我们可以全局定义一个Hopfield网络,给定宽度和高度像素。例如,如果我们有6×6像素模式,我们可以定义如下,

int W = 6, H = 6;
THopfield_Network hopfield(W*H);

现在我们可以定义一个模式向量如下,

 std::vector<int> pattern = {1, -1, -1, -1, -1, -1,-1, 1, -1, -1, -1, -1,-1, -1, 1, -1, -1, -1,-1, -1, -1, 1, -1, -1,-1, -1, -1, -1, 1, -1,-1, -1, -1, -1, -1, 1};

我们可以训练这个模式,如果我们有另一个如上的输入模式,我们可以测试它以获得最接近给定输入的结果(recovered_pattern)。

hopfield.learn_pattern(pattern);std::vector<int> recovered_pattern = hopfield.test(input_pattern);

现在我们在C++builder中完成一个GUI界面的Hopfield网络。

如何在C++Builder中开发一个简单的Hopfield网络?

让我们创建一个简单的C++ Builder中的Hopfield网络示例如下。

  1. 首先,创建一个新的C++ Builder FMX应用程序,添加一个图像(TImage),备忘录(TMemo)和3个按钮(TButton),它们是“清除”,“训练”和“测试”按钮。你可以添加一些布局来安排它们,如给定的表单(TForm)设计如上图。
  1. 将我们的THopfield网络类添加到“TForm1 *Form1;”行下面。

  2. 在Form单元的头文件中定义bmp和bmp2位图如下,其中bmp将用作输入模式,bmp2将显示在图像上。

    TBitmap* bmp, *bmp2;

    这样,bmp将用于存储输入模式的像素值,而bmp2用于显示处理后的图像。

     
    class TForm1 : public TForm
    {
    __published:	// IDE-managed ComponentsTImage *Image1;TButton *btTrain;TButton *btTest;TButton *btClear;TMemo *Memo1;TLayout *Layout1;TLayout *Layout2;void __fastcall btClearClick(TObject *Sender);void __fastcall Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, float X, float Y);void __fastcall btTrainClick(TObject *Sender);void __fastcall btTestClick(TObject *Sender);
    private:	// User declarations
    public:		// User declarationsTBitmap *bmp, *bmp2;__fastcall TForm1(TComponent* Owner);};

 4. 现在开始创建这些位图。


__fastcall TForm1::TForm1(TComponent* Owner)  : TForm(Owner)
{bmp = new TBitmap(W,H);bmp2 = new TBitmap(Image1->Width, Image1->Height);Image1->Bitmap->Assign(bmp2);
}

5. 定义Clear按钮事件。 

 
void __fastcall TForm1::btClearClick(TObject *Sender)
{bmp->Clear(claBlack);Image1->Bitmap->Clear(claBlack);
}

6. 为了允许用户通过点击图像定义自己的模式,我们需要处理Image1OnMouseDown事件。当用户在Image1`上双击时,我们可以捕获鼠标点击的像素位置,并根据这些位置更新网络的权重。以下是一个处理双击鼠标点击事件的示例:

void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, float X, float Y)
{float w = Image1->Width / W; // grid widthfloat h = Image1->Height / H; // grid heightint px = X / w; // exact pixel X on the bitmap scaled imageint py = Y / h; // exact pixel Y on the bitmap of scaled imageTBitmapData bitmapData;TAlphaColorRec acr;if (bmp->Map(TMapAccess::ReadWrite, bitmapData)) // Lock bitmap and retrive bitmap data{ac.Color = bitmapData.GetPixel(px, py);if (ac.Color == claBlack){bitmapData.SetPixel(px, py, claWhite);Image1->Bitmap->Canvas->BeginScene();Image1->Bitmap->Canvas->Fill->Color = claWhite;Image1->Bitmap->Canvas->FillRect(TRectF(px * w, py * h, px * w + w, py * h + h, 0, 0, AllCorners, 255.0);Image1->Bitmap->Canvas->EndScene();}else{bitmapData.SetPixel(px, py, claBlack);Image1->Bitmap->Canvas->BeginScene();Image1->Bitmap->Canvas->Fill->Color = claBlack;Image1->Bitmap->Canvas->FillRect(TRectF(px * w, py * h, px * w + w, py * h + h, 0, 0, AllCorners, 255.0);Image1->Bitmap->Canvas->EndScene();}bmp->Unmap(bitmapData);
}

在这个事件处理函数中,我们首先计算出鼠标点击位置对应的网格宽度w和高度h,然后获取该位置的像素颜色。如果像素颜色是黑色,我们将其设置为白色,并在Image1上绘制一个白色方块。如果不是黑色,我们将其设置为黑色,并在Image1上绘制一个黑色方块。这样用户就可以在Image1上绘制模式,然后训练Hopfield网络。

 7. 

现在,我们可以通过双击“训练”按钮来创建训练方法。在这个方法中,我们将从bmp位图中读取像素数据,然后在备忘录中显示这些数据,然后我们将使用hopfield.learn_pattern(pattern)来学习这个模式。以下是如何实现的示例:

void __fastcall TForm1::btTrainClick(TObject *Sender)
{std::vector<int> pattern;TBitmapData bitmapData;TAlphaColor acr;if (bmp->Map(TMapAccess::ReadWrite, bitmapData)) // Lock bitmap and retrive bitmap data{for (int j = 0; j < H; j++){for (int i = 0; i < W; i++){ac.Color = bitmapData.GetPixel(i, j);if (ac.Color == claBlack){pattern.push_back(-1);}else{pattern.push_back(1);}}bmp->Unmap(bitmapData);}Memo1->Lines->Add("Learned Pattern:");for (int j = 0; j < H; j++){String str = "";for (int i = 0; i < W; i++){if (pattern[j * W + i] == 1){str += "*";}else{str += "  ";}}Memo1->Lines->Add(str);}Memo1->Lines->Add("------------");hopfield.learn_pattern(pattern);
}

在这个btTrainClick事件处理函数中,我们首先检查bmp位图是否可以被锁定并获取其数据。然后,我们遍历位图的每个像素,检查其颜色,并根据颜色更新模式向量。最后,我们将模式向量传递给hopfield对象,调用learn_pattern方法进行训练。训练完成后,我们将训练结果添加到备忘录中,供后续测试或使用。

8. 最后,我们可以通过双击“测试”按钮来创建测试事件。在这个事件处理函数中,我们将使用之前训练的模式向量来测试网络,检查网络是否能够正确回忆训练的模式。以下是如何实现的示例:

void __fastcall TForm1::btTestClick(TObject *Sender)
{std::vector<int> pattern;TBitmapData bitmapData;TAlphaColor acr;if (bmp->Map(TMapAccess::ReadWrite, bitmapData)) // Lock bitmap and retrive bitmap data{for (int j = 0; j < H; j++){for (int i = 0; i < W; i++){ac.Color = bitmapData.GetPixel(i, j);if (ac.Color == claBlack)pattern.push_back(-1);elsepattern.push_back(1);}bmp->Unmap(bitmapData);}std::vector<int> recovered_pattern = hopfield.test(pattern);float w = Image1->Width / W; // grid widthfloat h = Image1->Height / H; // grid heightMemo1->Lines->Add("Recovered Pattern:");Image1->Bitmap->Canvas->BeginScene();for (int j = 0; j < H; j++){String str = "";for (int i = 0; i < W; i++){if (recovered_pattern[j * W + i] == 0){Image1->Bitmap->Canvas->Fill->Color = claWhite;Image1->Bitmap->Canvas->FillRect(TRectF(i * w, j * h, i * w + w, j * h + h, 0, 0, AllCorners, 255.0);str += "* ";}else{Image1->Bitmap->Canvas->Fill->Color = claBlack;Image1->Bitmap->Canvas->FillRect(TRectF(i * w, j * h, i * w + w, j * h + h, 0, 0, AllCorners, 255.0);str += "  ";}}Memo1->Lines->Add(str);Image1->Bitmap->Canvas->EndScene();Memo1->Lines->Add("------------");
}

在这个btTestClick事件处理函数中,我们首先检查bmp位图是否可以被锁定并获取其数据。然后,我们遍历位图的每个像素,检查其颜色,并根据颜色更新模式向量。最后,我们将模式向量传递给hopfield对象,调用test方法进行测试。测试完成后,我们将恢复的模式添加到备忘录中,供后续查看或使用。这样,我们就可以通过测试事件来验证Hopfield网络是否能够正确回忆训练的模式。

如何在C++ Builder中测试一个简单的Hopfield网络应用?

现在我们可以运行我们的应用程序(F9)。首先,我们可以清除,然后训练这个空白模式,然后我们可以绘制“A”,然后我们可以训练这个。你可以训练更多的不同模式。

 

在此步骤之后,我们可以使用“测试”按钮来询问另一个模式,这个模式看起来像我们之前训练过的模式之一,例如下面的模式:

hopfield.learn_pattern(pattern);
std::vector<int> recovered_pattern = hopfield.test(input_pattern);

通过这种方式,我们可以训练不同的模式,然后通过测试按钮来验证网络是否能够识别我们训练过的模式。这有助于我们了解网络的性能,以及它是否能够准确地回忆训练过的模式。

作为结果,你将看到我们的Hopfield网络记住了最接近的模式并恢复了它。这表明网络能够有效地存储和回忆训练过的模式,即使输入不完全匹配,网络也能够识别出最相似的模式。这种能力在模式识别和图像处理等应用中非常有用。

C++ Builder中有关Hopfield网络的完整示例代码?

以下是C+ Builder FMX应用程序的完整示例,注意头部也在上面给出。

//---------------------------------------------------------------------------#include <fmx.h>
#include <vector>#pragma hdrstop#include "Hopfield_Network_FMX_Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;class THopfield_Network
{      private:std::vector<std::vector<int>> weights;   public:THopfield_Network(int numofNeurons) : weights(numofNeurons, std::vector<int>(numofNeurons, 0)){}// Learn from a pattern (update weights)void learn_pattern(const std::vector<int>& pattern){for (int i = 0; i < pattern.size(); ++i){for (int j = 0; j < pattern.size(); ++j){if (i != j){weights[i][j] += pattern[i] * pattern[j];}}}}// Update neuron asynchronouslyint update_neuron(const std::vector<int>& input, int neuronIndex){int sum = 0;for (int i = 0; i < input.size(); ++i){sum += weights[neuronIndex][i] * input[i];}return (sum >= 0) ? 1 : -1;}// Test the networkstd::vector<int> test(const std::vector<int>& input){std::vector<int> output(input);for (int i = 0; i < input.size(); ++i){output[i] = update_neuron(output, i);}return output;}  
};int W = 6, H = 6;
THopfield_Network hopfield(W*H);//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)  : TForm(Owner)
{bmp = new TBitmap(W,H);bmp2 = new TBitmap(Image1->Width, Image1->Height);Image1->Bitmap->Assign(bmp2);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btClearClick(TObject *Sender)
{bmp->Clear(claBlack);Image1->Bitmap->Clear(claBlack);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, float X, float Y)
{float w = Image1->Width/W; // grid widthfloat h = Image1->Height/H; // grid heightint px = X/w; // exact pixel X on the bitmap of scaled imageint py = Y/h; // exact pixel Y on the bitmap of scaled imageTBitmapData bitmapData;TAlphaColorRec acr;if( bmp->Map(TMapAccess::ReadWrite, bitmapData)) // Lock bitmap and retrive bitmap data{acr.Color = bitmapData.GetPixel( px, py );if(acr.Color == claBlack){bitmapData.SetPixel(px,py, claWhite);Image1->Bitmap->Canvas->BeginScene();Image1->Bitmap->Canvas->Fill->Color  = claWhite;Image1->Bitmap->Canvas->FillRect( TRectF(px*w,py*h, px*w+w,py*h+h), 0, 0, AllCorners, 255.0);Image1->Bitmap->Canvas->EndScene();}else{bitmapData.SetPixel(px,py, claBlack);Image1->Bitmap->Canvas->BeginScene();Image1->Bitmap->Canvas->Fill->Color  = claBlack;Image1->Bitmap->Canvas->FillRect( TRectF(px*w,py*h, px*w+w,py*h+h), 0, 0, AllCorners, 255.0);Image1->Bitmap->Canvas->EndScene();}bmp->Unmap(bitmapData);}}
//---------------------------------------------------------------------------
void __fastcall TForm1::btTrainClick(TObject *Sender)
{std::vector<int> pattern;TBitmapData bitmapData;TAlphaColorRec acr;if( bmp->Map(TMapAccess::ReadWrite, bitmapData)) // Lock bitmap and retrive bitmap data{for(int j=0; j<H; j++)for(int i=0; i<W; i++){acr.Color = bitmapData.GetPixel( i, j );if(acr.Color == claBlack) pattern.push_back(-1);else pattern.push_back(1);}bmp->Unmap(bitmapData);}Memo1->Lines->Add("Learned Pattern:");for(int j=0; j<H; j++){String str ="";for(int i=0; i<W; i++){if(pattern[j*W+i]==1) str += "* ";else str += "  ";}Memo1->Lines->Add(str);}Memo1->Lines->Add("------------");hopfield.learn_pattern(pattern);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btTestClick(TObject *Sender)
{std::vector<int> pattern;TBitmapData bitmapData;TAlphaColorRec acr;if( bmp->Map(TMapAccess::ReadWrite, bitmapData)) // Lock bitmap and retrive bitmap data{for(int j=0; j<H; j++)for(int i=0; i<W; i++){acr.Color = bitmapData.GetPixel( i, j );if(acr.Color == claBlack) pattern.push_back(-1);else pattern.push_back(1);}bmp->Unmap(bitmapData);}std::vector<int> recoveredpattern = hopfield.test(pattern);float w = Image1->Width/W; // grid widthfloat h = Image1->Height/H; // grid heightMemo1->Lines->Add("Recovered Pattern:");Image1->Bitmap->Canvas->BeginScene();for(int j=0; j<H; j++){String str ="";for(int i=0; i<W; i++){if(recoveredpattern[j*W+i]==1){Image1->Bitmap->Canvas->Fill->Color  = claWhite;Image1->Bitmap->Canvas->FillRect( TRectF(i*w, j*h, i*w+w, j*h+h), 0, 0, AllCorners, 255.0);str += "* ";}else{Image1->Bitmap->Canvas->Fill->Color  = claBlack;Image1->Bitmap->Canvas->FillRect( TRectF(i*w, j*h, i*w+w, j*h+h), 0, 0, AllCorners, 255.0);str += "  ";}}Memo1->Lines->Add(str);}Image1->Bitmap->Canvas->EndScene();Memo1->Lines->Add("------------");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{bmp->Free();   bmp2->Free();
}
//---------------------------------------------------------------------------

相关文章:

C++builder中的人工智能(20):如何在C++中开发一个简单的Hopfield网络

在AI技术的发展历史中&#xff0c;模式识别模型是最伟大的AI技术之一&#xff0c;尤其是从像素图像中读取文本。其中一个是Hopfield网络&#xff08;或称为Ising模型的神经网络或Ising–Lenz–Little模型&#xff09;&#xff0c;这是一种递归神经网络形式&#xff0c;由John J…...

video2gif容器构建指南

一、介绍 1.项目概述 Video2Gif 项目旨在提供一种便捷的方式&#xff0c;让用户能够将视频中的精彩片段快速转换为 GIF 动画。GIF 动画因其循环播放、文件体积小等特点&#xff0c;在社交媒体、聊天工具中广泛应用&#xff0c;用于表达情感、分享趣事等。 2.核心功能 视频导…...

探秘Spring Boot中的@Conditional注解

文章目录 1. 什么是Conditional注解&#xff1f;2. 为什么需要Conditional注解&#xff1f;3. 如何使用Conditional注解&#xff1f;4. Conditional注解的高级用法5. 注意事项6. 结语推荐阅读文章 在Spring Boot的世界里&#xff0c;配置的灵活性和多样性是至关重要的。有时候&…...

树形dp总结

这类题型在 dp 中很常见&#xff0c;于是做一个总结吧&#xff01;&#xff01;&#xff01; 最经典的题&#xff1a;没有上司的舞会 传送门&#xff1a;没有上司的舞会 - 洛谷 状态表示&#xff1a; dp[i][0] 为 以 i 为根的子树中&#xff0c;选择 i 节点的最大欢乐值 d…...

【算法一周目】双指针(2)

目录 有效三角形的个数 解题思路 C代码实现 和为s的两个数字 解题思路 C代码实现 三数之和 解题思路 C代码实现 四数之和 解题思路 C代码实现 有效三角形的个数 题目链接&#xff1a;611. 有效三角形的个数题目描述&#xff1a;给定一个包含非负整数的数组nums&…...

vue内置方法总结

目录 1. 生命周期钩子方法 2. 响应式系统方法 3. DOM 更新方法 4. 事件处理方法 5. 访问子组件和 DOM 元素 6. 数据观察方法 7. 其他方法 1. 生命周期钩子方法 这些方法在 Vue 实例的不同生命周期阶段自动调用。 beforeCreate&#xff1a; 在实例初始化之后&#xff0c…...

面向对象分析与设计

前言: 感觉书本上和线上课程, 讲的太抽象, 不好理解, 但软件开发不就是为了开发应用程序吗?! 干嘛搞这么抽象,对吧, 下面是个人对于软件开发的看法, 结合我的一些看法, 主打简单易懂, 当然,我一IT界小菜鸟, 对软件开发的认识也很浅显, 这个思维导图也仅仅是现阶段我的看…...

lineageos-19 仓库群遍历,打印第一条git log

lineageos-19 仓库群遍历,打印第一条git log RepoLsRootD/app4/lineage19_oneplus6 LogF/app4/wiki/repo_head_log_ls-lineageos19.1.log rm -v $LogF && \ cd $RepoLsRootD && \ find . -type l -path "*/*.git" -not -path "./.repo/*"…...

详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送

在C#中&#xff0c;SendMessage方法是一个强大的工具&#xff0c;它允许我们与Windows API交互&#xff0c;模拟键盘和鼠标事件。本文将详细介绍如何使用SendMessage方法来发送鼠标和键盘消息。 1. SendMessage方法概述 SendMessage是Windows API中的一个函数&#xff0c;它用…...

VMware安装黑苹果后ICLOUD_UNSUPPORTED_DEVICE(不支持的Icloud设备)

修改文件 关闭虚拟机找到虚拟机文件中以.vmx结尾的文件编辑内容&#xff08;补充缺失&#xff09; board-id "Mac-551B86E5744E2388" hw.model.reflectHost "FALSE" hw.model "MacBookPro14,3" serialNumber.reflectHost "FALSE"…...

Python | Leetcode Python题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; class Solution:def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:m, n len(matrix), len(matrix[0])# 初始化动态规划的数组&#xff0c;所有的距离值都设置为一个很大的数dist [[10**9] * n for _ in range(m)]…...

【计算机网络】【传输层】【习题】

计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理&#xff0c;请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注&#xff1a;本文基于《计算机网络》&#xff08;第5版&#xff09;吴功宜、吴英…...

【LeetCode】【算法】55. 跳跃游戏

LeetCode 99 - 55. 跳跃游戏 题目 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回true&#xff1b;否则&#xff0c;返回 …...

华为:hcia综合实验

一、拓扑图 二、实验要求 1. pc地址请自行规划&#xff0c;vlan已给出 2. 服务器地址自行规划&#xff0c;vlan&#xff0c;网段已给出 3. 交换机互联链路捆绑保证冗余性 4. 内网pc网关集中于核心交换机&#xff0c;交换机vlan 40互联路由器 ,地址网段已给出 5.配置静态路由实…...

MyBatis与MyBatis-Plus(基础)

MyBatis-Plus的优势 在 Spring Data JPA 已经很方便的情况下&#xff0c;有时仍然选择使用 MyBatis-Plus 的核心原因主要有以下三点&#xff1a; 1. 复杂 SQL 控制能力更强 MyBatis-Plus 允许直接编写和优化 SQL&#xff0c;适合复杂查询、精细化 SQL 控制的场景。特别是在性…...

一文总结java语法规则

1. 题记 Java是一门拥有较强语法规则的编程语言&#xff0c;本博文主要总结介绍java语言的java语法规则。 2. java语法规则 2.1 标识符&#xff08;Identifiers&#xff09; 定义&#xff1a;标识符是用来给变量、类、方法、接口等命名的字符序列。规则&#xff1a; –标识…...

使用 npm 安装 Yarn

PS E:\WeChat Files\wxid_fipwhzebc1yh22\FileStorage\File\2024-11\spid-admin\spid-admin> yarn install yarn : 无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后…...

vue3中利用路由信息渲染菜单栏

1. 创建路由时将路由信息对象进行抽离 将路由信息对象单独抽离到router/routes.ts文件 关键&#xff1a;利用路由元信息meta&#xff0c;定义3个属性 hidden&#xff1a;控制当前路由是否显示在菜单栏中title&#xff1a;菜单拦名称icon&#xff1a;对应菜单名称前面的图标 …...

Mysql每日一题(行程与用户,困难※)

今天给大家分享一个截止到目前位置&#xff0c;我遇到最难的一道mysql题目&#xff0c;非常建议大家亲手做一遍 完整代码如下&#xff0c;这道题的主要难点是它有两个外键&#xff0c;以前没遇到过&#xff0c;我也没当回事&#xff0c;分享一下错误经验哈 当时我写的where判断…...

adb 命令 查找启动的包名以及导出安装包

查看安卓内包名 adb 查看所有安装的包 adb shell pm list packages查看安装的第三方app的包名 adb shell pm list packages -3查看启动的app的包名 adb shell dumpsys activity top | find "ACTIVITY"adb shell dumpsys activity activities | findstr "Run…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...