NX二次开发——矩形排料5(基于最低水平线+遗传算法排料策略实现)

目录

一、概述

二、知识回顾

2.1适应度函数的确定

2.2基因编码

2.3遗传算法复制(选择)

2.4遗传算法交叉操作        通过交叉操作可以增加种群个体的多样性,既可以产生更多的优秀解。下面通过顺序编码方法进行改进(网上有很多方法)。注意这里直接用顺序编码方式会产生非法子代,不是结果不好,本文采取整数编码。

2.5遗传算法变异操作        从遗传算法的角度来看,解的进化主要是靠选择机制和交叉策略来完成,变异只是产生新个体的辅助方法,目的在于提高算法的局部搜索能力,避免陷入早熟。通过交叉算子和变异算子的相互配合,共同完成对搜索空间的全局搜索和局部搜索,从而使遗传算法能够良性的搜索以完成最优化问题的寻优过程,变异概率一般不能太大,本次取为0.05左右。

2.5.1位置交换变异

2.5.2旋转变异(基因正负号变化)

三、所用函数代码与运行结果

3.1所用函数代码

3.2运行结果

3.3结果分析


一、概述

        本文前三篇对矩形排料的理论知识已经做出了讲解,第四篇基于最低水平线搜索策略已经实现了NX基于最低水平线排料,这篇主要详细的记录一下基于最低水平线+遗传算法排料策略实现。

二、知识回顾

2.1适应度函数的确定

        上一篇矩形排料3已经对适应度函数进行了认识,这里我进行简单的叙述。参考“下台阶算法”提出了以板材利用率的大小表示适应度函数值的大小,板材利用率越高,适应度函数值越大,定义如下:

/******************************************************************************************
double			ratio         板材的利用率(适应度函数值)
double			usedArea	  需要排样矩形件的面积总和(*100单位转化)
double			width		  板材宽度
double			maxHigh       板材排料后最大使用高度,不包括使用完整后的板材
int				symbol		  板料个数标识
******************************************************************************************/
ratio = (usedArea * 100.0) / (width * (maxHigh + (symbol - 1)));
2.2基因编码

        用遗传算法解决实际问题时,必需先确定染色体的编码方法。编码就是将问题的解用一种代码来表示,从而将问题的状态空间与遭传算法的码空间相对应,这在很大程度上依赖于所要求解问题的性质。编码是应用遭传算法求解问题时的一个关键步骤 ,编码方法决定了染色体的排列形式,编码的好坏将直接影响到遭传算法的性能和效率。

       由于板材和零件都是矩形,为了使矩形排放时板材的利用率尽可能高,每个零件在具体排放时只能有横放和竖放两种方式。由于每个基因的编码可以为正或负,在本文中统一规定:矩形的编号为正表示矩形横排,即矩形的长边平行于X轴;矩形的编号为负表示矩形竖排,即矩形的长边平行于Y轴 。

        本文采用整数顺序编码方式:先将要排放的每个矩形都统一进行编号,矩形的编号可以为正或负,矩形编号的正负是根据矩形是横放还是竖放来决定的。一个矩形的编号对应一个基因的编码。设要排放的矩形总数为n,n个矩形的编号构成了一个染色体。种群中每条染色体的长度与待排矩形零件总数相同,染色体中每个基因的编码对应相应矩形的编号,所有基因编码的一个排列顺序构成了一个染色体。

        染色体{-2, 1 , 5 , 3 , -4}表示先排 2 号矩形,矩形竖排;接着排 1 号矩形,矩形横排;接下来横排矩形 5 ,然后横排矩形3 ,最后竖排矩形 4 ,如下图1所示:

图1基因编码

2.3遗传算法复制(选择)

        选择操作是为了保证个体的优良特性得以保存并能有效的遗传到下一代中,目的在于保留有效、优良基因,以保证解的质量,提高收敛速度。选择算子,就是依适应度大小,按照某种规则,从当前的种群中选择适应度高的个体遗传到下一代种群中同时淘汰那些适应度值低的个体。本次利用轮盘赌进行选择,其主要实现的思路如下:将种群中所有染色体编号,并根据各自适应值计算按比例分配的概率,依次计算染色体累加概率,产生(0,1)之间随机数,若其最多能大于序列中第m个值,则第m个染色体被随机选择。

  

        个体放入适应度越大,其被选中的概率越高,个体被选择的概率值可以看做在轮盘区间范围,每次轮盘赌算法都会在(0,1)之间产生一个随机数,通过随机数落在轮盘哪个区间来确定被选中个体。注意累计所占比例最后一定是1,如果不为1的话一定计算有误。

2.4遗传算法交叉操作
        通过交叉操作可以增加种群个体的多样性,既可以产生更多的优秀解。下面通过顺序编码方法进行改进(网上有很多方法)。注意这里直接用顺序编码方式会产生非法子代,不是结果不好,本文采取整数编码。

         根据交叉概率p_{i},选择 2个个体 x_{i}x_{j}进行交叉操作。随机选择一个交叉点,在交叉点处,交换 2个个体后半部分得到 2个新的个体x_{i}^{'}x_{j}^{'}, 如下图所示:注意这里数字前的负号只表示矩形是横放还是竖放(在考虑交叉时,看做标记即可)

61354279810

个体x_{i}

97568321410

个体x_{j}

61354321410

个体x_{i}^{'}

97568279810

个体x_{j}^{'}

        很显然,交叉操作可能产生非法个体,即个体中有重复的基因。所以必须对2个新个体的基因进行调整。

**1**找出个体x_{i}^{'}的重复基因1,3,4;个体x_{j}^{'}的重复基因9,7,8;

**2**将1,3,4与9,7,8以及其关联的负号对应交换,得到两个合法的新个体x_{i}^{''}x_{j}^{''},如下所示:

69758321410

个体x_{i}^{''}

13564279810

个体x_{j}^{''}

2.5遗传算法变异操作
        从遗传算法的角度来看,解的进化主要是靠选择机制和交叉策略来完成,变异只是产生新个体的辅助方法,目的在于提高算法的局部搜索能力,避免陷入早熟。通过交叉算子和变异算子的相互配合,共同完成对搜索空间的全局搜索和局部搜索,从而使遗传算法能够良性的搜索以完成最优化问题的寻优过程,变异概率一般不能太大,本次取为0.05左右。
2.5.1位置交换变异

        位置变异的思想是产生[1,n]之间的两个正整数随机数,num1、num2,将两个位置交换。例如:产生的随机数num1=2、num2=6

原染色体:

61354279810

变异后染色体:

62354179810

具体步骤:

**1**在要进行变异的个体中,随机选择2个基因位;

**2**将所选择 2个基因位上的基因值交换,得到 1个新个体。

2.5.2旋转变异(基因正负号变化)

 排列方式变异的思想是:第一步在[1,n]之间产生一个随机数num;第二步在[0,1]之间产生一个随机数 rand,若rand>0.5,刚将其排列方式进行改变,反之,不予理睬,这里所说的变是指排列时矩形是横放还是竖放。

例如:产生的随机数分别为num=5,rand=0.7。

原染色体:

61354279810

变异后染色体:

6135-4279810

三、所用函数代码与运行结果

3.1所用函数代码
//用户定义头文件
#include <atlbase.h>
#include <Windows.h>
#include <vector>
#include <algorithm>
#include "uf.h"
#include "uf_modl.h"
#include "uf_obj.h"
#include "uf_ui.h"
#include "uf_eval.h"
#include "uf_csys.h"
#include <numeric>
#include <algorithm>
#include <random>
#include <stdio.h>
#include <random>
#include <cmath>
#include <numeric>
#include <iostream>
#include <unordered_map>/*****************************************************************************************************
struct:			OutLine1			水平线类结构体
double			Origin				水平线起始x位置
double			End					水平线终止x位置
double			Height				水平线高度
******************************************************************************************************/
struct OutLine1
{double Origin;double End;double Height;// 有参数构造函数OutLine1(const double& origin, const double& end, const double&  height): Origin(origin), End(end), Height(height){}
};//用户定义
/*****************************************************************************************************
Function:		vector<vector<int>>				NXOpen_GA_RectangularLayout		初始化种群
input:			int								ProductsNum						每个染色体的尺寸大小	
input:			int								Population_size					种群大小
return:		vector<vector<int>>				Population						初始化种群后的数据
******************************************************************************************************/
vector<vector<int>> NXOpen_GA_RectangularLayout::Initial_population(int ProductsNum, int Population_size)
{。。。。。。
}/*****************************************************************************************************
Function:		void				initLineList1		初始化水平线集
input:			double				origin				水平线起始x位置
input:			double				end					水平线终止x位置
input:			double				height				水平线高度
input,output:	vector<OutLine1>	lineList			水平线集合
input,output:	OutLine1			lowestLine			最低水平线
input,output:	int					lowestLineIdx		水平线集合中的最低水平线所在位置的ID
******************************************************************************************************/
void NXOpen_GA_RectangularLayout::initLineList1(double origin, double end, double height, vector<OutLine1> &lineList, OutLine1 &lowestLine, int &lowestLineIdx)
{。。。。。。
}/*******************************************************************************************************************
Function:		void				findLowestLine1		找出最低水平线(如果最低水平线不止一条则选取最左边的那条)
input,output:	vector<OutLine1>	lineList			水平线集合
input,output:	OutLine1			lowestLine			最低水平线
input,output:	int					lowestLineIdx		水平线集合中的最低水平线所在位置的ID
*********************************************************************************************************************/
void NXOpen_GA_RectangularLayout::findLowestLine1(vector<OutLine1> lineList, int &lowestLineIdx, OutLine1 &lowestLine)
{。。。。。。
}/*******************************************************************************************************************
Function:		double				lineWidth1			获得放置矩形件的可用长度
input:			int					index				水平线集合中的最低水平线所在位置的ID
input:			OutLine1			lineList			水平线集合
return:		double				availableWidth		返回放置矩形件的可用长度
*********************************************************************************************************************/
double NXOpen_GA_RectangularLayout::lineWidth1(int index, vector<OutLine1> lineList)
{。。。。。。
}/*******************************************************************************************************************
Function:		double				lineHigh1			获得放置矩形件的可用高度
input:			int					index				水平线集合中的最低水平线所在位置的ID
input:			OutLine1			lineList			水平线集合
input,output:	double				containerHigh		板材的高度
return:		double				availableHigh		返回放置矩形件的可用高度
*********************************************************************************************************************/
double NXOpen_GA_RectangularLayout::lineHigh1(int index, vector<OutLine1> lineList, double containerHigh)
{。。。。。。
}/*******************************************************************************************************************
Function:		double				maxlineHigh1		水平线集合中最大的高度
input:			OutLine1			lineList			水平线集合
return:		double				maxlineHigh1		返回放置矩形件的可用高度
*********************************************************************************************************************/
double NXOpen_GA_RectangularLayout::maxlineHigh1(vector<OutLine1> lineList)
{。。。。。。
}/*******************************************************************************************************************************************
Function:		int						searchBySize1			获得候选物品的索引;根据长度搜索矩形件(找出宽度或高度小于目标长度的首个矩形件)
input:			double					targetWidth				放置矩形件的可用长度
input:			vector<vector<double>>	data					要放置的矩形物品列表
return:		int						candidateIdx			返回候选物品的索引
********************************************************************************************************************************************/
int NXOpen_GA_RectangularLayout::searchBySize1(double targetWidth, vector<vector<double>> data)
{。。。。。。
}/*******************************************************************************************************************************************
Function:		int						searchBySize2			获得候选物品的索引;根据长度搜索矩形件(找出宽度或高度小于目标长度的首个矩形件)
input:			double					targetWidth				放置矩形件的可用长度
input:			double					targetHigh				放置矩形件的可用高度
input:			vector<vector<double>>	data					要放置的矩形物品列表
return:		int						candidateIdx			返回候选物品的索引
********************************************************************************************************************************************/
int NXOpen_GA_RectangularLayout::searchBySize2(double targetWidth, double targetHigh, vector<vector<double>> data)
{。。。。。。
}/***********************************************************************************************************************************
Function:		vector<double>		rotateNew1			对于满足长度小于可用长度的矩形件进行旋转放置(宽度放不下时,对矩形件进行旋转)
input:			vector<double>		pro					要放置的矩形件
return:		vector<double>		temp				返回放置矩形件
*************************************************************************************************************************************/
vector<double> NXOpen_GA_RectangularLayout::rotateNew1(vector<double> pro)
{。。。。。。
}/***********************************************************************************************************************************
Function:		void				updateLineList			在水平线集合中更新最低水平线
input:			int					index					水平线集合中的最低水平线所在位置的ID
intput,output:	OutLine1			newLine					新的最低水平线
intput,output:	vector<OutLine1>	lineList				替换新的最低水平线后的水平线集合
*************************************************************************************************************************************/
void NXOpen_GA_RectangularLayout::updateLineList(int index, OutLine1& newLine, vector<OutLine1> &lineList)
{。。。。。。
}/***********************************************************************************************************************************
Function:		void				insertLineList			在水平线集合的最低水平线后插入新的最低水平线
input:			int					index					水平线集合中的最低水平线所在位置的ID
intput,output:	OutLine1			newLine					新的最低水平线
intput,output:	vector<OutLine1>	lineList				替换新的最低水平线后的水平线集合
*************************************************************************************************************************************/
void NXOpen_GA_RectangularLayout::insertLineList(int index, OutLine1& newLine, vector<OutLine1> &lineList)
{。。。。。。
}/**************************************************************************************************
Function:		void					packing			将候选物品排样
input,output:	vector<double>			pro				要放置的矩形件
intput:			int						lowestLineIdx	水平线集合中的最低水平线所在位置的ID
input,output:	OutLine1				lineList		水平线集合
input,output:	vector<vector<double>>	resultPos		排序后的矩形物品列表
intput:			OutLine1				lowestLine		最低水平线
***************************************************************************************************/
void NXOpen_GA_RectangularLayout::packing(vector<double> pro, int &lowestLineIdx, vector<OutLine1> &lineList, vector<vector<double>> &resultPos, OutLine1 lowestLine)
{。。。。。。
}/*****************************************************************************************************************
Function:		void					enhanceLine1	最低水平线宽度小于要排样矩形宽度,提升水平线
intput,output:	int						index			水平线集合中的最低水平线所在位置的ID
input,output:	vector<OutLine1>		lineList		水平线集合
input,output:  OutLine1				lowestLine		最低水平线
input:			double					containerHigh	板料高度
input:			double					containerWidth	板料宽度
input:			double					lingjianjuli	零件距离
input,output:	int						symbol			板料个数标识
******************************************************************************************************************/
void NXOpen_GA_RectangularLayout::enhanceLine1(int &index, vector<OutLine1> &lineList, double containerHigh, double containerWidth, double lingjianjuli, OutLine1 &lowestLine)
{。。。。。。
}/*****************************************************************************************************************
Function:		double					calHighLine1	计算板材的最大使用高度
intput:			vector<OutLine1>		lineList		水平线集合
return:		double					maxHigh			最大高度
******************************************************************************************************************/
double NXOpen_GA_RectangularLayout::calHighLine1(vector<OutLine1> lineList)
{。。。。。。
}/***********************************************************************************************************************************
Function:		double					calUsedRatio1	计算排料矩形件的总面积、板材的最低水平线高度,板材利用率1,板材利用率2
intput,output:	double					usedArea		排样矩形件的面积总和
input:			vector<vector<double>>	resultPos		排样矩形件信息集合
input:			double					width			板材宽度
input:			double					High			板料使用的最小高度,不包括使用完整后的板材
input:			vector<OutLine1>		lineList		水平线集合
input:			int						symbol			板料个数标识
intput,output:	double					ratio			板材利用率
************************************************************************************************************************************/
void NXOpen_GA_RectangularLayout::calUsedRatio1(double &usedArea, vector<vector<double>> resultPos, double width, double High, vector<OutLine1> lineList, int symbol, double &ratio)
{。。。。。。
}/**************************************************************************************************
Function:		void							Packing_main	将候选物品排样主函数(放置个体)
intput,output:	double							usedArea		排样矩形件的面积总和
intput,output:	double							ratio			板材利用率
intput,output:	double							MaxHeight		板料排放物品后达到的最大高度,不包括使用完整后的板材
input:			double							container_height板材高度
input:			double							container_width	板材宽度
input:			vector<vector<double>>			products		要排放的矩形物件集合
return:		vector<vector<vector<double>>>	resultPos		返回将多个板料候选物品排样数据集合
***************************************************************************************************/
vector<vector<vector<double>>> NXOpen_GA_RectangularLayout::Packing_main(double &usedArea,double &ratio, double&MaxHeight, double container_height, double container_width, vector<vector<double>> products)
{。。。。。。
}/*****************************************************************************************************************
Function:		vector<double>			Get_Fitness			获得适应度函数
input:			vector<vector<double>>	products			要排放的矩形物件集合
input:			double					container_height	板材高度
input:			double					container_width		板材宽度
intput:			vector<vector<int>>		Population			种群集合
return:		vector<double>			fitness				当代种群中的适应度函数值大小集合
******************************************************************************************************************/
vector<double> NXOpen_GA_RectangularLayout::Get_Fitness(vector<vector<double>> products, double container_height, double container_width, vector<vector<int>> Population)
{。。。。。。
}/*****************************************************************************************************************
Function:		void					Get_bestAndworst			获得当代最佳和最差个体索引
intput,output:	int						best_idx					当代最佳个体索引
intput,output:	double					worst_idx					当代最差个体索引
input:			vector<double>			fitness						当代适应度函数值集合
******************************************************************************************************************/ 
void NXOpen_GA_RectangularLayout::Get_bestAndworst(int &best_idx, int &worst_idx, vector<double> fitness)
{。。。。。。
}/*****************************************************************************************************************
Function:		void					select			遗传算法选择(复制)操作——轮盘赌思想
intput:		vector<vector<int>>		Population		种群集合
input:			vector<double>			fitness			当代适应度函数值集合
return:		vector<vector<int>>		Population		新的种群集合
******************************************************************************************************************/
vector<vector<int>> NXOpen_GA_RectangularLayout::select(vector<vector<int>> Population, vector<double> fitness)
{。。。。。。
}/*****************************************************************************************************************
Function:		vector<int>				randNum					随机产生1到n的数,一共n个,每个只出现一次
intput:		int 					number					需要产生的个数
return:		vector<vector<int>>		random_combination		产生随机数集合
******************************************************************************************************************/
vector<int> NXOpen_GA_RectangularLayout::randNum(int number)
{。。。。。。
}/*****************************************************************************************************************
Function:		int			getRandomNumber					随机产生一个在[main,max]区间内的正整数
intput:		int 		min								产生随机数的下限
intput:		int			max								产生随机数的上限
return:			int			RandomNumber					返回产生的随机数
******************************************************************************************************************/
int NXOpen_GA_RectangularLayout::getRandomNumber(int min, int max)
{。。。。。。
}/*****************************************************************************************************************
Function:		double			getRandomNumber					随机产生一个在[main,max]区间内的double类型
intput:		double 			min								产生随机数的下限
intput:		double			max								产生随机数的上限
return:			double			RandomNumber					返回产生的随机数
******************************************************************************************************************/
double NXOpen_GA_RectangularLayout::getRandomNumber(double min, double max)
{。。。。。。
}/*****************************************************************************************************************
Function:		void			findDuplicatePositions			查询两个vector中重复的元素并记录下其位置
intput:		vector<int> 	nums1							第一个vector
intput:		vector<int>		nums2							第二个vector
intput,output:	vector<int> 	Element							第一个与第二个重复数字集合
intput,output:	vector<int>		positions						第一个与第二个重复数字位置集合
******************************************************************************************************************/
void NXOpen_GA_RectangularLayout::findDuplicatePositions(vector<int> nums1, vector<int> nums2, vector<int> &Element, vector<int> &positions)
{。。。。。。
}/*****************************************************************************************************************
Function:		void			crossover_inner			两个个体进行交叉操作
intput,output:	vector<int> 	individual1				第一个个体
intput,output:	vector<int> 	individual2				第二个个体
intput:		int				position				要交叉的位置
******************************************************************************************************************/
void NXOpen_GA_RectangularLayout::crossover_inner(vector<int> &individual1, vector<int> &individual2, int position)
{。。。。。。
}/*****************************************************************************************************************
Function:		void					crossover			交叉操作
intput,output:	vector<vector<int>> 	Population			种群集合
intput:		double				 	PC					交叉概率	
******************************************************************************************************************/
void NXOpen_GA_RectangularLayout::crossover(vector<vector<int>> &Population, double PC)
{。。。。。。
}/*****************************************************************************************************************
Function:		void					mutation			变异操作
intput,output:	vector<vector<int>> 	Population			种群集合
intput:		double				 	PM					变异概率
******************************************************************************************************************/
void NXOpen_GA_RectangularLayout::mutation(vector<vector<int>> &Population, double PM)
{
。。。。。。
}/*****************************************************************************
Function:		void		print		打印输出信息
intput,output:	double		d			排样矩形件的面积总和
input:			bool		ISEnter		是否换行
注意:下边重载函数类似
******************************************************************************/
void NXOpen_GA_RectangularLayout::print(const double &d, bool ISEnter)
{char msg[50];sprintf(msg, "%f", d);logical response = 0;UF_UI_is_listing_window_open(&response);if (!response) UF_UI_open_listing_window();UF_UI_write_listing_window(msg);if (ISEnter) UF_UI_write_listing_window("\n");
}void NXOpen_GA_RectangularLayout::print(const char * msg, bool ISEnter)
{logical response = 0;UF_UI_is_listing_window_open(&response);if (!response) UF_UI_open_listing_window();UF_UI_write_listing_window(msg);if (ISEnter) UF_UI_write_listing_window("\n");
}void NXOpen_GA_RectangularLayout::print(const int &i, bool ISEnter)
{char msg[50];sprintf(msg, "%d", i);logical response = 0;UF_UI_is_listing_window_open(&response);if (!response) UF_UI_open_listing_window();UF_UI_write_listing_window(msg);if (ISEnter) UF_UI_write_listing_window("\n");
}
3.2运行结果

基于最低水平线算法+遗传算法的NX矩形排料-CSDN直播具体运行结果看下图所示:

动图太大上传不了,这里有视频链接,大家可以查看。

3.3结果分析

        有3.2运行结果效果图可以看出,遗传算法计算的并不是最好的,只是在有限的时间内进行相对最优的求解,与第四章中的基于最低水平线搜索策略相比总是给人的很差的感觉,这里值得说明的是,本次采用的是最低水平线法,由于相较于基于最低水平线搜索策略其存在弊端,所以避免不了,下一篇我想利用基于最低水平线搜索策略+遗传算法看一看效果。当然这里所说的效果不好只是相对的,因为我主要是思路是做一款支持设置零件间距离修改,和零件与板料间距离,以及超过最大板材高度后可以自动在另一个完整的板材上进行排料,为了效果明显,我故意设置其宽度和高度,实际的应用中并不是这样差,应该可以达到80%左右。

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

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

相关文章

vue3:树的默认勾选和全选、取消全选

实现的功能&#xff0c;上面有个选择框&#xff0c;当选中全部时&#xff0c;下方树被全选 代码&#xff1a; <template><div><el-select v-model"selectAll" style"margin-bottom: 10px;" change"handleSelectAllChange">&…

electron打包dist为可执行程序后记【electron-quick-start】

文章目录 目录 文章目录 前言 一、直接看效果 二、实现步骤 1.准备dist文件夹 2.NVM管理node版本 3.准备electron容器并npm run start 4.封装成可执行程序 1.手动下载electron对应版本的zip文件&#xff0c;解决打包缓慢问题 2.安装packager 3.配置打包命令执行内容…

嵌入式linux中利用QT控制蜂鸣器方法

大家好,今天给大家分享一下,如何控制开发板上的蜂鸣器。 第一:开发板原理图 从原理图中可以得出,当引脚输出低电平的时候,对应的蜂鸣器发出响声。 第二:QT代码详细实现 设置一个按钮,点击即可控制BEEP状态发生反转。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#in…

华为鸿蒙生态,威力估计被很多人低估了……

华为鸿蒙生态&#xff0c;威力估计被很多人低估了&#xff01;华为的鸿蒙千帆计划快成了&#xff0c;微信的加盟让计划就基本没问题了。 最近华为公布原生鸿蒙APP进度&#xff0c;在TOP5000应用里面&#xff0c;已经有4000支持了&#xff0c;不是已经开发完成&#xff0c;就是…

Electron+Vue3整合 - 开发时状态整合

说明 本文介绍一下 Electron Vue3 的整合的基本操作。实现的效果是 &#xff1a; 1、一个正常的Vue3项目&#xff1b; 2、整合加入 Electron 框架 &#xff1a;开发时 Electron 加载的是开发的vue项目&#xff1b;步骤一&#xff1a;创建vue3项目 常规操作&#xff0c;不再赘…

(C语言)fscanf与fprintf函数详解

目录 1 fprintf详解 1.1 向文件流中输入数据 1.2 向标准输入流写数据 2. fscanf函数详解 2.1 从文件中读取格式化数据 2.2 从标准输入流中读取格式化数据 1 fprintf详解 头文件&#xff1a;stdio.h 该函数和printf的参数特别像&#xff0c;只是多了一个参数stream&#…

删除word中下划线的内容

当试卷的题目直接含答案&#xff0c;不利用我们刷题。这时如果能够把下划线的内容删掉&#xff0c;那么将有利于我们复习。 删除下划线内容的具体做法&#xff1a; ①按ctrl H ②点格式下面的字体 ③选择下划线线型中的_____ ④勾选使用通配符并在查找内容中输入"?&qu…

增强现实(AR)开发框架

增强现实&#xff08;AR&#xff09;开发框架为开发者提供了构建AR应用程序所需的基本工具和功能。它们通常包括3D引擎、场景图、输入系统、音频系统和网络功能。以下是一些流行的AR开发框架。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流…

【C语言】贪吃蛇项目(2)- 实现代码详解

文章目录 前言一、游戏开始界面设计首先 - 打印环境界面其次 - 游戏地图、蛇身及食物的设计1、地图2、蛇身设置及打印3、食物 二、游戏运行环节蛇的上下左右移动等功能蛇的移动 三、结束游戏代码 前言 在笔者的前一篇博客中详细记载了贪吃蛇项目所需的一些必备知识以及我们进行…

MySQL面试题 3

问题1&#xff1a;char、varchar的区别是什么&#xff1f; varchar是变长而char的长度是固定的。如果你的内容是固定大小的&#xff0c;你会得到更好的性能。 问题2: TRUNCATE和DELETE的区别是什么&#xff1f; DELETE命令从一个表中删除某一行&#xff0c;或多行&#xff0…

上位机图像处理和嵌入式模块部署(树莓派4b实现动态插件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和上位机一样&#xff0c;我们的智能硬件如果想应用到更多的场景&#xff0c;那么势必需要实现更多的算法。这些算法和算法之间最好是松散耦合的插…

存储过程的使用(二)

目录 带 OUT 参数的存储过程 输入一个编号&#xff0c;查询数据表 emp中是否有这个编号&#xff0c;如果有返回对应员工姓名&#xff0c;如果没有&#xff0c;则提示没有对应员工 使用 EXEC 命令或者 PRINT执行含有 OUT参数的存储过程 使用 PL/SQL 块编辑程序调用含有 OUT …

智慧公厕是如何诞生的?

在城市化进程中&#xff0c;公共卫生设施的建设一直是重要议题之一。而随着科技的不断发展&#xff0c;智慧公厕作为一种创新的解决方案&#xff0c;逐渐成为了现代城市管理的亮点。那么&#xff0c;智慧公厕是如何产生的呢&#xff1f; 一、城市化进程的推动 城市人口的增加和…

排序 “壹” 之插入排序

目录 ​编辑 一、排序的概念 1、排序&#xff1a; 2、稳定性&#xff1a; 3、内部排序&#xff1a; 4、外部排序&#xff1a; 二、排序的运用 三、插入排序算法实现 3.1 基本思想 3.2 直接插入排序 3.2.1 排序过程&#xff1a; 3.2.2 代码示例&#xff1a; 3.2.3…

基于通达信---做T专用算法

什么是做T? 股票做T是股票市场中常见的一种投资策略,也就是股票进行T+0操作,通过当天买进的股票,在当天卖出,是股市中常见的一种超短线的操作。其中T就是指交易日,利用交易日中的股票涨跌来赚取差价。股票做T常见的类型就是正T和倒T。 1、正T 股票做正t就是指先买后卖,…

【Java框架】Spring框架(一)——Spring基本核心(IOC/DI)

目录 Java企业级框架企业级系统EJB概念解析EJB与Spring的恩怨情仇 Spring系统架构1. Data Access/Integration&#xff08;数据访问&#xff0f;集成&#xff09;2. Web 模块3. Core Container&#xff08;Spring 的核心容器&#xff09;4. AOP、Aspects、Instrumentation 和 M…

javaWeb项目-智能仓储系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JSP技术 JSP(Jav…

一文讲透彻Redis 持久化

文章目录 ⛄1.RDB持久化&#x1fa82;&#x1fa82;1.1.执行时机&#x1fa82;&#x1fa82;1.2.RDB原理&#x1fa82;&#x1fa82;1.3.小结 ⛄2.AOF持久化&#x1fa82;&#x1fa82;2.1.AOF原理&#x1fa82;&#x1fa82;2.2.AOF配置&#x1fa82;&#x1fa82;2.3.AOF文件…

浅谈 刷算法题时遇到运行超时异常 的解决办法

文章目录 一、背景介绍二、解决办法2.1 C/C 语言2.2 Java 语言2.2.1 ACM模式下 Java的I/O原理 三、模板详情 一、背景介绍 最近在牛客、leetcode 刷算法题时发现一个奇怪的问题&#xff0c;明明解题思路、所用算法与题解一致&#xff0c;并且在本地IDE运行是通过的&#xff0c…

【C语言__结构体__复习篇5】

目录 前言 一、结构体基础知识 1.1 结构体的语法形式 1.2 创建结构体变量 1.3 结构体变量的初始化 1.4 点(.)操作符和箭头(->)操作符 二、匿名结构体 三、结构体自引用 四、结构体内存对齐 4.1 内存对齐的规则 4.2 出现结构体内存对齐的原因 4.3 修改默认对齐数 五、结…