100分,求c++实现遗传编程
遗传算法袜侍链是吧遗传编程,哈哈, 我刚好最近写了遗传编程的。如果你需要,我可以直接发程序给你。不过先说明,我写的是用遗传算法基本步骤的,没有采用特殊的交叉和变异操作(当然,告孙对初学者可能更好,我也是初学者)。我写的是求函数最大值问题和TSP问题。我的程序谈明有注释,如果你看了还不懂,可以直接找我交流,因为程序就是我写的,嘿嘿。
MATLAB中遗传算法编程中,二进制编码如何处理实数变量?
假如你想要编码为x,设x的范围是【min,max】,二进制编码长度为10,晌腊那二进解码方式是:x*(max-min)/1023,这个不用开始编码,开始你可以用rand(n,10)产生n个样本的随机数,然后优化即可。
不是能把“数学模型中的目标函数和每一条约束函数分别编程Matlab里的M文件”,是你用遗传算法就必须要编进去,电脑怎么知道往哪个方向优化是好的尺拿,要不把你邮陵谨搭箱留下,我给你发个寻求最大值的遗传算法。
《Java遗传算法编程》pdf下载在线阅读全文,求百度网盘云资源
《Java遗传算法编程》百度网盘pdf最新全集下载:
链接:
?pwd=xv3v 提取码: xv3v
简介:本书简单、直接地介绍了遗传算法,并且针对所讨论的示例问题,给出了模袭搏Java代码的算法实现禅薯。全书分为6章。第1章简单介绍了人工智能和生物进化的知识背景,这也是遗传算法的历史知识背景。第2章给出了一个基本遗传算法的实现;第4章和第5章,分别针对机器人控制器、旅行商问题、排课问题展开分析和讨论,并给出了算法实现。在这些章的末尾,还给出旦祥了一些练习供读者深入学习和实践。第6章专门讨论了各种算法的优化问题。
跪求多项式遗传编程拟合曲线的代码!!!
多项式可用于非线性信号的拟合,关键在于求解其各项系数。对于任何非线性函数,文中提出都有一个规范化的拟合方法。相应有一个规范化的多项式。该规范化多项式是以整数n为底的幂级数,最大幂次 nmax是x坐标区间的等分数,其系数可用一个规范化的矩阵积得到。文中又给出了固体电子学中的两个应用实例。当x坐标区间分段拟合应用时,还讨论了函数及其导数计算值的连续性条件,并以正弦函数不同区间的展开为例,作了演示。
[关键词] 多项式拟合,非线性信号,规范化方法,规范化矩阵
物理或化学量之间的非线性关系已受到广泛的重视。比较广泛应用的拟合方法是最小二乘法〔1〕,还有神经网络弊祥滚法〔2〕, 遗传算法〔3〕,退火算法〔4〕等。都是针对某一实际问题采用的方法。其中最小二乘法又分为最佳拟合直线(最小二乘拟合直线,端点直线和零基准最小二乘拟合直线)和最佳多项式拟合曲线。前者的优点是用一个正比直线代替曲线给计算带来许多方便。后者的精度明显比前者高。因此精度要求比较高的场合通常采用多项式拟合。
1 基本原理
有一非线性信号y=f(x)可以用一个多项式来表示
通常取到n=4便可以是近似表达非剧变的非多极值的单值关系。即有
ε为小量。
如何得到多项式各个系数成为解决问题的关键。这就有上面所提到各种方法。对于式(2)来说,一般需要有4次测量值即曲线上的四个点(如图1所示)
方可得到 。时,便相应有
这里张量的右上角标指标代表方阶,第2个右下标则是列指标,两者相同。 取决于所测物理量的大小,与具体问题有关。因此求解便不能用一种标准化的方法。现在提出一种规范的方法,也就是说,不管什么问题, 都可以转化为一种规范化的同构矩阵及相应的逆矩阵。这为非线性的问题采用多项式拟合提供了极大的方便。
令xn=nx1 , (5)
n为整数。即有等分点被称为横坐标的缩尺。例如取n=4,则有x1=xmax/4。于是有 :
可以得到下式:
其中n=x/x1,比较式(7)和 (10)可以得到
由式(2),即 就是式(9),可见这是一种标准算法,与x物理量无关,这是本文所追求的目标。与物理量有关的仅仅是其缩尺x1。
2. 应用实例
集成电路生产中经常要使用Van der Pauw和Rymaszewsk法测定薄层电阻。前者用下式租余[5]:
于是范德堡函数可以表示为
上式的曲线如图2所示,与ASTM中的曲线(图2中虚线)十分吻合[7]。式(14)在 =1到10的范围内的精度为
3. 讨论
上面已讨论了n=5时非线性函数展开式5阶多项式的情况。取5个等分点便可以实现精确的拟合。如果已得n=8等分点上非线性函数的单值。希望多项式展开到四阶,则分成二大段展开:
同样可以应用本文所介绍的多项式进行规范化拟合。可以看出,拟合的精度取决于非线性函数自身的光滑程度以及起伏变化的大小等分点的密集程宴毁度。等分点越密集,则规范化矩阵的阶数越高,求其逆矩阵越繁琐。因此,可以进行如上面所述的分段拟合,以降低矩阵的阶数。
3.1 分段计算时接合点上的函数连续性问题
只要 矩阵元的小数点位足够精确,在分段接合点 上,函数值肯定是连续的。即有:
证明从略。
3.2 分段计算时接合点上的导数的连续性问题
由4.1讨论可知y3、y4、y5, 可以严格保持原始值,导数在 (即x4点)的连续性就取决于他们的原始分布。图3中a、b、c表示出三种情况下y3、y4、y5的分布。除了第三种情况外,第一二两种情况是在一级近似下分段计算的导数是连续的。当要求导数在接合点连续时,拟合的相邻分段就应该有部分重叠。这时y(1)和y(2)做多项式拟合时横坐标就分成5或6等分。相应展开成5阶或6阶幂级数。在接合点x4上的导数在一级近似下就可取其左右两边的导数的平均值:
因此,即使出现了图3-c情况,导数也是连续的。为了说明上述做法的可行性,下面以非线性函数sin(x)及其导数为例来加以印证。将x坐标的等分点取为 这就代表一个起伏变化的函数,有推广应用价值。现让二分段有部分重叠,用上面介绍的规范化方法分别得到二分段的多项式拟合结果:
图4示出各拟合式的曲线与sin(x)曲线的比较,以观察两者接近情况以及接合点上函数连续情况。图5示出上述拟合式的导数与sin(x)ˊ=cosx 曲线的比较。可见导数也是连续的。总之,本文所提出的方法方便,简单,拟合精度高,标准规范的特点。当拟合点多时,为降低矩阵的阶数,可以分段拟合。只要逆矩阵元的小数位足够精确,接合点上拟合式肯定连续。当两段间有部分重叠时,导数也是连续的。
参考文献
[1] 孙以材,刘玉岭,孟庆浩,压力传感器的设计制造与应用,(北京)冶金工业出版社(2000)
[2] 王伟,人工神经网络原理,北京航空航天出版社(1995)
[3] Helena Szezerbicka and Matthias Becker,Genetic Algorithms : A tool for modeling simulation and optimization of complex system . Cybernetics and systems : An International Journal , 1998 , 29 : 639-659 .
[4] 姚姚,蒙特卡洛非线性反演方法及应用,(北京)冶金工业出版社(1997).
[5] L. J. van der pauw, Philips Research Reports 13(1958), 1.
[6] Rymaszewski R., Electron. Lett. , 3 (1967), 57.
[7] ASTM F76-68,1971 Annual book,part 8,P652-668
如何用matlab遗传算法编程
有两种方法遗传编程,唯者一种是用matlab自带的遗传算法工具箱遗传编程;还有一种是自己编写遗传算法解早山镇决问题。第二陆粗种方法的话,网上可以找到很多遗传算法的matlab代码,遗传编程我也可以提供。第一种的话,有一定的局限性。
基于遗传算法路径优化C++编程
[cpp]
bool CAStar::Search(int X, int Y, std::listPOINT lResult, double dbGapBreak)
{
if(X 0 || Y 0
|| X m_dwMapWidth || Y m_dwMapWidth ||
m_dwDestinationX 0 || m_dwDestinationX 0 ||
m_dwDestinationX m_dwMapWidth || m_dwDestinationY m_dwMapHeight)
{
//_outf("坐标或地图参数错误!");
return false;
}
LPAPOINT p = new APOINT;
p-x = X;
p-y = Y;
p-parent = NULL;
p-dbGap = _p2g(X, Y, m_dwDestinationX, m_dwDestinationY);
m_lOpen.push_front(p);//历哪起始节点加入到开启列表
m_lSafe.push_back(p);/唤耐/加入到公共容器,任何新分配的节点,都要加入到这里,便于算法执行完后清理
std::listLPAPOINT::iterator it;
DWORD dwTime = clock();
while(!m_lOpen.empty())
{
//这里就是反复遍历开启列表选择距离最小的节点
it = GetMingapNode();
if((*it)-dbGap = dbGapBreak)
break;
p = *it;
GenerateSuccessors(it);
}
if(!m_lOpen.empty())
{
//如果列表不为空,从最后一个节点开始拷贝路径到返回值中
//_outf("最终寻路到:%X, %X", p-x, p-y);
POINT point;
while(p)
{
point.x = p-x;
point.y = p-y;
lResult.push_front(point);
p = p-parent;
}
}
for(it = m_lSafe.begin(); it != m_lSafe.end(); ++it)
{
//肢链码清理内存
if(*it != NULL)
{
m_pMap[(*it)-y][(*it)-x] = 1;//会被添加到m_lSafe的节点,一定是最初为1的节点,所以可以在这里恢复地图数据
delete (*it);
*it = NULL;
}
}
m_lSafe.clear();//清空容器
//_outf("耗时:%d 毫秒", clock() - dwTime);
if(m_lOpen.empty())
{
//_outf("寻路失败");
return false;
}
m_lOpen.clear();//清空开启列表
//_outf("寻路成功,节点数:%d", lResult.size());
return true;
}
bool CAStar::Search(int X, int Y, std::listPOINT lResult, double dbGapBreak)
{
if(X 0 || Y 0
|| X m_dwMapWidth || Y m_dwMapWidth ||
m_dwDestinationX 0 || m_dwDestinationX 0 ||
m_dwDestinationX m_dwMapWidth || m_dwDestinationY m_dwMapHeight)
{
//_outf("坐标或地图参数错误!");
return false;
}
LPAPOINT p = new APOINT;
p-x = X;
p-y = Y;
p-parent = NULL;
p-dbGap = _p2g(X, Y, m_dwDestinationX, m_dwDestinationY);
m_lOpen.push_front(p);//起始节点加入到开启列表
m_lSafe.push_back(p);//加入到公共容器,任何新分配的节点,都要加入到这里,便于算法执行完后清理
std::listLPAPOINT::iterator it;
DWORD dwTime = clock();
while(!m_lOpen.empty())
{
//这里就是反复遍历开启列表选择距离最小的节点
it = GetMingapNode();
if((*it)-dbGap = dbGapBreak)
break;
p = *it;
GenerateSuccessors(it);
}
if(!m_lOpen.empty())
{
//如果列表不为空,从最后一个节点开始拷贝路径到返回值中
//_outf("最终寻路到:%X, %X", p-x, p-y);
POINT point;
while(p)
{
point.x = p-x;
point.y = p-y;
lResult.push_front(point);
p = p-parent;
}
}
for(it = m_lSafe.begin(); it != m_lSafe.end(); ++it)
{
//清理内存
if(*it != NULL)
{
m_pMap[(*it)-y][(*it)-x] = 1;//会被添加到m_lSafe的节点,一定是最初为1的节点,所以可以在这里恢复地图数据
delete (*it);
*it = NULL;
}
}
m_lSafe.clear();//清空容器
//_outf("耗时:%d 毫秒", clock() - dwTime);
if(m_lOpen.empty())
{
//_outf("寻路失败");
return false;
}
m_lOpen.clear();//清空开启列表
//_outf("寻路成功,节点数:%d", lResult.size());
return true;
}
新增的SearchEx源代码如下:
nBeginSift 参数为循环初始值,nEndSift为循环结束值,其实就是一个for循环的起始值与结束值。
这个循环的引用计数,最终会被 乘于 10 来作为距离分段选择路径进行路线优化
nBeginSift 与 nEndSift的间距越大,并不表示最终路径就越好,最终优化出来的路径,还是会和地形有关。
其实最好路径优化算法是按照角度的变化来选择路径优化,但是预计开销会比较大,有了这个优化方式作为基础,你可以自己去写根据角度变化来优化的算法。
[cpp]
bool CAStar::SearchEx(int X, int Y, std::listPOINT lResult, double dbGapBreak, int nBeginSift, int nEndSift)
{
DWORD dwTime = clock();
if(!Search(X, Y, lResult, dbGapBreak))
return false;
std::listPOINT::iterator it = lResult.begin();
std::listPOINT::iterator it2 = it;
std::listPOINT l2;
for(int i = nBeginSift; i nEndSift; i++)
{
it = lResult.begin();
it2 = it;
for(;it != lResult.end(); ++it)
{
if(_p2g(it2-x, it2-y, it-x, it-y) (double)(i * 10))
{
SetDestinationPos(it-x, it-y);
l2.clear();
if(Search(it2-x, it2-y, l2, 0.0))
{
it = lResult.erase(it2, it);
lResult.insert(it, (l2.begin()), (l2.end()));
}
it2 = it;
}
}
}
_outf("耗时:%d 毫秒", clock() - dwTime);
return true;
}
bool CAStar::SearchEx(int X, int Y, std::listPOINT lResult, double dbGapBreak, int nBeginSift, int nEndSift)
{
DWORD dwTime = clock();
if(!Search(X, Y, lResult, dbGapBreak))
return false;
std::listPOINT::iterator it = lResult.begin();
std::listPOINT::iterator it2 = it;
std::listPOINT l2;
for(int i = nBeginSift; i nEndSift; i++)
{
it = lResult.begin();
it2 = it;
for(;it != lResult.end(); ++it)
{
if(_p2g(it2-x, it2-y, it-x, it-y) (double)(i * 10))
{
SetDestinationPos(it-x, it-y);
l2.clear();
if(Search(it2-x, it2-y, l2, 0.0))
{
it = lResult.erase(it2, it);
lResult.insert(it, (l2.begin()), (l2.end()));
}
it2 = it;
}
}
}
_outf("耗时:%d 毫秒", clock() - dwTime);
return true;
}