数学建模之遗传算法
文章目录
- 前言
- 遗传算法
- 算法思想
- 生物的表示
- 初始种群的生成
- 下一代种群的产生
- 适应度函数
- 轮盘赌
- 交配
- 变异
- 混合产生新种群
- 停止迭代的条件
- 遗传算法在01背包中的应用
- 01背包问题介绍
- 01背包的其它解法
- 01背包的遗传算法解法
- 生物的表示
- 初始种群的生成
- 下一代种群的产生
- 适应度函数
- 轮盘赌
- 交配
- 变异
- 混合产生新种群
- 停止迭代的条件
- 一个优化
- 代码
- 遗传算法的优缺点
- 优点
- 可以全局搜索
- 适用范围广
- 缺点
- 参数调节困难
- 可能陷入局部最优
- 遗传算法的时间复杂度
- 总结
前言
遗传算法是美国教授Holland于1975年提出的一种基于模仿生物遗传学的优化算法。这种算法很难得到问题的精确答案,但是能够在允许的时间复杂度内得到一个较优的答案。常用来解决一些目前不存在多项式算法的问题,如旅行商问题(TSP问题),背包问题。
遗传算法
算法思想
我们假设在自然界中,存在一个种群。根据达尔文的生物进化论,生物会进行交配和变异,从而慢慢进化。而我们的目标,就是让这群生物往我们希望的方向进化,进化得越来越优秀。而通过数代进化之后,最优秀的那个个体,就是我们问题的解。
生物的表示
在实际问题中,我们用一个n位的01二进制串来表示一个生物。每一位取0或1,表示一个信息。比如,在01背包问题中,一共有n个物品。可以用第i位取1表示取第i个物品,取0表示不取第i个物品。这样,一个方案就可以用一个生物来表示。一个种群包含很多个生物,于是,一个种群可以理解为很多个方案。而我们的目标,就是要选出最优的一个方案。
初始种群的生成
初始种群的生成,可以用随机数来生成。每一位随机取0或1,就可以生成初始种群。当然,这样生成的初始生物可能不太好,我们可以通过贪心思想等生成一些较为优良的初始生物,以提升算法准确度。
下一代种群的产生
生成完初始种群之后,我们需要生成下一代种群。为了比较生物的优劣,我们需要定义适应度函数。
适应度函数
适应度函数是根据实际问题,自己定义的一个函数,较优的方案具有较高的适应度,较差的方案拥有较低的适应度。本文用 f ( x i ) f(x_i) f(xi)表示第i个生物的适应度。
轮盘赌
为了产生下一代,我们需要选择两个生物作为父母,使其进行交配。那么,如何选择生物呢?常用的一个方法是轮盘赌。即第i个生物被选中的概率为 f ( x i ) ∑ i = 1 n f ( x i ) \frac{f(x_i)}{\sum_{i=1}^{n}{f(x_i)}} ∑i=1nf(xi)f(xi)。为什么这个方法被称为轮盘赌呢,是因为其指导思想是将每个生物按照其适应度在轮盘上分配位置,适应度越大,分配到的位置越大。然后转动轮盘,指针指到哪里,就抽到哪个生物。这样做的有点在于适应度越高的生物被选中的概率越大,越有可能保留优良基因。让优秀的基因传承下去,才能使得种群总体适应度越来越高。
交配
我们通过轮盘赌选择了两个生物,现在要让它们生成一个新的生物。也就是说,我们要用两个长度为n的01串 x i x_i xi和 x j x_j xj,生成一个新的长度为n的01串。我们的做法是产生一个1~n-1的随机数,记为y。用 x i x_i xi的1~y位和 x j x_j xj的y+1~n位组成一个新的01串。这个新的01串就是 x i x_i xi和 x j x_j xj的孩子。
变异
由于初始种群的随机度较高,可能无法通过交配产生一些生物。为了丰富生物多样性,我们需要以适当的概率对生物进行变异。通常采用的变异方法是以固定的变异率对生物的某一位进行取反操作。一般变异率保持在0.2左右。
混合产生新种群
通过交配和变异,我们产生了一个新个体。下一代的新种群由这一代的部分个体和下一代的新个体按某种比例混合产生。一般是由20%的这一代生物和80%的新产生 的生物组成。
停止迭代的条件
随着一代一代的新种群产生,生物的总体适应度也将越来越高。我们需要一个停止迭代的条件,一般有两种。第一种是按照固定的迭代次数进行,比如10000次。第二种是比较相邻两代中的平均适应度,如果平均适应度的增加小于一个我们规定的值,那么就可以停止迭代了。我们选取最后一代中最优秀的生物作为我们的最终方案。
遗传算法在01背包中的应用
我们举个具体的例子,来看一看遗传算法在实际问题中的应用。
01背包问题介绍
假设背包的容量为m,有n个物品,第i物品的重量为 w [ i ] w[i] w[i],价值为 v [ i ] v[i] v[i],我们要从中选取一些物品放入背包,在不超过背包容量的前提下,使装入背包的物品总价值最高。
01背包的其它解法
01背包的标准解法是利用动态规划算法进行解决,时间复杂度为 O ( n m ) O(nm) O(nm),空间复杂度为 O ( m ) O(m) O(m)。但是,使用动态规划算法的前提是, m m m为整数,且 w [ i ] w[i] w[i]均为整数。对于更一般的01背包问题,目前没有找到多项式时间的解法,是一个NP难问题。而对于这样一类问题,遗传算法就非常适用。遗传算法虽然不能给出一个精确解,但是能在可接受的时间范围内给出一个较优的答案。
01背包的遗传算法解法
通过遗传算法,可以让算法的时间复杂度与背包容量 m m m无关。并且可以应对 m m m不是整数的情况。
生物的表示
我们用 c [ i ] c[i] c[i]表示一个01串,代表第i个生物。 c [ i ] [ j ] c[i][j] c[i][j]表示第i个生物的第j位是1还是0。对应到01背包问题,就表示第i种方案的第j个物品选或不选。
初始种群的生成
我们首先对于所有物品,按照性价比(即 v [ i ] / w [ i ] v[i]/w[i] v[i]/w[i])从高到低进行排序。然后我们随机生成一个长度为n的01串。由于随机生成0和1的方案不一定能满足背包容量的要求。所以我们基于贪心思想,把一个随机01串改造成符合背包容量的01串。在产生的随机方案的基础上,从性价比最高的物品开始,如果随机方案选了,且选择之后背包容量没有超,则选取该物品,否则不选该物品。但是通过这种方式,背包可能有剩余容量,于是我们再次从性价比最高的物品开始,如果我们的方案没有选择它,且选择它之后没有超出背包容量,那么我们就把它加入背包。通过这种基于贪心的选择方式,可以生成一系列较优的初始方案。这些方案组成了初始种群。
下一代种群的产生
适应度函数
每个生物的适应度应该与该方案的总价值相关,总价值越大,适应度越高。我们一般有几种不同的适应度函数。第一种直接用总价值来表示适应度,即 f ( x i ) = ∑ j = 1 n c [ i ] [ j ] ∗ v [ j ] f(x_i)=\sum_{j=1}^{n}{c[i][j]*v[j]} f(xi)=∑j=1nc[i][j]∗v[j]。第二种为了使后面的轮盘赌能更大程度区分优秀方案和劣质方案,用该方案的总价值减去这一代方案中最低的总价值来表示适应度,即 f ( x i ) = ∑ j = 1 n c [ i ] [ j ] ∗ v [ j ] − m i n { ∑ j = 1 n c [ i ] [ j ] ∗ v [ j ] } f(x_i)=\sum_{j=1}^{n}{c[i][j]*v[j]}-min\{\sum_{j=1}^{n}{c[i][j]*v[j]}\} f(xi)=∑j=1nc[i][j]∗v[j]−min{∑j=1nc[i][j]∗v[j]}。
轮盘赌
我们通过轮盘赌的方法选取两个方案,来产生下一个方案。在轮盘赌中,每个方案被选择的概率为 f ( x i ) ∑ i = 1 n f ( x i ) \frac{f(x_i)}{\sum_{i=1}^{n}{f(x_i)}} ∑i=1nf(xi)f(xi)。通过生成随机数,来选择两个方案。
交配
通过轮盘赌,选择了两个方案,假设为第 a a a个和第 b b b个方案,假设新产生的方案为d,在1~n-1中产生的随机数为 z z z,那么
d [ j ] = { c [ a ] [ j ] 1 ≤ j ≤ z c [ b ] [ j ] z + 1 ≤ j ≤ n d[j]=\begin{cases} c[a][j] & 1\leq j \leq z \\ c[b][j] & z+1 \leq j \leq n \end{cases} d[j]={c[a][j]c[b][j]1≤j≤zz+1≤j≤n
如果该方案不满足背包容量的要求,就重新用轮盘赌选择两个方案,重新生成新的方案。
变异
我们设定变异率为一个常数,对新产生的方案进行变异。我们生成一个0~1的随机数,若这个随机数小于变异率,那么就进行变异。我们再生成一个1~n的随机数 z z z,表示对新方案的第 z z z位进行取反操作。即
d [ j ] = { d [ j ] j ≠ z 1 − d [ j ] j = z d[j]=\begin{cases} d[j] & j\not=z \\ 1-d[j] & j=z \end{cases} d[j]={d[j]1−d[j]j=zj=z
混合产生新种群
我们通过轮盘赌,将20%的这一代的方案和80%的新产生的方案混合在一起,组成新一代的方案。值得说明的是,需要将每一代产生的最优方案记录下来。
停止迭代的条件
我们固定一个迭代次数,运行完之后,我们记录的最优秀的方案就是我们程序的运行结果。由于程序的随机性较高,所以一般重复多次运行程序,取最优结果作为我们的最终答案。对于迭代次数、变异率、种群大小等常数,需要根据实际情况灵活选取,在保证准确率的情况下,使得程序运行效率较高。
一个优化
由于算法随机性较高,有一些非常优秀的方案可能不一定能够保存下来。所以我们采用优先队列,人为把每一代中最优秀的两个方案保存下来,放到下一代中。对于这个问题,也有很多人在研究,可能也存在很多更合理的优化。这里只是选取了一个能够大大提升算法准确性的优化。
代码
下面是我用遗传算法写的01背包问题的C++代码
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<queue>
#include<vector>
using namespace std;
int n,m,w[10005],v[10005];
vector<bool> c[105];
double d[105];
const int populationSize = 20;//设定种群大小为20
const int generations = 10000;//设定迭代次数为10000
double mutationRate = 0.3;//设定变异率为0.3
vector<bool> q;
int num=0;
bool check(vector<bool> &a)//对于一个方案,验证其是否超过背包容量
{int s=0;for (int i=0;i<n;i++) s+=a[i]*w[i];return s<=m;
}
double jisuan(vector<bool> &a)//计算给定方案的总价值
{if (!check(a)) return 0;//若该方案超出背包容量,则价值为0 double s=0,t=0;for (int i=0;i<n;i++) {s+=a[i]*v[i];t+=a[i]*w[i];}return s;
}
vector<bool> jiaocha(vector<bool> &a,vector<bool> &b)//对于两个方案,进行交叉
{int x=rand()%n;vector<bool> t;for (int i=0;i<x;i++) t.push_back(a[i]);for (int i=x;i<n;i++) t.push_back(b[i]);return t;
}
void bianyi(vector<bool> &a)//对于一个方案,进行变异
{double x=rand()/double(RAND_MAX);double y; if (x<mutationRate) {y=rand()%n;a[y]=!a[y];}
}
int lunpandu()//通过轮盘赌,选出一个方案的编号
{double x=rand()/double(RAND_MAX);for (int i=1;i<=populationSize;i++){if (d[i]>=x) return i;}return populationSize;
}
struct Compare { //根据方案价值的高低来在优先队列中排序 bool operator()(vector<bool>& a,vector<bool>& b) { return jisuan(a) < jisuan(b); }
};
int main()
{srand(time(NULL));cin>>m>>n;//m表示背包容量,n表示物品数量 for (int i=0;i<n;i++){cin>>w[i]>>v[i];//w[i]表示物品重量,v[i]表示物品价值 }for (int i=0;i<n;i++)//对所有物品关于性价比从高到低进行排序 {for (int j=0;j<n-i;j++){if ((double)v[j]/w[j]<(double)v[j+1]/w[j+1]){int t=v[j];v[j]=v[j+1];v[j+1]=t;t=w[j];w[j]=w[j+1];w[j+1]=t;}}}int ans=0;for (int k=1;k<=10;k++) //程序重复运行10次 {num=0; srand(time(NULL));for (int i=1;i<=populationSize;i++)//生成初始种群 {c[i].clear();for (int j=0;j<n;j++) c[i].push_back(rand()%2);//生成随机01串 int weight=0;for (int j=0;j<n;j++) {if (weight+c[i][j]*w[j]<=m) weight+=c[i][j]*w[j];//若加入该物品后背包重量没有超,就加入该物品 else c[i][j]=0;}for (int j=0;j<n;j++)//背包还有剩余空间,可以再加入一些物品 {if (c[i][j]==0&&weight+w[j]<=m) {c[i][j]=1;weight+=w[j];}}}priority_queue<vector<bool>, vector<vector<bool> >, Compare> p;//定义优先队列 vector<bool> x;for (int i=1;i<=generations;i++){while (!p.empty()) p.pop();//清空优先队列 double s=0,zuixiaozhi=1000000;bool b=0;for (int j=1;j<=populationSize;j++) {if (j==1) //把上一代最优的方案加入优先队列 {p.push(c[j]);b=1;}if (b==1&&c[j]!=p.top()) //把上一代次优的方案加入优先队列 {p.push(c[j]); b=0;}d[j]=jisuan(c[j]);if (d[j]<zuixiaozhi) zuixiaozhi=d[j];s+=d[j];}s-=zuixiaozhi*populationSize;for (int j=1;j<=populationSize;j++) d[j]=d[j-1]+(d[j]-zuixiaozhi)/s;//d[j]表示第j个方案在轮盘赌中被选中的概率 for (int j=1;j<=populationSize;j++)//产生下一代 {int x1=lunpandu(),x2=lunpandu();//根据轮盘赌,选择两个方案 x=jiaocha(c[x1],c[x2]);//两个方案进行交叉 bianyi(x);//对新得到的方案进行变异 p.push(x);//把新得到的方案加入优先队列 }for (int j=1;j<=populationSize&&!p.empty();j++)//把较优的一些方案作为下一代,从而继续产生下下代 {c[j]=p.top();p.pop();}}for (int i=1;i<=populationSize;i++)//把最优的方案记录下来 {if (check(c[i])){cout<<k<<' '<<jisuan(c[i])<<"\n";//输出第k次的最优值 if (jisuan(c[i])>ans) ans=jisuan(c[i]);break;}}}cout<<ans;//输出10次的最优值
}
遗传算法的优缺点
优点
可以全局搜索
由于遗传算法的多样性搜索性质,它可以在搜索空间内找到许多可能的解,于是可以在较短时间内全局最优或近似最优的解。
适用范围广
作为一种优化算法,它的适用范围非常广,可以基于初始解,产生近似最优解。而且可以人为定义适应度,可以应用于一些难以定量的问题。
缺点
参数调节困难
该算法中有多个参数,比如种群大小,迭代次数,变异率等。如何通过修改参数使得能取得更优秀的解,是一个比较困难的问题。
可能陷入局部最优
若父代的相似度较高,则产生的子代相似度也很可能较高,从而使得陷入局部最优。
遗传算法的时间复杂度
设迭代次数为G,种群规模为P,01串长度为n,则不加任何优化的遗传算法的时间复杂度为 O ( G P n ) O(GPn) O(GPn)。G和P都是人为控制的参数。通过这种方法,把原来的 O ( 2 n ) O(2^n) O(2n)的时间复杂度降为了关于n的线性表达式,这已经是一个极大的进步了。
总结
遗传算法主要应用于一些不存在多项式算法的问题,使得在较短时间内能够得到较优的答案。但要得到真正最优的解还是有一定困难的。遗传算法在数学建模方面也有着广泛的应用,比如用于函数的求最值等问题。
相关文章:
数学建模之遗传算法
文章目录 前言遗传算法算法思想生物的表示初始种群的生成下一代种群的产生适应度函数轮盘赌交配变异混合产生新种群 停止迭代的条件遗传算法在01背包中的应用01背包问题介绍01背包的其它解法01背包的遗传算法解法生物的表示初始种群的生成下一代种群的产生适应度函数轮盘赌交配…...
ISO9001认证常见的不符合项
今天,整理了一些关于ISO9001质量管理体系审核最常见的不合格项,以供大家参考。 一、质量管理体系 1、质量手册(标准条款4.2.2) (1)各部门执行的文件与手册的规定不一致。 (2)质量…...

crypto:看我回旋踢
题目 下载压缩包后解压可得到提示文本 经过观察,synt{}这个提示与flag{}形式很像 由题目名中的回旋可以推测为凯撒密码,由凯撒密码的定义可知,需要先推出移位数,s->f数13次,因此移位数为13,解码可得...

Springcloud实战之自研分布式id生成器
一,背景 日常开发中,我们需要对系统中的各种数据使用 ID 唯一表示,比如用户 ID 对应且仅对应一个人,商品 ID 对应且仅对应一件商品,订单 ID 对应且仅对应 一个订单。我们现实生活中也有各种 ID ,比如身…...

java 企业工程管理系统软件源码 自主研发 工程行业适用
工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…...

Spring Cloud Alibaba Nacos 2.2.3 (4) - 本地源码编译 调试
下载nacos nacos在GitHub上有下载地址:https://github.com/alibaba/nacos/releases,可以选择任意版本下载。 我下载的是2.2.3 版本 导入idea mvn 安装包 1,切换到Terminal ,并且使用command prompt模式 2,执行 mvn -Prelease…...

WKB近似
WKB方法用于研究一种特定类型的微分方程的全局性质 很有用这种特定的微分方程形如: 经过一些不是特别复杂的推导,我们可以得到他的WKB近似解。 该近似解的选择取决于函数和参数的性质同时,我们默认函数的定义域为当恒大于零,时: 当…...

LeetCode算法二叉树—108. 将有序数组转换为二叉搜索树
目录 108. 将有序数组转换为二叉搜索树 代码: 运行结果: 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不…...
如何设置 Git 短命令
设置 Git 短命令 对喜欢敲命令而不用图形化工具的爱好者来说,设置短命令可以很好的提高效率。下面介绍两种设置短命令的方式。 方式一 git config --global alias.ps push方式二 打开全局配置文件 vim ~/.gitconfig写入内容 [alias] co checkoutps pushpl p…...

virtualbox无界面打开linux虚拟机的bat脚本,以及idea(代替Xshell)连接linux虚拟机的方法
virtualbox无界面打开linux虚拟机的bat脚本,以及idea连接linux虚拟机的方法 命令行运行代码成功运行的效果图 idea连接linux虚拟机的方法【重要】查看虚拟机的IP地址idea中选择菜单(该功能可代替Xshell软件)配置设置连接成功进入idea中的命令…...
mockito 的 InjectMocks 和 Mock 有什么区别?
InjectMocks 和 Mock 是 Mockito 框架中用于测试的注解,用于创建和管理模拟对象(mocks)的不同方式。它们有以下区别: InjectMocks: InjectMocks 用于注入模拟对象(mocks)到被测试对象…...
网络工程师的爬虫技术之路:跨界电商与游戏领域的探索
随着数字化时代的到来,跨界电商和游戏行业成为了网络工程师们充满机遇的领域。这两个领域都依赖于高度复杂的技术来实现商业目标和提供卓越的用户体验。本文将深入探讨网络工程师在跨界电商和游戏领域的技术挑战以及应对这些挑战的方法。 突破技术障碍的爬虫应用 …...

【TCP】确认应答 与 超时重传
确认应答 与 超时重传 一. 确认应答机制二. 超时重传机制 一. 确认应答机制 确认应答: 保障可靠传输的核心机制。 可靠传输: 不是指传输过去的数据不出错, 也不是指数据一定能传输过去,而是指发送方能够知道接收方是否接收到了数据。确认应答的关键就是接收方收到数…...

Kubernetes中Pod的扩缩容介绍
Kubernetes中Pod的扩缩容介绍 在实际生产系统中,我们经常会遇到某个服务需要扩容的场景,也可能会遇到由于资源紧张或者工作负载降低而需 要减少服务实例数量的场景。此时可以利用 Deployment/RC 的 Scale 机制来完成这些工作。 Kubernetes 对 Pod 的扩…...

vue点击pdf文件直接在浏览器中预览文件
好久没有更新文章了,说说为什么会有这篇文章呢,其实是应某个热线评论的要求出的,不过由于最近很长一段时间没打开csdn现在才看到,所以才会导致到现在才出。 先来看看封装完这个预览方法的使用,主打一个方便使用&#x…...

通讯网关软件012——利用CommGate X2OPC实现MS SQL数据写入OPC Server
本文推荐利用CommGate X2OPC实现从MS SQL服务器获取数据并写入OPC Server。CommGate X2OPC是宁波科安网信开发的网关软件,软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示,实现从MS SQL数据库获取数据并写入OPC Server。 【…...

ISE_ChipScope Pro的使用
1.ChipScope Pro Core Inserter 使用流程 在之前以及编译好的流水灯实验上进行学习 ChipScope的使用。 一、新建一个ChipScope 核 点击Next,然后在下一个框中选择 Finish,你就会在项目菜单中看到有XX.cdc核文件。 二、对核文件进行设置 右键“Synthesize – XST” …...

北邮22级信通院数电:Verilog-FPGA(2)modelsim北邮信通专属下载、破解教程
北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 1.下载 2.解压打开 3.modelsim初安装 4.…...

【力扣-每日一题】213. 打家劫舍 II
class Solution { public:int getMax(int n,vector<int> &nums){int a0,bnums[n],c0;for(int in1;i<nums.size()n-1;i){ //sizen-1,为0时,第一个可以偷,最后一个不能偷size-1;n为1时,最后一个可偷,计算…...

【PDF】pdf 学习之路
PDF 文件格式解析 https://www.cnblogs.com/theyangfan/p/17074647.html 权威的文档: 推荐第一个连接: PDF Explained (译作《PDF 解析》) | PDF-Explained《PDF 解析》https://zxyle.github.io/PDF-Explained/ https://zxyle…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...