WM模糊算法
Ⅰ 字符串匹配中的WM算法的流程图
我有
我的邮箱[email protected]联系我
Ⅱ 简单数据加密算法
// ecfileDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ecfile.h"
#include "ecfileDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum ;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CEcfileDlg dialog
CEcfileDlg::CEcfileDlg(CWnd* pParent /*=NULL*/)
: CDialog(CEcfileDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CEcfileDlg)
m_path = _T("");
m_pass = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CEcfileDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CEcfileDlg)
DDX_Text(pDX, IDC_PASSWORD, m_path);
DDX_Text(pDX, IDC_PASS1, m_pass);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CEcfileDlg, CDialog)
//{{AFX_MSG_MAP(CEcfileDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_E, OnE)
ON_BN_CLICKED(IDC_D, OnD)
ON_BN_CLICKED(IDC_BROW, OnBrow)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CEcfileDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
return TRUE;
}
void CEcfileDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
void CEcfileDlg::OnPaint()
{
CDialog::OnPaint();
}
HCURSOR CEcfileDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CEcfileDlg::OnE()
{
UpdateData(TRUE);
if(m_path == "")
{
AfxMessageBox("怎么没有选择要加密的文件就开始加密啊?");
return;
}
UpdateData(TRUE);
if(m_pass == "")
{
AfxMessageBox("没有写上密码");
return;
}
if(ecfile(m_path))
{
MessageBox("加密成功了已经");
}
else
{
MessageBox("没加密成功");
}
}
void CEcfileDlg::OnD()
{
UpdateData(TRUE);
if(m_path == "")
{
AfxMessageBox("怎么没有选择要加密的文件就开始解密啊?");
return;
}
UpdateData(TRUE);
if(m_pass == "")
{
AfxMessageBox("没有写上密码");
return;
}
if(dcfile(m_path))
{
MessageBox("解密成功了");
}
else
{
MessageBox("解密失败了");
}
}
void CEcfileDlg::OnBrow()
{
CFileDialog dlg(TRUE);
if(dlg.DoModal() == IDOK)
{
m_path = dlg.GetPathName();
UpdateData(FALSE);
}
else
{
return;
}
}
//给文件加密的函数
BOOL CEcfileDlg::ecfile(LPCTSTR fpath)
{
char *data;
CFile *file;
DWORD flen;
m_password = epass();
file = new CFile;
if ( !file->Open(fpath, CFile::shareDenyNone|CFile::modeReadWrite))
{
return FALSE;
}
flen = file->GetLength();
data = new char[(int)flen];
file->SeekToBegin();
file->Read(data, flen);
for(int i=0; i<(int)flen; i++)
{
data[i] ^= m_password;
data[i] ^= flen;
}
file->SeekToBegin();
file->Write(data, flen);
delete[] data;
//添加密码验证信息
char cpass[5] = "love";
for(int j=0; j<5; j++)
{
cpass[j] ^= m_password;
}
file->SeekToEnd();
file->Write(&cpass, 5);
file->Close();
delete file;
return TRUE;
}
//给文件解密的函数
BOOL CEcfileDlg::dcfile(LPCTSTR fpath)
{
char *data;
CFile *file;
DWORD flen;
char love[5];
file = new CFile;
if( !file->Open(fpath, CFile::shareDenyNone|CFile::modeReadWrite))
{
return FALSE;
}
flen = file->GetLength();
data = new char[(int)flen];
//检验密码是不是正确
file->Seek(-5, CFile::end);
file->Read(&love, 5);
m_password = epass();
for(int i=0; i<5; i++)
{
love[i] ^= m_password;
}
if(strcmp(love, "love")!=0)
{
return FALSE;
}
//解密
file->SeekToBegin();
file->Read(data, flen);
for(int j=0; j<(int)flen; j++)
{
data[j] ^= m_password;
data[j] ^= (flen-5);
}
file->SeekToBegin();
file->Write(data, flen);
file->SetLength(flen-5);
file->Close();
delete[] data;
delete file;
return TRUE;
}
//获得密码的函数
__int64 CEcfileDlg::epass()
{
DWORD plen;
char *ppass;
__int64 mc= 8757735233305;
UpdateData(TRUE);
ppass = m_pass.GetBuffer(0);
plen = strlen(ppass);
for(int i=0; i<(int)plen; i++)
{
mc ^= ppass[i]|128;
}
return mc;
}
Ⅲ 神经网络Hopfield模型
一、Hopfield模型概述
1982年,美国加州工学院J.Hopfield发表一篇对人工神经网络研究颇有影响的论文。他提出了一种具有相互连接的反馈型人工神经网络模型——Hopfield人工神经网络。
Hopfield人工神经网络是一种反馈网络(Recurrent Network),又称自联想记忆网络。其目的是为了设计一个网络,存储一组平衡点,使得当给网络一组初始值时,网络通过自行运行而最终收敛到所存储的某个平衡点上。
Hopfield网络是单层对称全反馈网络,根据其激活函数的选取不同,可分为离散型Hopfield网络(Discrete Hopfield Neural Network,简称 DHNN)和连续型 Hopfield 网络(Continue Hopfield Neural Network,简称CHNN)。离散型Hopfield网络的激活函数为二值型阶跃函数,主要用于联想记忆、模式分类、模式识别。这个软件为离散型Hopfield网络的设计、应用。
二、Hopfield模型原理
离散型Hopfield网络的设计目的是使任意输入矢量经过网络循环最终收敛到网络所记忆的某个样本上。
正交化的权值设计
这一方法的基本思想和出发点是为了满足下面4个要求:
1)保证系统在异步工作时的稳定性,即它的权值是对称的,满足
wij=wji,i,j=1,2…,N;
2)保证所有要求记忆的稳定平衡点都能收敛到自己;
3)使伪稳定点的数目尽可能地少;
4)使稳定点的吸引力尽可能地大。
正交化权值的计算公式推导如下:
1)已知有P个需要存储的稳定平衡点x1,x2…,xP-1,xP,xp∈RN,计算N×(P-1)阶矩阵A∈RN×(P-1):
A=(x1-xPx2-xP…xP-1-xP)T。
2)对A做奇异值分解
A=USVT,
U=(u1u2…uN),
V=(υ1υ2…υP-1),
中国矿产资源评价新技术与评价新模型
Σ=diαg(λ1,λ2,…,λK),O为零矩阵。
K维空间为N维空间的子空间,它由K个独立的基组成:
K=rαnk(A),
设{u1u2…uK}为A的正交基,而{uK+1uK+2…uN}为N维空间的补充正交基。下面利用U矩阵来设计权值。
3)构造
中国矿产资源评价新技术与评价新模型
总的连接权矩阵为:
Wt=Wp-T·Wm,
其中,T为大于-1的参数,缺省值为10。
Wp和Wm均满足对称条件,即
(wp)ij=(wp)ji,
(wm)ij=(wm)ji,
因而Wt中分量也满足对称条件。这就保证了系统在异步时能够收敛并且不会出现极限环。
4)网络的偏差构造为
bt=xP-Wt·xP。
下面推导记忆样本能够收敛到自己的有效性。
(1)对于输入样本中的任意目标矢量xp,p=1,2,…,P,因为(xp-xP)是A中的一个矢量,它属于A的秩所定义的K个基空间的矢量,所以必存在系数α1,α2,…,αK,使
xp-xP=α1u1+α2u2+…+αKuK,
即
xp=α1u1+α2u2+…+αKuK+xP,
对于U中任意一个ui,有
中国矿产资源评价新技术与评价新模型
由正交性质可知,上式中
当i=j,
当i≠j,
对于输入模式xi,其网络输出为
yi=sgn(Wtxi+bt)
=sgn(Wpxi-T·Wmxi+xP-WpxP+T·WmxP)
=sgn[Wp(xi-xP)-T·Wm(xi-xP)+xP]
=sgn[(Wp-T·Wm)(xi-xP)+xP]
=sgn[Wt(xi-xP)+xP]
=sgn[(xi-xP)+xP]
=xi。
(2)对于输入模式xP,其网络输出为
yP=sgn(WtxP+bt)
=sgn(WtxP+xP-WtxP)
=sgn(xP)
=xP。
(3)如果输入一个不是记忆样本的x,网络输出为
y=sgn(Wtx+bt)
=sgn[(Wp-T·Wm)(x-xP)+xP]
=sgn[Wt(x-xP)+xP]。
因为x不是已学习过的记忆样本,x-xP不是A中的矢量,则必然有
Wt(x-xP)≠x-xP,
并且再设计过程中可以通过调节Wt=Wp-T·Wm中的参数T的大小来控制(x-xP)与xP的符号,以保证输入矢量x与记忆样本之间存在足够的大小余额,从而使sgn(Wtx+bt)≠x,使x不能收敛到自身。
用输入模式给出一组目标平衡点,函数HopfieldDesign( )可以设计出 Hopfield 网络的权值和偏差,保证网络对给定的目标矢量能收敛到稳定的平衡点。
设计好网络后,可以应用函数HopfieldSimu( ),对输入矢量进行分类,这些输入矢量将趋近目标平衡点,最终找到他们的目标矢量,作为对输入矢量进行分类。
三、总体算法
1.Hopfield网络权值W[N][N]、偏差b[N]设计总体算法
应用正交化权值设计方法,设计Hopfield网络;
根据给定的目标矢量设计产生权值W[N][N],偏差b[N];
使Hopfield网络的稳定输出矢量与给定的目标矢量一致。
1)输入P个输入模式X=(x[1],x[2],…,x[P-1],x[P])
输入参数,包括T、h;
2)由X[N][P]构造A[N][P-1]=(x[1]-x[P],x[2]-x[P],…,x[P-1]-x[P]);
3)对A[N][P-1]作奇异值分解A=USVT;
4)求A[N][P-1]的秩rank;
5)由U=(u[1],u[2],…,u[K])构造Wp[N][N];
6)由U=(u[K+1],…,u[N])构造Wm[N][N];
7)构造Wt[N][N]=Wp[N][N]-T*Wm[N][N];
8)构造bt[N]=X[N][P]-Wt[N][N]*X[N][P];
9)构造W[N][N](9~13),
构造W1[N][N]=h*Wt[N][N];
10)求W1[N][N]的特征值矩阵Val[N][N](对角线元素为特征值,其余为0),特征向量矩阵Vec[N][N];
11)求Eval[N][N]=diag{exp[diag(Val)]}[N][N];
12)求Vec[N][N]的逆Invec[N][N];
13)构造W[N][N]=Vec[N][N]*Eval[N][N]*Invec[N][N];
14)构造b[N],(14~15),
C1=exp(h)-1,
C2=-(exp(-T*h)-1)/T;
15)构造
中国矿产资源评价新技术与评价新模型
Uˊ——U的转置;
16)输出W[N][N],b[N];
17)结束。
2.Hopfield网络预测应用总体算法
Hopfield网络由一层N个斜坡函数神经元组成。
应用正交化权值设计方法,设计Hopfield网络。
根据给定的目标矢量设计产生权值W[N][N],偏差b[N]。
初始输出为X[N][P],
计算X[N][P]=f(W[N][N]*X[N][P]+b[N]),
进行T次迭代,
返回最终输出X[N][P],可以看作初始输出的分类。
3.斜坡函数
中国矿产资源评价新技术与评价新模型
输出范围[-1,1]。
四、数据流图
Hopfield网数据流图见附图3。
五、调用函数说明
1.一般实矩阵奇异值分解
(1)功能
用豪斯荷尔德(Householder)变换及变形QR算法对一般实矩阵进行奇异值分解。
(2)方法说明
设A为m×n的实矩阵,则存在一个m×m的列正交矩阵U和n×n的列正交矩阵V,使
中国矿产资源评价新技术与评价新模型
成立。其中
Σ=diag(σ0,σ1,…σp)p⩽min(m,n)-1,
且σ0≥σ1≥…≥σp>0,
上式称为实矩阵A的奇异值分解式,σi(i=0,1,…,p)称为A的奇异值。
奇异值分解分两大步:
第一步:用豪斯荷尔德变换将A约化为双对角线矩阵。即
中国矿产资源评价新技术与评价新模型
其中
中国矿产资源评价新技术与评价新模型
j具有如下形式:
中国矿产资源评价新技术与评价新模型
其中ρ为一个比例因子,以避免计算过程中的溢出现象与误差的累积,Vj是一个列向量。即
Vj=(υ0,υ1,…,υn-1),
则
中国矿产资源评价新技术与评价新模型
其中
中国矿产资源评价新技术与评价新模型
第二步:用变形的QR算法进行迭代,计算所有的奇异值。即:用一系列的平面旋转变换对双对角线矩阵B逐步变换成对角矩阵。
在每一次的迭代中,用变换
中国矿产资源评价新技术与评价新模型
其中变换
在每次迭代时,经过初始化变换V01后,将在第0列的主对角线下方出现一个非0元素。在变换V01中,选择位移植u的计算公式如下:
中国矿产资源评价新技术与评价新模型
最后还需要对奇异值按非递增次序进行排列。
在上述变换过程中,若对于某个次对角线元素ej满足
|ej|⩽ε(|sj+1|+|sj|)
则可以认为ej为0。
若对角线元素sj满足
|sj|⩽ε(|ej-1|+|ej|)
则可以认为sj为0(即为0奇异值)。其中ε为给定的精度要求。
(3)调用说明
int bmuav(double*a,int m,int n,double*u,double*v,double eps,int ka),
本函数返回一个整型标志值,若返回的标志值小于0,则表示出现了迭代60次还未求得某个奇异值的情况。此时,矩阵的分解式为UAVT;若返回的标志值大于0,则表示正常返回。
形参说明:
a——指向双精度实型数组的指针,体积为m×n。存放m×n的实矩阵A;返回时,其对角线给出奇异值(以非递增次序排列),其余元素为0;
m——整型变量,实矩阵A的行数;
n——整型变量,实矩阵A的列数;
u——指向双精度实型数组的指针,体积为m×m。返回时存放左奇异向量U;
υ——指向双精度实型数组的指针,体积为n×n。返回时存放右奇异向量VT;
esp——双精度实型变量,给定的精度要求;
ka——整型变量,其值为max(m,n)+1。
2.求实对称矩阵特征值和特征向量的雅可比过关法
(1)功能
用雅可比(Jacobi)方法求实对称矩阵的全部特征值与相应的特征向量。
(2)方法说明
雅可比方法的基本思想如下。
设n阶矩阵A为对称矩阵。在n阶对称矩阵A的非对角线元素中选取一个绝对值最大的元素,设为apq。利用平面旋转变换矩阵R0(p,q,θ)对A进行正交相似变换:
A1=R0(p,q,θ)TA,
其中R0(p,q,θ)的元素为
rpp=cosθ,rqq=cosθ,rpq=sinθ,
rqp=sinθ,rij=0,i,j≠p,q。
如果按下式确定角度θ,
中国矿产资源评价新技术与评价新模型
则对称矩阵A经上述变换后,其非对角线元素的平方和将减少
综上所述,用雅可比方法求n阶对称矩阵A的特征值及相应特征向量的步骤如下:
1)令S=In(In为单位矩阵);
2)在A中选取非对角线元素中绝对值最大者,设为apq;
3)若|apq|<ε,则迭代过程结束。此时对角线元素aii(i=0,1,…,n-1)即为特征值λi,矩阵S的第i列为与λi相应的特征向量。否则,继续下一步;
4)计算平面旋转矩阵的元素及其变换后的矩阵A1的元素。其计算公式如下
中国矿产资源评价新技术与评价新模型
5)S=S·R(p,q,θ),转(2)。
在选取非对角线上的绝对值最大的元素时用如下方法:
首先计算实对称矩阵A的非对角线元素的平方和的平方根
中国矿产资源评价新技术与评价新模型
然后设置关口υ1=υ0/n,在非对角线元素中按行扫描选取第一个绝对值大于或等于υ1的元素αpq进行平面旋转变换,直到所有非对角线元素的绝对值均小于υ1为止。再设关口υ2=υ1/n,重复这个过程。以此类推,这个过程一直作用到对于某个υk<ε为止。
(3)调用说明
void cjcbj(double*a,int n,double*v,double eps)。
形参说明:
a——指向双精度实型数组的指针,体积为n×n,存放n阶实对称矩阵A;返回时,其对角线存放n个特征值;
n——整型变量,实矩阵A的阶数;
υ——指向双精度实型数组的指针,体积为n×n,返回特征向量,其中第i列为与λi(即返回的αii,i=0,1,……,n-1)对应的特征向量;
esp——双精度实型变量。给定的精度要求。
3.矩阵求逆
(1)功能
用全选主元高斯-约当(Gauss-Jordan)消去法求n阶实矩阵A的逆矩阵。
(2)方法说明
高斯-约当法(全选主元)求逆的步骤如下:
首先,对于k从0到n-1做如下几步:
1)从第k行、第k列开始的右下角子阵中选取绝对值最大的元素,并记住此元素所在的行号和列号,再通过行交换和列交换将它交换到主元素位置上,这一步称为全选主元;
2)
3)
4)αij-
5)-
最后,根据在全选主元过程中所记录的行、列交换的信息进行恢复,恢复原则如下:在全选主元过程中,先交换的行、列后进行恢复;原来的行(列)交换用列(行)交换来恢复。
图8-4 东昆仑—柴北缘地区基于HOPFIELD模型的铜矿分类结果图
(3)调用说明
int brinv(double*a,int n)。
本函数返回一个整型标志位。若返回的标志位为0,则表示矩阵A奇异,还输出信息“err**not inv”;若返回的标志位不为0,则表示正常返回。
形参说明:
a——指向双精度实型数组的指针,体积为n×n。存放原矩阵A;返回时,存放其逆矩阵A-1;
n——整型变量,矩阵的阶数。
六、实例
实例:柴北缘—东昆仑地区铜矿分类预测。
选取8种因素,分别是重砂异常存在标志、水化异常存在标志、化探异常峰值、地质图熵值、Ms存在标志、Gs存在标志、Shdadlie到区的距离、构造线线密度。
构置原始变量,并根据原始数据构造预测模型。
HOPFIELD模型参数设置:训练模式维数8,预测样本个数774,参数个数8,迭代次数330。
结果分44类(图8-4,表8-5)。
表8-5 原始数据表及分类结果(部分)
续表
Ⅳ 求救,论文高手请不吝赐教
模拟退火是一种优化算法,它本身是不能独立存在的,需要有一个应用场合,其中温度就是模拟退火需要优化的参数,如果它应用到了聚类分析中,那么就是说聚类分析中有某个或者某几个参数需要优化,而这个参数,或者参数集就是温度所代表的。它可以是某项指标,某项关联度,某个距离等等
Simulate Anneal Arithmetic (SAA,模拟退火算法)
模拟退火算法
模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。根据Metropolis准则,粒子在温度T时趋于平衡的概率为e-ΔE/(kT),其中E为温度T时的内能,ΔE为其改变量,k为Boltzmann常数。用固体退火模拟组合优化问题,将内能E模拟为目标函数值f,温度T演化成控制参数t,即得到解组合优化问题的模拟退火算法:由初始解i和控制参数初值t开始,对当前解重复“产生新解→计算目标函数差→接受或舍弃”的迭代,并逐步衰减t值,算法终止时的当前解即为所得近似最优解,这是基于蒙特卡罗迭代求解法的一种启发式随机搜索过程。退火过程由冷却进度表(Cooling Schele)控制,包括控制参数的初值t及其衰减因子Δt、每个t值时的迭代次数L和停止条件S。
1 . 模拟退火算法的模型
模拟退火算法可以分解为解空间、目标函数和初始解三部分。
模拟退火的基本思想:
(1) 初始化:初始温度T(充分大),初始解状态S(是算法迭代的起点), 每个T值的迭代次数L
(2) 对k=1,……,L做第(3)至第6步:
(3) 产生新解S′
(4) 计算增量Δt′=C(S′)-C(S),其中C(S)为评价函数
(5) 若Δt′<0则接受S′作为新的当前解,否则以概率exp(-Δt′/T)接受S′作为新的当前解.
(6) 如果满足终止条件则输出当前解作为最优解,结束程序。
终止条件通常取为连续若干个新解都没有被接受时终止算法。
(7) T逐渐减少,且T->0,然后转第2步。
算法对应动态演示图:
模拟退火算法新解的产生和接受可分为如下四个步骤:
第一步是由一个产生函数从当前解产生一个位于解空间的新解;为便于后续的计算和接受,减少算法耗时,通常选择由当前新解经过简单地变换即可产生新解的方法,如对构成新解的全部或部分元素进行置换、互换等,注意到产生新解的变换方法决定了当前新解的邻域结构,因而对冷却进度表的选取有一定的影响。
第二步是计算与新解所对应的目标函数差。因为目标函数差仅由变换部分产生,所以目标函数差的计算最好按增量计算。事实表明,对大多数应用而言,这是计算目标函数差的最快方法。
第三步是判断新解是否被接受,判断的依据是一个接受准则,最常用的接受准则是Metropo1is准则: 若Δt′<0则接受S′作为新的当前解S,否则以概率exp(-Δt′/T)接受S′作为新的当前解S。
第四步是当新解被确定接受时,用新解代替当前解,这只需将当前解中对应于产生新解时的变换部分予以实现,同时修正目标函数值即可。此时,当前解实现了一次迭代。可在此基础上开始下一轮试验。而当新解被判定为舍弃时,则在原当前解的基础上继续下一轮试验。
模拟退火算法与初始值无关,算法求得的解与初始解状态S(是算法迭代的起点)无关;模拟退火算法具有渐近收敛性,已在理论上被证明是一种以概率l 收敛于全局最优解的全局优化算法;模拟退火算法具有并行性。
2 模拟退火算法的简单应用
作为模拟退火算法应用,讨论货郎担问题(Travelling Salesman Problem,简记为TSP):设有n个城市,用数码1,…,n代表。城市i和城市j之间的距离为d(i,j) i, j=1,…,n.TSP问题是要找遍访每个域市恰好一次的一条回路,且其路径总长度为最短.。
求解TSP的模拟退火算法模型可描述如下:
解空间 解空间S是遍访每个城市恰好一次的所有回路,是{1,……,n}的所有循环排列的集合,S中的成员记为(w1,w2 ,……,wn),并记wn+1= w1。初始解可选为(1,……,n)
目标函数 此时的目标函数即为访问所有城市的路径总长度或称为代价函数:
我们要求此代价函数的最小值。
新解的产生 随机产生1和n之间的两相异数k和m,若k (w1, w2 ,…,wk , wk+1 ,…,wm ,…,wn)
变为:
(w1, w2 ,…,wm , wm-1 ,…,wk+1 , wk ,…,wn).
如果是k>m,则将
(w1, w2 ,…,wk , wk+1 ,…,wm ,…,wn)
变为:
(wm, wm-1 ,…,w1 , wm+1 ,…,wk-1 ,wn , wn-1 ,…,wk).
上述变换方法可简单说成是“逆转中间或者逆转两端”。
也可以采用其他的变换方法,有些变换有独特的优越性,有时也将它们交替使用,得到一种更好方法。
代价函数差 设将(w1, w2 ,……,wn)变换为(u1, u2 ,……,un), 则代价函数差为:
根据上述分析,可写出用模拟退火算法求解TSP问题的伪程序:
Procere TSPSA:
begin
init-of-T; { T为初始温度}
S={1,……,n}; {S为初始值}
termination=false;
while termination=false
begin
for i=1 to L do
begin
generate(S′form S); { 从当前回路S产生新回路S′}
Δt:=f(S′))-f(S);{f(S)为路径总长}
IF(Δt<0) OR (EXP(-Δt/T)>Random-of-[0,1])
S=S′;
IF the-halt-condition-is-TRUE THEN
termination=true;
End;
T_lower;
End;
End
模拟退火算法的应用很广泛,可以较高的效率求解最大截问题(Max Cut Problem)、0-1背包问题(Zero One Knapsack Problem)、图着色问题(Graph Colouring Problem)、调度问题(Scheling Problem)等等。
3 模拟退火算法的参数控制问题
模拟退火算法的应用很广泛,可以求解NP完全问题,但其参数难以控制,其主要问题有以下三点:
(1) 温度T的初始值设置问题。
温度T的初始值设置是影响模拟退火算法全局搜索性能的重要因素之一、初始温度高,则搜索到全局最优解的可能性大,但因此要花费大量的计算时间;反之,则可节约计算时间,但全局搜索性能可能受到影响。实际应用过程中,初始温度一般需要依据实验结果进行若干次调整。
(2) 退火速度问题。
模拟退火算法的全局搜索性能也与退火速度密切相关。一般来说,同一温度下的“充分”搜索(退火)是相当必要的,但这需要计算时间。实际应用中,要针对具体问题的性质和特征设置合理的退火平衡条件。
(3) 温度管理问题。
温度管理问题也是模拟退火算法难以处理的问题之一。实际应用中,由于必须考虑计算复杂度的切实可行性等问题,常采用如下所示的降温方式:
T(t+1)=k×T(t)
式中k为正的略小于1.00的常数,t为降温的次数
Ⅳ SB与WM和Mid
mid至少得能很方便地使用各种网络功能吧?
收个邮件还打不开附件,想付个款却连不上网上银行,想在线看个视频却没有解码器...那能叫方便吗?
其实这个界限很模糊的,每个人的要求都不一样,你自己把握吧。
换句话说,如果你觉得用n97上网很方便,那它就是mid。
Ⅵ dijkstra算法
[问题分析]
对于一个含有n个顶点和e条边的图来说,从某一个顶点Vi到其余任一顶点Vj的最短路径,可能是它们之间的边(Vi,Vj),也可能是经过k个中间顶点和k+1条边所形成的路径(1≤k≤n-2)。下面给出解决这个问题的Dijkstra算法思想。
设图G用邻接矩阵的方式存储在GA中,GA[i,j]=maxint表示Vi,Vj是不关联的,否则为权值(大于0的实数)。设集合S用来保存已求得最短路径的终点序号,初始时S=[Vi]表示只有源点,以后每求出一个终点Vj,就把它加入到集合中并作为新考虑的中间顶点。设数组dist[1..n]用来存储当前求得的最短路径,初始时Vi,Vj如果是关联的,则dist[j]等于权值,否则等于maxint,以后随着新考虑的中间顶点越来越多,dist[j]可能越来越小。再设一个与dist对应的数组path[1..n]用来存放当前最短路径的边,初始时为Vi到Vj的边,如果不存在边则为空。
执行时,先从S以外的顶点(即待求出最短路径的终点)所对应的dist数组元素中,找出其值最小的元素(假设为dist[m]),该元素值就是从源点Vi到终点Vm的最短路径长度,对应的path[m]中的顶点或边的序列即为最短路径。接着把Vm并入集合S中,然后以Vm作为新考虑的中间顶点,对S以外的每个顶点Vj,比较dist[m]+GA[m,j]的dist[j]的大小,若前者小,表明加入了新的中间顶点后可以得到更好的方案,即可求得更短的路径,则用它代替dist[j],同时把Vj或边(Vm,Vj)并入到path[j]中。重复以上过程n-2次,即可在dist数组中得到从源点到其余各终点的最段路径长度,对应的path数组中保存着相应的最段路径。
下面给出具体的Dijkstra算法框架(注:为了实现上的方便,用一个一维数组s[1..n]代替集合S,用来保存已求得最短路径的终点集合,即如果s[j]=0表示顶点Vj不在集合中,反之,s[j]=1表示顶点Vj已在集合中)。
Procere Dijkstra(GA,dist,path,i);
{表示求Vi到图G中其余顶点的最短路径,GA为图G的邻接矩阵,dist和path为变量型参数,
其中path的基类型为集合}
Begin
For j:=1 To n Do Begin {初始化}
If j<>i Then s[j]:=0 Else s[j]:=1;
dist[j]:=GA[i,j];
If dist[j]<maxint Then path[j]:=[i]+[j] Else path[j]:=[ ];
End;
For k:=1 To n-2 Do
Begin
w:=maxint;m:=i;
For j:=1 To n Do {求出第k个终点Vm}
If (s[j]=0) and (dist[j]<w) Then Begin m:=j;w:=dist[j]; End;
If m<>i Then s[m]:=1 else exit;
{若条件成立,则把Vm加入到S中,
否则退出循环,因为剩余的终点,其最短路径长度均为maxint,无需再计算下去}
For j:=1 To n Do {对s[j]=0的更优元素作必要修改}
If (s[j]=0) and (dist[m]+GA[m,j]<dist[j])
Then Begin Dist[j]:=dist[m]+GA[m,j];path[j]:=path[m]+[j];End;
End;
End;
(1)从一个顶点到其余各顶点的最短路径
对于一个含有n个顶点和e条边的图来说,从某个顶点vi到其余任一顶点vj的最短路径,可能是它们之间的边(vi,vj),也可能是经过k个中间点和k+1条边所形成的路径(1≤k ≤n-2)。
首先来分析Dijkstra的算法思想
设图G用邻接矩阵的方式存储在GA中,GA[I,j]=maxint表示vi,vj是不关联的,否则为权值(大于0的实数)。设集合S用来存储保存已求得最短路径的终点序号,初始时S=[vi]表示只有源点,以后每求出一个终点vj,就把它加入到集合中并作为新考虑的中间顶点。设数组dist[1..n]用来存储当前求得的最短路径,初始时vi,vj如果是关联的,则dist[j]等于权值,否则等于maxint,以后随着新考虑的中间顶点越来越多,dist[j]可能越来越小。再设一个与dist对应的数组path[1..n]用来存放当前最短路径的边,初始时vi到vj的边,如果不存在边则为空。
执行时,先从S以外的顶点(即待求出最短路径的终点)所对应的dist数组元素中,找出其值最小的元素(假设为dist[m]),该元素值就是从源点vi到终点vm的最短路径长度,对应的path[m]中的顶点或边的序列即为最短路径。接着把vm并入集合S中,然后以vm作为新考虑的中间顶点,对S以外的每个顶点vj,比较dist[m]+GA[i,j]与dist[j]的大小,若前者小,表明加入了新的中间顶点后可以得到更好的方案,即可求得更短的路径,则用它代替dist[j],同时把vj或边(vm,vj)并入到path[j]中。重复以上过程n-2次,即可在dist数组中得到从源点到其余个终点的最短路径长度,对应的path数组中保存着相应的最短路径。
为了实现上的方便,用一个一维数组s[1..n]代替集合s,用来保存已求得最短路径的终点集合,即如果s[j]=0表示顶点vj不在集合中,反之,s[j]表示顶点vj已在集合中)。
Procere dijkstra (GA,dist path,I)
begin
for j:= 1 to n do begin
if j<>I then s[j]:=0;{j不在集合中} else s[j]:=1;{j在集合中};
dist[j]:=GA[I,J];
IF dist [j]<maxint {maxint为假设的一个足够大的数}
Then path [j]:=[I]+[j]
Else path[j]:=[ ];
End;
For k:= 1 to n-1 do begin w:=maxint;m:=I;
For j:= 1 to n do{求出第k个终点Vm}
if (s[j]=0)and(dist[j]<w) then begin m:=j;w:=dist[j];end;
If m<>I then s[m]:=1 else exit;{若条件成立,则把Vm加入到s中,否则退出循环,因为
剩余的终点,其最短路径长度均为maxint,无需再计算下去}
for j:=1 to n do {对s[j]=0的更优元素作必要修改}
if (s[j]=0)and (dist[m]+GA[m,j]<dist[j])
then begin
dist[j]:=dist[m]+GA[m,j];
path[j]:=path[m]+[j];
End;
End;
End;
用集合的思想:
for k:=1 to n-1 do
begin
wm:=max;j:=0;
for i:=1 to n do
if not(i in s)and(dist[i]<wm) then begin j:=i;wm:=dist[i];end;
s:=s+[j];
for i:=1 to n do
if not(i in s)and(dist[j]+cost[j,i]<dist[i]) then
begin dist[i]:=dist[j]+cost[j,i];path[i]:=path[j]+char(48+i);end;
end;
Ⅶ ac,wm,mwm多模算法哪个好
给你两个方向,如果你每次只查找一个字符串,就去看看单模匹配算法,比如KMP 如果每次查找多个字符串,多模匹配算法,比如AC算法,WM算法
Ⅷ oracle wm concat 模糊查询
应该是字符的问题,你可以把里面字段的值复制出来做条件试试。
Ⅸ wm 是什么音频格式为什么文件会那么小而音质却不算差
应该是WMA吧,WMA就是Windows Media Audio编码后的文件格式,由微软开发,WMA针对的不是单机市场,是网络!竞争对手就是网络媒体市场中着名的Real Networks。微软声称,在只有64kbps的码率情况下,WMA可以达到接近CD的音质。和以往的编码不同,WMA支持防复制功能,她支持通过Windows Media Rights Manager 加入保护,可以限制播放时间和播放次数甚至于播放的机器等等。WMA支持流技术,即一边读一边播放,因此WMA可以很轻松的实现在线广播,由于是微软的杰作,因此,微软在Windows中加入了对WMA的支持,WMA有着优秀的技术特征,在微软的大力推广下,这种格式被越来越多的人所接受