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();
}
//---------------------------------------------------------------------------

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Leetcode 中等】34. 在排序数组中查找元素的第一个和最后一个位置

原题链接 Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置 题目 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必…

金融学期末速成笔记

【拯救者】金融学速成&#xff08;基础习题&#xff09; 重点: 市场经济是发达的商品经济。在市场经济条件下&#xff0c;市场机制作为资源配置方式&#xff0c;发挥基础性作用。 除具有商品经济的一般特征外&#xff0c;与商品经济相比&#xff0c;市场经济还具有一些新的特征…

云计算复习文档

云计算复习文档 一 云计算概述 名词&#xff1a; 云计算 1.0 &#xff1a; 面向数据中心管理员的IT基础设施资源虚拟化阶段 通过计算虚拟化技术将企业IT应用与底层的基础设施彻底分离、解耦 将多个企业IT应用实例及运行环境复用在相同的物理服务器上&#xff0c;并通过虚…

【Docker容器化技术】docker安装与配置、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库

文章目录 一、Docker的安装与配置1、docker概述2、安装docker3、docker架构4、配置镜像加速器 二、Docker命令1、服务相关命令2、镜像相关命令3、容器相关命令 三、Docker容器数据卷1、数据卷概念及作用2、配置数据卷3、配置数据卷容器 四、Docker应用部署实战1、部署MySQL2、部…

window11安装elasticsearch+Kibana

1、下载elasticsearch与elasticsearch 下载elasticsearch 查看elasticsearch对应的Kibana版本 下载elasticsearch解压后文件目录如下 可执行脚本文件,包括启动elasticsearch服务、插件管理、函数命令等 bin配置文件目录,如elasticsearch配置、角色配置、jvm配置等 conf 默认…

云技术基础学习

声明 学习内容来自 B站 up 主《泷羽 sec》&#xff0c;如涉及侵权等问题&#xff0c;请及时联系&#xff0c;本人将马上删除文章。在此郑重声明&#xff0c;文章仅限于交流学习&#xff0c;任何其他违法行为与本人及泷羽 sec 无关。请务必遵守法律法规&#xff0c;切莫越过法律…

初识Linux · 匿名管道

目录 前言&#xff1a; 匿名管道 理解为什么&#xff1f; 理解是什么&#xff1f; 理解怎么做&#xff1f; 前言&#xff1a; 引入管道之前&#xff0c;我们引入几个问题&#xff0c;进程通信的相关问题。 第一个是进程之间为什么要通信&#xff0c;对于进程间通信来说&…

MySQL数据库:本地部署数据库以及安装彩虹猫【Navicat】

文章目录 一.安装前准备工作1.下载并解压文件2.修复电脑缺失的文件 二.本地部署MySQL1.先解压mysql-8.0.25-winx64.zip&#xff0c;并把文件放到安装需要的位置&#xff0c;再把my.ini文件放到mysql-8.0.25-winx64的根目录2.修改注册表的根目录信息为自己的安装装路径3.进命令符…

计算机网络作业一

一共8次作业&#xff0c;都挺难的&#xff0c;只能在老师的要求下尽力尝试。 任务&#xff1a;探测Internet (IPv4和IPv6) 1. 探测并估计有多少地址是活动的&#xff0c;解释你的方法并估计误差范围 2. 找到尽可能多的关键地址&#xff0c;然后解释它们是什么&#xff0c;为…

联通10010 阿里滑块 231 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我删…

DAY58||110.字符串接龙 |105.有向图的完全可达性 |106.岛屿的周长

110.字符串接龙 110. 字符串接龙 题目描述 字典 strList 中从字符串 beginStr 和 endStr 的转换序列是一个按下述规格形成的序列&#xff1a; 1. 序列中第一个字符串是 beginStr。 2. 序列中最后一个字符串是 endStr。 3. 每次转换只能改变一个字符。 4. 转换过程中的中间字符串…

爬虫补环境案例---问财网(rpc,jsdom,代理,selenium)

目录 一.环境检测 1. 什么是环境检测 2.案例讲解 二 .吐环境脚本 1. 简介 2. 基础使用方法 3.数据返回 4. 完整代理使用 5. 代理封装 6. 封装所有使用方法 jsdom补环境 1. 环境安装 2. 基本使用 3. 添加参数形式 Selenium补环境 1. 简介 2.实战案例 1. 逆向目…

《TCP/IP网络编程》学习笔记 | Chapter 8:域名及网络地址

《TCP/IP网络编程》学习笔记 | Chapter 8&#xff1a;域名及网络地址 《TCP/IP网络编程》学习笔记 | Chapter 8&#xff1a;域名及网络地址域名系统什么是域名&#xff1f;DNS 服务器IP 地址和域名之间的转换使用域名的必要性利用域名获取 IP 地址利用 IP 地址获取域名 基于 Wi…

Liunx:简易版进程池

进程向系统申请资源存在一定的效率问题。系统调用在底层是有成本的。频繁的向操作系统申请资源会造成一定的开销。解决办法是一次性向系统申请你需要的资源&#xff0c;将这些资源在用户层管理维护起来&#xff0c;减少程序频繁的陷入内核。这就是池化的意思&#xff0c;可以简…

百亿AI数字人社会初现:Project Sid展示智能代理文明进化路径

项目背景 Project Sid 是一项开创性的AI代理人文明实验,旨在通过新开发的认知架构 PIANO 探讨AI代理人是否能够在大规模数字社会中实现文明的演进。这项实验不仅展示了社会进步、角色分化、治理体系及文化传播等特征,还揭示了一个包含百亿“数字人类”的社会可能性。 PIANO…

CoCa: Contrastive Captioners are Image-Text Foundation Models

Jiahui Yu† Zirui Wang†{jiahuiyu, ziruiw}google.comVijay Vasudevan Legg Yeung Mojtaba Seyedhosseini Yonghui WuGoogle Research 参考代码链接&#xff1a;https://github.com/lucidrains/CoCa-pytorch 模型效果对比网址&#xff1a;CoCa: Contrastive Captioners are …

HarmonyOS一次开发多端部署三巨头之功能级一多开发和工程级一多开发

功能级一多开发与工程级一多开发 引言功能级一多开发SysCaps机制介绍能力集canlUse接口 工程级一多开发三层架构规范 引言 一次开发多端部署 定义&#xff1a;一套代码工程&#xff0c;一次开发上架&#xff0c;多端按需部署 目标&#xff1a;支撑开发者快速高效的开发多终端设…

c中的文件管理

大家好&#xff0c;今天我们来看看语言中的文件管理&#xff0c;聊到这个&#xff0c;我们就得先说说文件的特点。 1.文件是一种让数据持久化的方法&#xff0c;使用文件可以将数据直接存放在电脑的硬盘上&#xff0c;做到数据持久化。 那么什么是文件呢&#xff1f; 硬盘上…

ElasticSearch的Python Client测试

一、Python环境准备 1、下载Python安装包并安装 https://www.python.org/ftp/python/3.13.0/python-3.13.0-amd64.exe 2、安装 SDK 参考ES官方文档: https://www.elastic.co/guide/en/elasticsearch/client/index.html python -m pip install elasticsearch一、Client 代…

python中常见的8种数据结构之一数组的应用

在Python中&#xff0c;数组是一种常见的数据结构&#xff0c;用于存储一系列相同类型的元素。在实际应用中&#xff0c;数组可以用于解决各种问题。 以下是数组在Python中的一些常见应用&#xff1a; 1. 存储和访问数据&#xff1a;数组可以用于存储和访问一组数据。可以通过…