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

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...