半变异函数拟合指数模型

合集下载

半变异函数(第一部分)

半变异函数(第一部分)

半变异函数(第一部分)
半变异函数是概率论中一种重要的概率分布。

它属于正态分布的一种变形,属于一类非对称性的分布。

半变异函数的形式是:y = (2/σ√2π) (1+x2/σ2) -1/2 α,其中σ代表标准差,α 代表偏度参数。

4个参数的半变异函数关系性更加紧密,根据参数的不同,它的几何形状形可能会发生改变,这也是其它变异函数的不同之处。

半变异函数有若干重要的特点。

其中,分布的峰值与基线均出现在分布的中心位置,与正态分布在两端出现最大值不同。

并且,它还具有较宽的左右两侧分布,使得半变异性分布在极端情况下也更具有延展性。

此外,半变异函数可用来选择特定的观测值,可应用于差异分析,还能够表征观测值的非线性特征,从而能够更准确地反映数据中存在的模式。

半变异函数经过长期发展,已经成为统计分析中重要的工具,它不仅可以应用于波动分析、风险分析,同时还可以作为进行统计计算和模型构建的重要基础。

通过灵活运用半变异函数,研究人员以及经济相关的决策者可以从不同的层面深入研究问题的解决方案,为社会发展注入新的动力,推动社会经济的发展。

r语言拟合半变异函数

r语言拟合半变异函数

r语言拟合半变异函数拟合半变异函数在地质学、环境科学、农业科学等领域都有广泛的应用。

本文将介绍如何使用R语言进行半变异函数的拟合,以及相关的数据处理和结果分析。

我们需要明确什么是半变异函数。

半变异函数描述了两个地点之间的变量值随着距离增加而发生的变化情况。

在地学中,这个变量可以是土壤含水量、重金属浓度等。

半变异函数通常由一个拟合的模型来表示,常见的模型包括指数模型、高斯模型等。

在R语言中,我们可以使用`gstat`包来进行半变异函数的拟合。

首先,我们需要导入数据。

假设我们有一组土壤含水量数据,其中包含了地点的坐标信息和含水量的测量值。

我们可以使用`read.csv`函数将数据导入R环境中。

```Rdata <- read.csv('data.csv')```接下来,我们需要对数据进行预处理,包括去除缺失值、标准化等。

这一步是为了保证数据的质量,避免在拟合过程中出现错误。

我们可以使用`na.omit`函数去除缺失值,并使用`scale`函数对数据进行标准化。

```Rdata <- na.omit(data)data <- scale(data)```然后,我们可以使用`variogram`函数计算半变异函数。

`variogram`函数接受数据和距离参数作为输入,并返回一个半变异函数的对象。

```Rvariogram_obj <- variogram(data ~ x + y, data = data, width = 100)```在计算半变异函数之后,我们可以选择合适的模型进行拟合。

`gstat`包提供了多种常见的半变异模型,如指数模型、高斯模型等。

我们可以使用`fit.variogram`函数来拟合半变异函数,并选择最优的模型。

```Rfit_obj <- fit.variogram(variogram_obj, model = vgm(psill = 1, model = "Exp", range = 100, nugget = 0.1))```我们可以使用`plot`函数将拟合的半变异函数和原始数据进行可视化。

半方差函数

半方差函数

半方差半方差函数(Semi-variogram)及其模型半方差函数也称为半变异函数,它就是地统计学中研究土壤变异性的关键函数、2、1、1半方差函数的定义与参数如果随机函数Z(x)具有二阶平稳性,则半方差函数((h)可以用Z(x)的方差S2与空间协方差C(h)来定义:((h)= S2-C(h)((h)反映了Z(x)中的空间相关部分,它等于所有以给定间距h相隔的样点测值之差平方的数学期望:(1)实际可用:(2)式中N(h)就是以h为间距的所有观测点的成对数目、某个特定方向的半方差函数图通常就是由((h)对h作图而得、在通常情况下,半方差函数值都随着样点间距的增加而增大,并在一定的间距(称为变程,arrange)升大到一个基本稳定的常数(称为基台,sill)、土壤性质的半方差函数也可能持续增大,不表现出确定的基台与变程,这时无法定义空间方差,说明存在有趋势效应与非平稳性、另一些半方差函数则可能完全缺乏空间结构,在所用的采样尺度下,样品间没有可定量的空间相关性、从理论上讲,实验半方差函数应该通过坐标原点,但就是许多土壤性质的半方差函数在位置趋于零时并不为零、这时的非零值就称为"块金方差(Nugget variance)"或"块金效应"、它代表了无法解释的或随机的变异,通常由测定误差或土壤性质的微变异所造成、对于平稳性数据,基底方差与结构方差之与约等于基台值、2、1、2 方差函数的理论模型土壤在空间上就是连续变异的,所以土壤性质的半方差函数应该就是连续函数、但就是,样品半方差图却就是由一批间断点组成、可以用直线或曲线将这些点连接起来,用于拟合的曲线方程就称为半方差函数的理论模型、在土壤研究中常用的模型有:①线性有基台模型:式中C1/a就是直线的斜率、这就是一维数据拟合的最简单模型:((h)=C0 +C1·h/a 0在极限情况下,C1/a可以为0,这时就有纯块金效应模型:((h)=C0, h>0 (4)((0)=0 h=0②球状模型((h)= C0 +C1[1、5h/a-0、5(h/a)3] 0a (5)((0)=0 h=0③指数模型((h)=C0+C1[1-exp-h/a ] h>0 (6)((0)=0 h=0④双曲线模型(7)⑤高斯模型((h)=C0+C1[1-exp(-h2/a2)] h>0 (8)((0)=0 h=0选定了半方差函数的拟合模型后,通常就是以最小二乘法计算方程的参数,并应用Ross等的最大似然程序(MLP),得到效果最好的半方差方程、2、1、3 模型的检验(cross-validation,又称作jacknifing)为了检验所选模型三个参数的合理性,必须作一定的检验、但就是到现在为止还没有一个有效的方法检验参数的置信区间;同时,由于我们不知道半方差模型的确切形式,所选定的模型只就是半方差函数的近似式,故无法以确切的函数形式对模型参数进行统计检验、交叉验证法的检验方法,一种间接的结合普通克立格的方法,为检验所选模型的参数提供了一个途径、这个方法的优点就是在检验过程中对所选定的模型参数不断进行修改,直至达到一定的精度要求、交叉验证法的基本思路就是:依次假设每一个实测数据点未被测定,由所选定的半方差模型,根据n-1个其它测定点数据用普通克立格估算这个点的值、设测定点的实测值为,估算值为,通过分析误差,来检验模型的合理性、2、1、4半方差函数的模型的选取原则与参数的确定半方差函数的模型的选取原则就是:首先根据公式计算出((h)的散点图,然后分别用不同类型的模型来进行拟合,得到模型的参数值及离差平方与,首先考虑离差平方与较小的模型类型,其次,考虑块金值与独立间距,最后用交叉验证法来修正模型的参数、2、2 Kriging最优内插估值法如果区域化变量满足二阶平稳或本征假设,对点或块段的估计可直接采用点克立格法(Puctual Kriging )或者块段克立格法(Block Kriging)、这两种方法就是最基本的估计方法,也称普通克立格法(Origing Kriging,简称OK)、半方差图除用于分析土壤特性空间分布的方向性与相关距离外,还可用于对未测点的参数进行最优内插估值与成图,该法原理如下:Kriging最优内插法的原理设x0为未观测的需要估值的点,x1, x2,…, xN 为其周围的观测点,观测值相应为y(x1 ),y(x2),…,y(xN)、未测点的估值记为(x0),它由相邻观测点的已知观测值加权取与求得:(9)此处,(i为待定加权系数、与以往各种内插法不同,Kriging内插法就是根据无偏估计与方差最小两项要求来确定上式中的加权系数(i的,故称为最优内插法、1、无偏估计设估值点的真值为y(x0)、由于土壤特性空间变异性的存在,以及,•1。

半方差

半方差

半方差半方差函数(Semi-variogram)及其模型半方差函数也称为半变异函数,它是地统计学中研究土壤变异性的关键函数.2.1.1半方差函数的定义和参数如果随机函数Z(x)具有二阶平稳性,则半方差函数((h)可以用Z(x)的方差S2和空间协方差C(h)来定义:((h)= S2-C(h)((h)反映了Z(x)中的空间相关部分,它等于所有以给定间距h相隔的样点测值之差平方的数学期望:(1)实际可用:(2)式中N(h)是以h为间距的所有观测点的成对数目.某个特定方向的半方差函数图通常是由((h)对h作图而得.在通常情况下,半方差函数值都随着样点间距的增加而增大,并在一定的间距(称为变程,arrange)升大到一个基本稳定的常数(称为基台,sill).土壤性质的半方差函数也可能持续增大,不表现出确定的基台和变程,这时无法定义空间方差,说明存在有趋势效应和非平稳性.另一些半方差函数则可能完全缺乏空间结构,在所用的采样尺度下,样品间没有可定量的空间相关性.从理论上讲,实验半方差函数应该通过坐标原点,但是许多土壤性质的半方差函数在位置趋于零时并不为零.这时的非零值就称为"块金方差(Nugget variance)"或"块金效应".它代表了无法解释的或随机的变异,通常由测定误差或土壤性质的微变异所造成.对于平稳性数据,基底方差与结构方差之和约等于基台值.2.1.2 方差函数的理论模型土壤在空间上是连续变异的,所以土壤性质的半方差函数应该是连续函数.但是,样品半方差图却是由一批间断点组成.可以用直线或曲线将这些点连接起来,用于拟合的曲线方程就称为半方差函数的理论模型.在土壤研究中常用的模型有:①线性有基台模型:式中C1/a是直线的斜率.这是一维数据拟合的最简单模型:((h)=C0 +C1·h/a 0在极限情况下,C1/a可以为0,这时就有纯块金效应模型:((h)=C0, h>0 (4)((0)=0 h=0②球状模型((h)= C0 +C1[1.5h/a-0.5(h/a)3] 0a (5)((0)=0 h=0③指数模型((h)=C0+C1[1-exp-h/a ] h>0 (6)((0)=0 h=0④双曲线模型(7)⑤高斯模型((h)=C0+C1[1-exp(-h2/a2)] h>0 (8)((0)=0 h=0选定了半方差函数的拟合模型后,通常是以最小二乘法计算方程的参数,并应用Ross等的最大似然程序(MLP),得到效果最好的半方差方程.2.1.3 模型的检验(cross-validation,又称作jacknifing)为了检验所选模型三个参数的合理性,必须作一定的检验.但是到现在为止还没有一个有效的方法检验参数的置信区间;同时,由于我们不知道半方差模型的确切形式,所选定的模型只是半方差函数的近似式,故无法以确切的函数形式对模型参数进行统计检验.交叉验证法的检验方法,一种间接的结合普通克立格的方法,为检验所选模型的参数提供了一个途径.这个方法的优点是在检验过程中对所选定的模型参数不断进行修改,直至达到一定的精度要求.交叉验证法的基本思路是:依次假设每一个实测数据点未被测定,由所选定的半方差模型,根据n-1个其它测定点数据用普通克立格估算这个点的值.设测定点的实测值为,估算值为,通过分析误差,来检验模型的合理性.2.1.4半方差函数的模型的选取原则和参数的确定半方差函数的模型的选取原则是:首先根据公式计算出((h)的散点图,然后分别用不同类型的模型来进行拟合,得到模型的参数值及离差平方和,首先考虑离差平方和较小的模型类型,其次,考虑块金值和独立间距,最后用交叉验证法来修正模型的参数.2.2 Kriging最优内插估值法如果区域化变量满足二阶平稳或本征假设,对点或块段的估计可直接采用点克立格法(Puctual Kriging )或者块段克立格法(Block Kriging).这两种方法是最基本的估计方法,也称普通克立格法(Origing Kriging,简称OK).半方差图除用于分析土壤特性空间分布的方向性和相关距离外,还可用于对未测点的参数进行最优内插估值和成图,该法原理如下: Kriging最优内插法的原理设x0为未观测的需要估值的点,x1, x2,…, xN 为其周围的观测点,观测值相应为y(x1 ),y(x2),…,y(xN).未测点的估值记为(x0),它由相邻观测点的已知观测值加权取和求得:(9)此处,(i为待定加权系数.和以往各种内插法不同,Kriging内插法是根据无偏估计和方差最小两项要求来确定上式中的加权系数(i的,故称为最优内插法.1. 无偏估计设估值点的真值为y(x0).由于土壤特性空间变异性的存在,以及, y(x0)均可视为随机变量.当为无偏估计时,(10)将式(9)代入(10)式,应有(11)2. 估值和真值y(x0)之差的方差最小.即(12)利用式(3-10),经推导方差为(13)式中,((xi,xj)表示以xi和xj两点间的距离作为间距h时参数的半方差值,((xi, x0)则是以xi和x0两点之间的距离作为间距h时参数的半方差值.观测点和估值点的位置是已知的,相互间的距离业已知,只要有所求参数的半方差((h)图,便可求得各个((xi,xj)和((xi,x0)值.因此,确定式(9)中各加权系数的问题,就是在满足式(11)的约束条件下,求目标函数以式(13)表示的方差为最小值的优化问题.求解时可采用拉格朗日法,为此构造一函数,(为待定的拉格朗日算子.由此,可导出优化问题的解应满足:i=1,2,N (14)由式(14)和式(11)组成n+1阶线性方程组,求解此线性方程组便可得到n个加权系数(i和拉格朗日算子(.该线性方程组可用矩阵形式表示:(15)式中,( ij为((xi,xj)的简写.求得各(i值和(值后,由式(9)便可得出x0点的最优估值y(x0).而且还可由式(13)求出相应该估值的方差之最小值(2min.将式(14)代入式(13),最小方差值还可由下式方便地求出:(16)上述最优化问题求解还可用其他方法,在应用Kriging内插法时还有其他方面的问题,在此都不一一列举了.。

半变异函数的求解

半变异函数的求解

半变异函数的求解克里金差值首先需要求取半变异函数,它是矢量距离h的函数,但这个问题似乎一直是大家纠结的问题,我也很纠结。

实际工作中,采样点位并未位于正规网格节点上,甚至较为离散,所以在计算半变异函数值时,要考虑角度容差和距离容差;也就是说,在理论上,x+h数据是足够的,但实际上,x+h 数据极少,因此必须考虑容差。

在矢量h的角度容差和距离容差范围内,都可以看做是x+h,这样才能计算半变异函数值。

在半变异函数的求解中,最方便又常用的软件就是GS+和Surfer(不要提ArgGIS),两者区别在哪?个人认为主要在以下三个方面:(1)容差。

我们知道,在看各向异性时,一般都是以0度(即x轴正向)为始,45度为间隔,看8个方向上的各向异性。

在GS+中,默认角度容差为22.5度,这个数字化刚刚好(这个容易理解),而Surfer中默认为90度,那也就是说surfer中考虑各向异性仅仅考虑x轴正向和x轴负向两个方向,当然这个似乎可以改变。

(2)距离选择。

GS+中有两个距离,一个是最大滞后距离,一个是计算间隔,其中计算间隔才是决定半变异函数模型的主要参数;surfer中只有一个,是最大滞后距离。

最大滞后距离(是否也就是搜索半径呢?我个人认为是),GS+选择的是x、y轴两者最大距离的1/2,surfer选择的是对角线距离最大值的1/3。

但这个数值我个人认为影响不大(只要不是太离谱),它影响的仅仅是点对数的多少(因为在实际工作中,各自距离的1/2和1/3都应该超出了样品的相关性范围)。

不过对于搜索半径,我也看到一些资料说选择采样间隔的2.5倍到3倍。

(3)各向异性的整体考虑。

GS+中,在半变异函数计算中并未整体考虑各向异性(我个人认为,不知道是否对),而surfer考虑了,但是surfer中的自动拟合参数似乎有些问题;而且,模型得自己选择并进行比较得出最优结果,而GS+默认选择的已经是最优的。

不知道上述观点大家是否同意?大家一起讨论讨论。

arcgis半变异函数

arcgis半变异函数

arcgis半变异函数ArcGIS半变异函数在地理信息系统(GIS)中,半变异函数是一种用于描述地理现象空间变异性的统计方法。

ArcGIS作为一款常用的GIS软件,提供了多种半变异函数的计算方法和工具,帮助用户分析地理数据的空间变异性,进而支持决策和规划过程。

本文将介绍ArcGIS中的半变异函数的基本概念、计算方法以及应用案例。

一、半变异函数的基本概念半变异函数是描述地理现象空间变异性的数学函数,用于研究地理现象在空间上的相似性和差异性。

半变异函数包括两个主要参数:距离和方向。

距离参数表示观测点之间的空间间隔,方向参数表示观测点之间的方向关系。

通过计算不同距离和方向下的变异性,可以得到半变异函数的数学模型。

二、ArcGIS中的半变异函数计算方法ArcGIS提供了多种半变异函数的计算方法,包括简单半变异函数、指数半变异函数、高斯半变异函数等。

用户可以根据具体需求选择适合的计算方法。

1. 简单半变异函数简单半变异函数是最基本的半变异函数模型,它假设地理现象的空间变异性在不同距离上呈现简单的线性关系。

ArcGIS中提供了简单半变异函数的计算工具,用户可以根据实际数据进行参数设置和计算。

2. 指数半变异函数指数半变异函数假设地理现象的空间变异性在不同距离上呈现指数关系。

在ArcGIS中,用户可以使用指数半变异函数工具进行计算,通过调整参数来拟合实际数据。

3. 高斯半变异函数高斯半变异函数假设地理现象的空间变异性在不同距离上呈现高斯分布。

ArcGIS中的高斯半变异函数工具可以帮助用户计算高斯半变异函数,并根据实际数据进行参数调整。

三、半变异函数的应用案例半变异函数在GIS中有广泛的应用,具体包括以下几个方面:1. 空间插值半变异函数可以用于空间插值,通过已知观测点的数值和位置信息,推断未知位置上的数值。

通过计算半变异函数,可以确定最佳插值方法和参数,提高插值结果的准确性。

2. 空间分析半变异函数可以用于空间分析,通过计算不同距离和方向下的变异性,揭示地理现象的空间分布规律。

第四章 变异函数的结构分析

第四章  变异函数的结构分析

(4)变异函数计算
• 考虑数据的结构
等间距规则网格数据 非等间距不规则网格数据
(4)变异函数计算
• 1)扇区分组
– 以笛卡尔坐标原点为原点,如 图4-17所示虚线为样点对距离h ,利用扇形分区进行不规则格 网数据分组。
• 2)格网分组
– 扇区分组虽然合理,但不适宜 计算机表示,为此采用格网分 组。
2、模型拟合评价及类型确定
• 模型拟合评 • 最优曲线的检验 价包括: • 即理论模型的检验。由于把最优理论模型的求解转化为一
元和二元线性方程来求解,显然就需要对回归方程参数及 • 最优曲线的 方程本身进行显著性检验。 检验和模型 比较 • 模型比较

即是通过平均误差、均方根误差、平均标准误差等统计指 标对不同的理论模型比较,从中选出最优拟合模型。一般 来说,人们总是希望预测误差是无偏且最优的。
带状异向性:当区域化变量在 不同方向上变异性差异不能用 简单几何变换得到时,就称为 带状异向性。此时,实验变异 函数具有不同的基台值,而变 程可以相同也可以不同。
2、不同方向上的套合
• (2)变换矩阵
• 为了便于计算,在克里格估算中所用的变异函数或协方差函数的理论模式要 求区域化变量是各向同性。
2、不同方向上的套合
第四章 变异函数结构分析


• 一、变异函数的理论模型 • 二、变异函数理论模型的最优拟合 • 三、变异函数的套合结构
一、变异函数的理论模型
纯块金效应模型 球状模型 有基台值模型 指数模型 高斯模型 线性有基台值模型 无基台值模型 线性无基台值模型 幂函数模型 对数模型 孔穴效应模型(可有有基台或无基台模型)
1、有基台值模型
• (1)纯块金效应模型

地理空间抽样理论研究综述

地理空间抽样理论研究综述

地理学报ACTA GEOGRAPHICA SINICA 第64卷第3期2009年3月Vol.64,No.3Mar.,2009地理空间抽样理论研究综述姜成晟1,2,王劲峰1,曹志冬3(1.中国科学院地理科学与资源研究所,北京100101;2.中国科学院研究生院,北京100049;3.中国科学院自动化研究所,北京100080)摘要:抽样调查是地理研究、资源评估、环境问题研究和社会经济问题研究的重要手段。

对于地理分布的各种资源,由于调查数据往往具有空间相关性,传统的抽样调查理论无法满足日益增长的空间抽样需求。

空间抽样理论是对具有空间相关性的各种资源和调查对象进行抽样设计的基础。

本文详细论述了空间抽样理论发展现状。

首先介绍了空间抽样的产生和发展,以及空间抽样所要研究的四个问题。

然后介绍了基于设计的和基于模型的抽样统计推断方式,以及它们适用的范围。

最后本文详细论述了Kriging 理论在抽样理论的应用、前向、后向和双向样本布局方法和六种空间抽样样本优化选择标准。

关键词:地理空间;Kriging 抽样;抽样调查1概述1.1空间抽样的发展在1895年瑞士首都伯尔尼召开的国际统计学会(ISI)第五次大会上,挪威人凯尔(A.N.Ciael)的报告—《对代表性调查的研究和经验》,正式提出使用代表性样本的调查方法取代全面调查。

地统计学最早是矿物学家D.R.krige 将其应用于南非金矿的查找,这个方法是由Matheron 提出来的[1,2]。

七十年代提出了托普勒第一定律:任何事物之间都有相关性,相距近的事物比相距远的事物之间更加相关[3],对这种相关性的研究和量化构成了空间统计理论的基础,一大批学者对空间相关性和空间变异等问题做了大量的研究[4-9],奠定了空间统计、空间数据分析的基础,基于样本不独立假设的空间抽样调查技术得以迅速发展,在生态[10]、海洋[11]、渔业[12]、林业[13]、农业[14]、人口健康调查[15]、环境[16]、土壤[17]以及水资源[18]等方面得到了广泛的应用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

半边也函数的应用半变异函数拟合指数模型程序(c++代码)#include <stdio.h>#include <time.h>#include<windows.h>#include <math.h>#include <stdlib.h>#define S 1 /*试验次数*/#define G 2000 /*混合迭代次数*/#define P 200 /*个体总数*/#define M 20 /*族群数*/#define I 10 /*因此,一个族群中的个体数是10*/#define V 3 /*个体维数*/#define N 10 /*族群内更新次数*/#define MAX 10#define MIN 0double DMAX=1.0; /*蛙跳的最大值*/double DMIN=0.4; /*蛙跳的最大值*/double D=MAX/1; /*蛙跳的最大值*/int i1,i2,i3,i4,ii;int try_number=0;int try_max=5;double C=1.0;#define R ((double)(rand()%10000)/10000)//0-1之间的随机数,精度为1/10000 //#define R1 rand()%100/100.0static int kk;double PI=3.14159265;double Tolerance=0.0000001;//收敛精度double c3=0.03;//扰动幅度double e=2.718281828459;//自然对数底数int sm=3;int bz=0;//扰动因子标志double aw[V];double nihe[17][2]={1115.658026,8.70628355,1915.362904,8.20840555,2467.305693,9.1856689,2952.330784,9.0543057,5095.207855,9.132906445,5418.830566,8.852431395,4146.89209,9.45153145,6037.806376,9.103558859,4818.459044,7.2313171,5143.558017,9.0538129,5459.844361,9.74985695,5762.570046,8.6310193,6060.453719,9.194387,6356.051127,10.398948,6651.015103,9.8449629,6941.254523,7.2279982,7223.868903,6.579128};typedef struct {double d[V];double fitness;}Individal;typedef struct {double h[V];}heli;Individal pw[M];/*族群中个体最差位置*/Individal pb[M];/*族群中个体最好位置*/Individal px;/*全体中最好位置*/Individal individual[P];/*全部个体*/Individal pop[M][I];/*排序后的群组*/Individal temp[M];Individal temp1[I];Individal tem;Individal temx[S];/*计算标准差*//*选择测试函数为Sphere*/double fitness(double a[]){int i;double sum=0.0;double sum1=0.0;double s1=0.0,h1=0.0;double x1[V+1];for(i=0;i<V;i++)x1[i]=a[i];for(i=0;i<V;i++)for(i=0;i<17;i++){if(nihe[i][0]>x1[2])sum1=x1[0]+x1[1];elsesum1=nihe[i][1]-(x1[0]+x1[1]*(1.5*nihe[i][0]-0.5*pow(nihe[i][0],3)/pow(x1[2],3)));sum=sum+sum1;}return sum;}/*对每一个个体初始化*/void init(){int i,j;srand((unsigned)time(NULL)+kk++);for(i=0;i<P;i++){for(j=0;j<V;j++){individual[i].d[j]=R*(MAX-MIN)+MIN;}individual[i].fitness=fitness(individual[i].d);px.fitness=individual[P-1].fitness;}}/*按照适应度降序对全部个体进行排序和族群划分*/void sort(){int i,j,k;for(i=1;i<P;i++){for(j=0;j<P-i;j++){if(individual[j].fitness<individual[j+1].fitness){tem=individual[j];individual[j]=individual[j+1];individual[j+1]=tem;}}}k=0;/*按照规则分组*/for(i=0;i<I;i++){for(j=0;j<M;j++){pop[j][i]=individual[k];k++;}}if (px.fitness>individual[P-1].fitness)px=individual[P-1];for(i=0;i<M;i++){pw[i]=pop[i][0];pb[i]=pop[i][I-1];}}/*对某个群组中的个体进行重新排序*/void sortPop(int b){int i,j;for(i=1;i<I;i++){for(j=0;j<I-i;j++){if(pop[b][j].fitness<pop[b][j+1].fitness){tem=pop[b][j];pop[b][j]=pop[b][j+1];pop[b][j+1]=tem;}}}}/*群组内更新*/void update(){int i,j,k,l,n;double a;double b;for(n=0;n<N;n++){for(i=0;i<M;i++){// temp1[I]=pop[i][];a=0.0;b=0.0;// fitnessFw(i);//D=DMIN+(DMAX-DMIN)*(G-i2)/G;//D=DMIN+(DMAX-DMIN)*pow(e,-30*pow(i2/G,sm));for(j=0;j<V;j++){// temp[i].d[j]=R*(pb[i].d[j]-pw[i].d[j])+aw[j];temp[i].d[j]=C*R*(pb[i].d[j]-pw[i].d[j]);if(fabs(temp[i].d[j])>D){if(temp[i].d[j]>0){temp[i].d[j]=D;}else{temp[i].d[j]=-D;}}temp[i].d[j]+=pw[i].d[j];if(temp[i].d[j]>MAX)temp[i].d[j]=MAX;if(temp[i].d[j]<MIN)temp[i].d[j]=MIN;}a=fitness(temp[i].d);temp[i].fitness=a;if(a<pw[i].fitness){pop[i][0]=temp[i];sortPop(i);pw[i]=pop[i][0];pb[i]=pop[i][I-1];}else//标志{for(k=0;k<V;k++){// temp[i].d[k]=R*(px.d[k]-pw[i].d[k])+aw[k];temp[i].d[k]=C*R*(px.d[k]-pw[i].d[k]);if(fabs(temp[i].d[k])>D){if(temp[i].d[k]>0.0){temp[i].d[k]=D;}else{temp[i].d[k]=-D;}}temp[i].d[k]+=pw[i].d[k];if(temp[i].d[k]>MAX)temp[i].d[k]=MAX;if(temp[i].d[k]<MIN)temp[i].d[k]=MIN;// a+=temp[i].d[k]*temp[i].d[k];//适应度值计算//z=z+(x1[i]*x1[i]-10*cos(2*PI*x1[i])+10);}a=fitness(temp[i].d);temp[i].fitness=a;if(a<pw[i].fitness){pop[i][0]=temp[i];sortPop(i);pw[i]=pop[i][0];pb[i]=pop[i][I-1];}else{for(l=0;l<V;l++){pop[i][0].d[l]=R*(MAX-MIN)+MIN;// b+=pop[i][0].d[l]*pop[i][0].d[l];//适应度值计算//pop[i][0].fitness=b;}pop[i][0].fitness=fitness(pop[i][0].d);sortPop(i);pw[i]=pop[i][0];pb[i]=pop[i][I-1];}}//标志}//****M循环for(ii=0;ii<M;ii++)if(px.fitness>pb[ii].fitness)px=pb[ii];}//***N循环}/*将pop[M][I]复制到individual*/void copy(){int i,j,k;i=0;for(j=0;j<M;j++){for(k=0;k<I;k++){individual[i]=pop[j][k];i++;}}}void report(){printf("第%d次试验极值为%.10e\n",i1+1,px.fitness);}double sigma(){int j;double f=0.0;double fitness_avg=0.0;for (j=0;j<S;j++){// printf("极值e为%16f\n",temx[j].fitness);fitness_avg=fitness_avg+temx[j].fitness;}fitness_avg=fitness_avg/S;printf("平均值为%.16e\n",fitness_avg);//printf("%d极值e为%.16f\n",j,temx[j].fitness);for (j=0;j<S;j++)f=f+fabs(temx[j].fitness-fitness_avg)*fabs(temx[j].fitness-fitness_avg);// printf("极值e为%.16f\n",f);f=sqrt(f/(S-1));return f;}void main(){clock_t start,end;double ave,sigmax;FILE *f=fopen("result(SFLA).txt","w");ave=0.0;start=clock();for(i1=0;i1<S;i1++){init();for(i2=0;i2<G;i2++){sort();update();copy();}temx[i1]=px;report();ave=ave+px.fitness;}sigmax=sigma();end=clock();ave=ave/S;//printf("平均极值为\n%.16f\nCompleted!",ave);printf("50次试验标准差为%.16e\n",sigmax);printf("50次试验平均运行时间=%.2fseconds\n",(double)(end-start)/(S*(double)CLOCKS_PER_SEC));printf("50次试验的平均极值为%.16e\n",ave);fprintf(f,"50次试验平均极值为%.16f\n",ave);fprintf(f,"50次试验标准差为%.16f\n",sigmax);fprintf(f,"50次试验平均运行时间=%.2fseconds\n",(double)(end-start)/(S*(double)CLOCKS_PER_SEC)); fprintf(f,"解为:%.3f %.3f %.3f \n",px.d[0],px.d[1],px.d[2]);。

相关文档
最新文档