寻优算法整数
A. 求人工神经网络的具体算法,数学模型,比如求一个函数最优值之类的,不要各种乱七八糟的介绍,谢谢
神经网络就像多项式或者线性模型一样,是个看不见表达式的模型,它的表达式就是网络,它比一般模型具有更高的自由度和弹性;同时它是一个典型的黑箱模型方法;比多项式等模型还黑。优化算法,就是寻优的算法,所谓寻优过程,就是寻找使目标函数最小时(都是统一表示成寻找使函数具有最小值)的自变量的值。回归或者拟合一个模型,例如用一个多项式模型去拟合一组数据,其本质就是寻找使残差平方和最小的参数值,这就是一个寻优的过程,其实就是寻找使函数F(x)值最小时的x的值;对于这个具体的寻找过程就涉及到算法问题,就是如何计算。所谓算法,是数值分析的一个范畴,就是解这问题的方法;例如一个一元二次方程 x^2-3x+1=0的解法,因为简单可以直接求解,也可以用牛顿逐个靠近的方法求解,也即是迭代,慢慢接近真实解,如此下去不断接近真值,要注意迭代算法是涉及算法精度的,这些迭代算法是基于计算机的,算法的初衷也是用近似的算法用一定的精度来接近真实值。 比如上面的方程也可以用遗传算法来解,可以从一些初始值最终迭代到最佳解。神经网络在寻找网络的参数即权值的时候,也有寻找使训练效果最好的过程,这也是寻优的过程,这里涉及到了算法就是所谓的神经网络算法,这和最小二乘算法是一样的道理;例如做响应面的时候,其实就是二次回归,用最小二乘得到二次模型的参数,得到一个函数,求最大产物量就是求函数模型的最大值,怎么算呢?顶点处如果导数为0,这个地方对应的x值就是最优的,二次模型简单可以用偏导数=0来直接解决,这过程也可以遗传算法等来解决。说到底所谓寻优的本质就是,寻找函数极值处对应的自变量的值。
B. 智能算法参数寻优最佳适应度怎么看
SVM算法,粒子群算法,免疫算法,种类太多了,各种算法还有改进版,比如说遗传神经网络。从某本书上介绍,各种算法性能、效力等各不同,应依据具体问题选择算法。
C. 图像处理中应用的寻优算法有哪些
高级点的智能算法包括粒子算法、卡尔曼、蚁群、退火、神经网络....
常规的经典算法包括梯度、Hessian 矩阵、拉格朗日乘数、单纯形法、梯度下降法.....
还可以看一下凸优化、线性规划等等
D. 多目标优化遗传算法求解混合整数规划问题
可以参考多目标寻优遗传方法的进化思路,把遗传算法修改为针对整数规划的方法就可以
E. 求助matlab编程!!!算法寻优
你好
像这样的求最小值,可以用很多算法,可以用命令窗口编程,或者利用优化工具箱。对于初学者,可以利用optimization toolbox里面算法,只要自己写一个目标函数就可以了。
一般的有约束多变量函数都可以通过fmincon函数求解得到,但是如果初始值选取不恰当也可以可以陷入局部最优。全局最优搜索能力比较强的可能属智能算法了,如遗传算法等等下面我采用fmincon函数尝试求解:
目标函数写好好,保存为funmint.m文件,函数如下;
functionZ=funmint(x)
x1=x(1);
x2=x(2);
x3=x(3);
x4=x(4);
S1=x(5);
S2=x(6);
eg=64.11-0.043-0.49*x2-0.06*x3-0.075*x4-3.258e-4*x1*x2+9.712e-5*x1*x3...
+2.781e-4*x1*x4-4.738e-5*x2*x3-1.212e-3*x2+6.053e-4*x3*x4+...
7.775e-4*x1^2+1.125e-3*x2^2-8.665e-4*x3^2+5.89e-3*x4^2;
sd=-6.02953+0.03583*x1+0.067595*x2-2.90115e-3*x3-0.053463*x4-1.7325e-4*x1*x2+...
1.1525e-4*x1*x3-7.4375e-5*x1*x4-6.3375e-5*x2*x3+4.03125e-4*x2*x4-...
3.16562e-4*x3*x4+3.625e-6*x1^2-1.07375e-4*x2^2-2.68437e-5*x3^2-3.27344e-4*x4^2;
Z=sd+1e7*abs(-eg+0.0518*sd+S1)+1e7*abs(0.1-eg-0.0518*sd+S2);
在命令窗口中输入下面这些求解代码:
clear
lb=[60235402100];
ub=[802558029InfInf];
x0=[7024560251010];
options=optimset('Algorithm','active-set');
[x,fval]=fmincon(@funmint,x0,[],[],[],[],lb,ub,[],options)
可以得到一个最小值,以及对应的6个变量如下:
x=[62.9860 244.9435 74.5278 21.3001 1.8670 2.0691]
最小值为:
fval=3.4326
当然你也可以换用其他函数,只要把fmincon换了就可以。优化函数结构都差不多。
希望对你有帮助!
F. 粒子群优化参数寻优
研究PSO参数寻优中,采用粒子群算法对SVM的参数(惩罚参数C,核函数参数σ)进行最优选择。PSO是一种进化计算技术,由Eberhart和Kennedy于1995年提出,其思想源于鸟类捕食行为,算法的数学描述如下(何同弟等,2011):
设在一个D维搜索空间中,由有m个粒子组成的一个群体,其中第i个粒子的位置表示为向量zi=(zi1,zi2,…,ziD),i=1,2,…,m。第i个粒子的飞行速度表示为向量vi=(vi1,vi2,…,viD),其搜索的最佳位置pi=(pi1,pi2,…,piD),整个粒子群搜索到的最优位置pg=(pg1,pg2,…,pgD)。找到这两个最优位置时,各粒子根据如下公式更新自己的速度和位置:
高光谱遥感影像信息提取技术
式中:i=1,2,…,m;ψ是惯性权重函数,用来控制前面速度对当前速度的影响;c1和c2称为加速因子,为非负常数;r1和r2是[0,1]的随机数。
G. 求文档: Dijkstra 距离寻优算法程序
http://ke..com/view/7839.htm
这里讲得很详细,也有程序。要不也可以找一个《图论》方面的书,一般讲单源最短路径都会讲这个算法。
看这个文档的 例9 ,是Dijkstra算法求解最短路的例题,附有Matlab源程序。
http://lxy.sjzu.e.cn/jmzt/jpk/jch/51.doc
H. 高分求遗传算法程序
遗传算法作为一种快速有效的寻优算法,在工业控制、经济决策和交通规划等居多领域得到广泛应用。其特点就是其不同于传统的搜索寻优方式而是模拟自然界生物进化过程,通过基因的变异交叉重组使整体得到进化,不断的进化最终得到最优的组群,即最优解。
下面是一个具体实例,是小可在别人程序的基础上改写优化而成。这里首先要建立数学模型,即问题的数学公式描述,数学建模是一门对数学能力有相当要求的课程,一个人的数学能力往往决定其从事工作的层次。下面的程序是求多项式y=x^6-10x^5-26x^4+344x^3+193x^2-1846x-1680在区间[-8,8]的最小值,误差不超过0.001。对于这个复杂的多项式,可先用matlab绘制函数的大概曲线,确认函数的最小值大概处于[-8,8]之间,再用本程序求出精确解。
程序已在Dev-c++下运行通过,结果正确。
如有什么疑问,给我消息。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define SUM 20 /* 总共的染色体数量 */
#define MAXloop 1200 /* 最大循环次数 */
#define error 0.01 /* 若两次最优值之差小于此数则认为结果没有改变 */
#define crossp 0.7 /* 交叉概率 */
#define mp 0.04 /* 变异概率 */
struct gen /* 定义染色体结构 */
{
int info;
double suitability;
};
struct gen gen_group[SUM];/* 定义一个含有20个染色体的组 */
struct gen gen_new[SUM];
struct gen gen_result; /* 记录最优的染色体 */
int result_unchange_time; /* 记录在error前提下最优值未改变的循环次数 */
struct log /* 形成链表,记录每次循环所产生的最优的适应度 */
{
double suitability;
struct log *next;
}llog,*head,*end;
int log_num; /* 链表长度 */
void initiate(); /*初始化函数*/
void evaluation(int flag); /*适应度评估和排序函数*/
void cross(); /*交叉函数*/
void selection(); /*选择函数*/
int record(); /*记录每次最优解和判断循环是否终止*/
void mutation(); /*变异函数*/
void showresult(int); /*显示结果*/
int randsign(double p); /*按概率p产生0,1随机数,p表示产生值1的概率*/
int randbit(int i,int j);/*产生i,j间的随机整数*/
int randnum(); /*随机产生14个位(基因)组成的染色体*/
int convertionD2B(double x); /*编码*/
double convertionB2D(int x); /*解码*/
int createmask(int a); /*交叉操作*/
int main()
{
int i,flag;
flag=0;
initiate();
evaluation( 0 );
for( i = 0 ; i < MAXloop ; i++ )
{
cross();
evaluation( 1 );
selection();
if( record() == 1 )
{
flag = 1;
break;
}
mutation();
}
showresult( flag );
system("pause");
return 0
}
void initiate()
{
int i , stime;
long ltime;
ltime=time(NULL);
stime=(unsigned)ltime/2;
srand(stime);
for( i = 0 ; i < SUM ; i++ )
{
gen_group[i].info = randnum();
}
gen_result.suitability=1000;
result_unchange_time=0;
head=end=(struct log *)malloc(sizeof(llog));
if(head==NULL)
{
printf("\n内存不够!\n");
exit(0);
}
end->next = NULL;
log_num = 1;
}
void evaluation(int flag)
{
int i,j,k;
struct gen *genp;
int gentinfo;
double gentsuitability;
double x;
if( flag == 0 )
genp = gen_group;
else genp = gen_new;
for(i = 0 ; i < SUM ; i++)/* 计算各染色体对应的表达式值 */
{
x = convertionB2D( genp[i].info );
genp[i].suitability = x*(x*(x*(x*(x*(x-10)-26)+344)+193)-1846)-1680;
}
for(i = 0 ; i < SUM - 1 ; i++)/* 按表达式的值进行排序 */
{ k=i;
for(j = i + 1 ; j < SUM ; j++)
if( genp[i].suitability > genp[j].suitability ) k=j;
if( k!=i )
{
gentinfo = genp[i].info;
genp[i].info = genp[k].info;
genp[k].info = gentinfo;
gentsuitability = genp[i].suitability;
genp[i].suitability = genp[k].suitability;
genp[k].suitability = gentsuitability;
}
}
}
void cross()
{
int i , j , k ;
int mask1 , mask2;
int a[SUM];
for(i = 0 ; i < SUM ; i++) a[i] = 0;
k = 0;
for(i = 0 ; i < SUM ; i++)
{
if( a[i] == 0)
{
for( ; ; )/* 随机找到一组未进行过交叉的染色体与a[i]交叉 */
{
j = randbit(i + 1 , SUM - 1);
if( a[j] == 0) break;
}
if(randsign(crossp) == 1)
{
mask1 = createmask(randbit(0 , 14-1));
mask2 = ~mask1;
gen_new[k].info = (gen_group[i].info) & mask1 + (gen_group[j].info) & mask2;
gen_new[k+1].info=(gen_group[i].info) & mask2 + (gen_group[j].info) & mask1;
k = k + 2;
}
else
{
gen_new[k].info=gen_group[i].info;
gen_new[k+1].info=gen_group[j].info;
k=k+2;
}
a[i] = a[j] = 1;
}
}
}
void selection()
{
int i , j , k;
j = 0;
i = SUM/2-1;
if(gen_group[i].suitability < gen_new[i].suitability)
{
for(j = 1 ; j < SUM / 2 ; j++)
{
if(gen_group[i+j].suitability > gen_new[i-j].suitability)
break;
}
}
else
if(gen_group[i].suitability>gen_new[i].suitability)
{
for(j=-1;j>-SUM/2;j--)
{
if(gen_group[i+j].suitability<=gen_new[i-j].suitability)
break;
}
}
for(k=j;k<SUM/2+1;k++)
{
gen_group[i+k].info = gen_new[i-k].info;
gen_group[i+k].suitability = gen_new[i-k].suitability;
}
}
int record()
{
double x;
struct log *r;
r=(struct log *)malloc(sizeof(llog));
if(r==NULL)
{
printf("\n内存不够!\n");
exit(0);
}
r->next = NULL;
end->suitability = gen_group[0].suitability;
end->next = r;
end = r;
log_num++;
x = gen_result.suitability - gen_group[0].suitability;
if(x < 0)x = -x;
if(x < error)
{
result_unchange_time++;
if(result_unchange_time >= 20)return 1;
}
else
{
gen_result.info = gen_group[0].info;
gen_result.suitability = gen_group[0].suitability;
result_unchange_time=0;
}
return 0;
}
void mutation()
{
int i , j , k, m;
double x;
double gmp;
int gentinfo;
double gentsuitability;
gmp = 1 - pow(1 - mp , 11);/* 在基因变异概率为mp时整条染色体的变异概率 */
for(i = 0 ; i < SUM ; i++)
{
if(randsign(gmp) == 1)
{
j = randbit(0 , 14);
m = 1 << j;
gen_group[i].info = gen_group[i].info^m;
x = convertionB2D(gen_group[i].info);
gen_group[i].suitability = x*(x*(x*(x*(x*(x-10)-26)+344)+193)-1846)-1680;
}
}
for(i = 0 ; i < SUM - 1 ; i++)
{ k=i;
for(j = i + 1 ; j < SUM ; j++)
if(gen_group[i].suitability > gen_group[j].suitability) k=j;
if(k!=i)
{
gentinfo = gen_group[i].info;
gen_group[i].info = gen_group[k].info;
gen_group[k].info = gentinfo;
gentsuitability = gen_group[i].suitability;
gen_group[i].suitability = gen_group[k].suitability;
gen_group[k].suitability = gentsuitability;
}
}
}
void showresult(int flag)/* 显示搜索结果并释放内存 */
{
int i , j;
struct log *logprint,*logfree;
FILE *logf;
if(flag == 0)
printf("已到最大搜索次数,搜索失败!");
else
{
printf("当取值%f时表达式达到最小值为%f\n",convertionB2D(gen_result.info),gen_result.suitability);
printf("收敛过程记录于文件log.txt");
if((logf = fopen("log.txt" , "w+")) == NULL)
{
printf("Cannot create/open file");
exit(1);
}
logprint=head;
for(i = 0 ; i < log_num ; i = i + 5)/* 对收敛过程进行显示 */
{
for(j = 0 ; (j < 5) & ((i + j) < log_num-1) ; j++)
{
fprintf(logf , "%20f" , logprint->suitability);
logprint=logprint->next;
}
fprintf(logf,"\n\n");
}
}
for(i = 0 ; i< log_num ; i++)/* 释放内存 */
{
logfree=head;
head=head->next;
free(logfree);
}
fclose(logf);
getch();
}
int randsign(double p)/* 按概率p返回1 */
{
if(rand() > (p * 32768))
return 0;
else return 1;
}
int randbit(int i, int j)/* 产生在i与j之间的一个随机数 */
{
int a , l;
l = j - i + 1;
a = i + rand() * l / 32768;
return a;
}
int randnum()
{
int x;
x = rand() / 2;
return x;
}
double convertionB2D(int x)
{
double y;
y = x;
y = (y - 8192) / 1000;
return y;
}
int convertionD2B(double x)
{
int g;
g = (x * 1000) + 8192;
return g;
}
int createmask(int a)
{
int mask;
mask=(1 << a) - 1;
return mask;
}
I. 什么是二进制整数和二进制实数
二进制整数 1. This paper introces a new program method——segment disposal,it can convert binary integer to decimal integer fleetly. 介绍了一种新型高速的二进制整数转化为十进制数的程序设计方法——分段处理。 2) dyadic 二进 1. The basic conception of dyadic wavelet transform is introced The practical expression of dyadic discrete wavelet transform of digital signal is presented. 介绍了二进小波变换的基本概念 ,给出了数字信号二进离散小波变换的实用表达式 .解释了二进离散小波分析的工程实现方法和变换过程 .给出了应用实 3) law with 2 二进律 4) binary system 二进制 1. Computers need numerical value change between binary system,octal system and decimal system The fortran77 is used in the programming to perform the numerical value converting. 计算机需要数制转换,计算机内部使用二进制,二进制八进制十进制之间的数制转换,FORTRAN77编制,围绕二进制与小数,完成二进制八进制十进制之间的数制转换 2. It transferred the identity matrix in common use into the binary system. 应用BP算法对转子进行故障诊断 ,首先论述了BP算法的基本原理 ,然后提出了输出模式矩阵的改进方法 ,即将常用的单位矩阵来表示的故障模式转变为二进制结构 ,由此简化了网络结构 ,明显减少了样本训练次数 ,提高了计算故障诊断中对单一故障尤为有效 .最后通过实例进行分析 ,证明这一方法对提高运算速度十分有效 3. This paper suggested a steady water supplying method With this method,a water supplying system can be designed of several pumps in parallel The pumps work on the principle of binary system,so the water supplying system works well The water pressure is stead 本方法构造的给水系统由M台水泵并联运行,M台水泵的额定扬程相同,额定流量呈二倍递变,以数字1表示水泵工作,以数字0表示水泵停止工作,则M台水泵组合工作状态可用一个M位的二进制数表达,该数还代表水泵组合出水流量。 5) Binary 二进制 1. The algorithm utilizes two important strategies,how to select the item based on its average value and the binary particle swarm optimization algorithm,55 multidimensional 0-1 knapsack test instances are tested by the proced algorithm,all instances achieve optimum solutions. 提出了一种求解多维0-1背包问题的混合粒子群算法,算法使用了两个主要的思想策略,即依据物品单位容积价值的高低选择物品的贪婪策略和基于二进制编码的粒子群算法.用提出的算法,对55个测试算例进行了测试,得到了全部算例的最优解.测试结果表明,提出的混合粒子群算法求解多维0-1背包问题,计算结果的优度高,时间短,是求解此问题的有效算法 2. Because the binary and gray coding modes themselves have defects in poor function of "fin. 对照分析了遗传算法三种不同的编码方式对模拟计算结果的影响,并用简例对其进行了验证.结果表明,二进制编码的误差最大,格雷数编码的准确度虽有改进,但仍然很大,采用了浮点数编码后,大大提高了模拟结果的准确度.这是由于二进制和格雷数编码本身存在“微调”功能贫乏的缺陷,不适应处理这类问题,浮点数编码克服了它们的缺陷,从而大大提高了模拟的准确度 3. The binary improved particle swarm optimization(PSO) algorithm for knapsack problem is brought forward,and the detailed realization of the algorithm is illustrated. 提出了用于求解0 1背包问题的二进制编码的粒子群算法,阐明了该算法求解背包问题的具体实现过程.为了提高粒子群算法的收敛速度,在传统的二进制编码的粒子群算法中嵌入了记忆功能.通过对其他文献中仿真实例的计算和结果比较,表明该算法在寻优能力、计算速度和稳定性方面都超过了文献中提到的遗传算法和模拟退火算法.提出的求解背包问题的二进制改进粒子群算法,同样可以应用于其他离散优化问题
J. 偏移(shift)对优化算法寻优的影响
对函数进行旋转,最优点的位置并没有改变;
对函数进行偏移,最优点的位置变了。
旋转偏移操作,整个坐标位置也全都改变,对寻优算法有个旋转不变性的考验。