当前位置: 首页 > 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…...

Flink_DataStreamAPI_输出算子Sink

Flink_DataStreamAPI_输出算子Sink 1连接到外部系统2输出到文件3输出到Kafka4输出到MySQL&#xff08;JDBC&#xff09;5自定义Sink输出 Flink作为数据处理框架&#xff0c;最终还是要把计算处理的结果写入外部存储&#xff0c;为外部应用提供支持。 1连接到外部系统 Flink的D…...

标准C++ 字符串

一、标准库中的字符串类型 在C中&#xff0c;字符串是一个非常重要的数据类型&#xff0c;用于表示和处理文本信息。C提供了多种方式来处理字符串&#xff0c;每种方式都有其特点和适用场景。以下是几种常见的字符串类型及其用法&#xff1a; 1. C 风格字符串 (char* 或 char…...

时序预测:多头注意力+宽度学习

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

day06(单片机)IIC+STH20

目录 IICSHT20 I2C基础简介 为什么I2C需要使用上拉电阻&#xff1f; I2C特点 时序图分析 起始信号与终止信号 数据传输时序 字节传输和应答信号 I2C寻址 主机给从机发送一个字节 主机给从机发送多个字节 主机从从机接收一个字节 主机从从机接收多个字节 I2C寄存器 I2C_RXDR&…...

Bugku CTF_Web——文件上传

Bugku CTF_Web——文件上传 进入靶场 My name is margin,give me a image file not a php抓个包上传试试 改成png也上传失败 应该校验了文件头 增加了文件头也不行 试了一下 把文件类型改成gif可以上传 但是还是不能连接 将Content-Type改大小写 再把文件后缀名改成php4 成…...

C#版使用融合通信API发送手机短信息

目录 功能实现 范例运行环境 实现范例 类设计 类代码实现 调用范例 总结 功能实现 融合云通信服务平台&#xff0c;为企业提供全方位通信服务&#xff0c;发送手机短信是其一项核心功能&#xff0c;本文将讲述如何使用融合云服务API为终端手机用户发送短信信息&#xf…...

人工智能:重塑医疗、企业与生活的未来知识管理——以HelpLook为例

一、医疗行业&#xff1a;AI引领的医疗革新 随着人工智能&#xff08;AI&#xff09;技术的持续飞跃&#xff0c;我们正身处一场跨行业的深刻变革之中。在医疗健康的广阔舞台上&#xff0c;人工智能技术正扮演着日益重要的角色。它不仅能够辅助医生进行病例的精准诊断&#xf…...

MVVM(Model-View-ViewModel)模型

MVVM&#xff08;ModelViewViewModel&#xff09;模型是一种常用于软件开发中的架构模式&#xff0c;尤其在前端框架&#xff08;如 Vue.js、React、Angular&#xff09;中被广泛应用。它将程序的用户界面与业务逻辑分离&#xff0c;便于维护和扩展。 MVVM 的三个组成部分 1. …...

权限系统:权限应用服务设计

今天聊聊权限系统的应用服务设计。 从业务需求的角度来看&#xff0c;权限系统需要解决两个核心问题&#xff1a; 1、菜单渲染与动态展示 当用户成功登录并接入系统后&#xff0c;系统需要动态获取并展示该用户有权限访问的菜单项。 这一过程涉及前端系统与权限系统的交互。前端…...

Android音频架构

音频基础知识 声音有哪些重要属性呢&#xff1f; 响度(Loudness) 响度就是人类可以感知到的各种声音的大小&#xff0c;也就是音量。响度与声波的振幅有直接关系。 音调(Pitch) 音调与声音的频率有关系&#xff0c;当声音的频率越大时&#xff0c;人耳所感知到的音调就越高&a…...