俺写的BP算法源程序(Pascal)
delphi 2005下编译通过。支持变学习率。具有通用性,传递函数可自己写(动态调用)。
下面是程序和使用的例子。学习《人工智能与专家系统》时写的。
//////////////////主程序////////////////////////
program BP;
{
输入文件:BP.in
第一行:DLL文件名
第二行:layer_count, n(1), n(2), ... , n(layer_count) ;n(i) <--第i层神经元个数
第三行:允许误差ε 学习率η 学习实例个数N 附加测试输入个数M 迭代次数(若0则不计迭代次数) 最低学习率min_yita
// 若迭代次数为零,则最低学习率可以不用写
// 若迭代次数不为零,则学习率为最高学习率,且必须输入最低学习率
接下来是学习实例,每个学习实例2行:
第一行:输入的n(1)个数
第二行:期望的输出
再接下来是M个测试输入
测试输入
N<=40,M<=100
n(i)<=10
3<=layer_count<=10
0<η<1,推荐0.3<=η<=0.9
输入:[0,1]
注意:误差E[j,k]=1/2*(y*[j,k]-y[j,k])^2<=ε
输出文件:BP.out
第一行:总迭代次数
接下来N行:对应每个学习实例的输出和测试输入的输出
接下来为所有权值
}
uses
SysUtils,
Windows,
ClassFunctionsUnit in 'ClassFunctionsUnit.pas';
{ Global Variables }
var
yita,epsilon,min_yita,delta_yita:Extended;
layer_count,t,k,instance_count,total_time,ExtraCount:integer;
// t - 迭代次数,k - 学习实例序号,total_time - 总迭代次数
func:TFunctions;
n:array[1..10] of integer; // 每层的神经元个数
instances:array[1..140] of record // 学习实例
X,Y:array[1..10] of Extended;
end;
W:array[1..9] of array[1..10,1..10] of Extended;
IO_map:array[1..10,1..10] of record
I,Extended;
end;
E:array[1..10] of Extended; // E - 神经网络输出误差
delta:array[1..10,1..10] of Extended;
{ Global Procedures }
procedure LoadFromFile;
var F:TextFile;
FileName:String;
i,j:integer;
begin
AssignFile(F,'BP.in');
Reset(F);
Readln(F,FileName);
func:=TFunctions.Create(FileName);
Read(F,layer_count);
for i:=1 to layer_count do
read(f,n[i]);
Readln(F);
Read(F,epsilon);
read(F,yita);
Read(F,instance_count);
Read(F,ExtraCount);
Read(F,total_time);
if total_time>0 then Read(F,min_yita);
Readln(F);
for i:=1 to instance_count do
begin
for j:=1 to n[1] do
read(f,instances[i].X[j]);
Readln(F);
for j:=1 to n[layer_count] do
read(F,Instances[i].Y[j]);
Readln(F);
end;
if ExtraCount>0 then
for i:=instance_count+1 to ExtraCount+instance_count do
begin
for j:=1 to n[1] do
read(f,instances[i].X[j]);
Readln(F);
end;
CloseFile(F);
end;
procedure MapIO;forward;
procedure WriteResultToFile;
var F:TextFile;
i,j,r:integer;
begin
AssignFile(F,'BP.out');
Rewrite(F);
Writeln(F,t-1);
//for k:=1 to instance_count do
k:=1;
while k<=instance_count+ExtraCount do
begin
MapIO;
if n[1]>1 then
for i:=1 to n[1]-1 do
write(F,Format('%f,',[Instances[k].X[i]]));
write(F,Format('%f',[Instances[k].X[n[1]]]));
write(F,' --> ');
if n[layer_count]>1 then
for i:=1 to n[layer_count]-1 do
write(F,Format('%f,',[IO_map[layer_count,i].O]));
writeln(F,Format('%f',[IO_map[layer_count,n[layer_count]].O]));
k:=k+1;
end;
for i:=1 to layer_count-1 do
for j:=1 to n[i] do
for r:=1 to n[i+1] do
Writeln(F,Format('w(%d,%d->%d,%d): %f',[i,j,i+1,r,W[i][j,r]]));
CloseFile(F);
end;
procedure Init;
var i,j,r:integer;
begin
// init W
for i:=1 to layer_count-1 do
for j:=1 to n[i] do
for r:=1 to n[i+1] do
W[i][j,r]:=Random(100)/1000;
//init t,k
t:=1;
k:=1;
// init delta_yita
if total_time>0 then
delta_yita:=(yita-min_yita)/total_time
else delta_yita:=0;
end;
function computeIn(layer,q:integer):Extended;
{ TEST OK }
// 计算layer层第q个神经元的输入
var j:integer;
a,b:Extended;
begin
if layer=1 then
begin
Result:=Instances[k].X[q];
Exit;
end;
Result:=0;
for j:=1 to n[layer-1] do
begin
a:=IO_map[layer-1,j].O;
b:=W[layer-1][j,q];
Result:=Result+a*b;
end;
end;
{ MapIO 搞定所有神经元的输入输出值 }
procedure MapIO;
var i,j:integer;
begin
for i:=1 to layer_count do
for j:=1 to n[i] do
begin
IO_map[i,j].I:=computeIn(i,j);
if i=1 then
IO_map[i,j].=func.layer1(IO_map[i,j].I)
else begin
if i=layer_count then
IO_map[i,j].=func.last_layer(IO_map[i,j].I)
else IO_map[i,j].=func.middle_layer(IO_map[i,j].I);
end;
end;
end;
{ computeE 计算神经网络的输出误差,在
调用该过程前要先MapIO }
procedure computeE;
var i:integer;
begin
for i:=1 to n[layer_count] do
E[i]:=sqr(Instances[k].Y[i]-IO_map[layer_count,i].O)/2;
end;
procedure computeDelta;
{ maybe test OK }
var i,j,r:integer;
x:Extended;
begin
for i:=1 to n[layer_count] do
delta[layer_count,i]:=(IO_map[layer_count,i].O-Instances[k].Y[i])*
func.d_last_layer(IO_map[layer_count,i].I);
for i:=layer_count-1 downto 1 do
for j:=1 to n[i] do
begin
x:=0;
for r:=1 to n[i+1] do
x:=x+delta[i+1,r]*W[i][j,r];
if i>1 then
// middle layer
x:=x*func.d_middle_layer(IO_map[i,j].I)
else // first layer
x:=x*func.d_layer1(IO_map[i,j].I);
delta[i,j]:=x;
end;
end;
procedure makeWChange;
{ maybe Test OK }
var deltaW:Extended;
i,j,r:integer;
begin
for i:=1 to layer_count-1 do
for j:=1 to n[i] do
for r:=1 to n[i+1] do
begin
deltaW:=-yita*delta[i+1,r]*IO_map[i,j].O;
W[i][j,r]:=W[i][j,r]+deltaW;
end;
end;
function isInRange:Boolean;
var i:integer;
begin
Result:=True;
for i:=1 to n[layer_count] do
if E[i]>epsilon then begin Result:=False; break; end;
end;
function isAllInRange:Boolean;
var old_k:integer;
begin
old_k:=k;
k:=1;
Result:=True;
while (k<=instance_count)and(k<>old_k) do
// 增加几行代码,减少了不少不必要的浮点运算 :)
begin
MapIO;
computeE;
if not isInRange then
begin
Result:=False;
Break;
end;
k:=k+1;
end;
k:=old_k;
MapIO;
computeE;
if not isInRange then
Result:=False;
end;
procedure MainCompute;
begin
while true do
begin
if (total_time>0) and (t>total_time) then break;
if isAllInRange then Break;
// MapIO; <-- included in isAllInRange
// computeE;
computeDelta;
makeWChange;
t:=t+1;
k:=((k+1) mod instance_count)+1;
yita:=yita-delta_yita;
end;
end;
begin
Randomize;
LoadFromFile;
Init;
MainCompute;
WriteResultToFile;
func.Free;
end.
////////////////////file: ClassFunctionsUnit.pas/////////////////////////
unit ClassFunctionsUnit;
interface
type
TFunction=function (input:Extended):Extended;stdcall;
TFunctions=class // 这个类定义了所有的传递函数以及他们的导数
private
DLLHandle:Cardinal;
public
layer1:TFunction; //输入层传递函数
d_layer1:TFunction; //输入层传递函数的导数
middle_layer:TFunction; //隐层传递函数
d_middle_layer:TFunction; //隐层传递函数的导数
last_layer:TFunction; //输出层传递函数
d_last_layer:TFunction; //输出层传递函数的导数
//所有的这些都是在Create的时候从动态连接库导入
//若DLL读入失败,则使用默认
constructor Create(DLLFileName:string);
destructor Destroy;override;
end;
implementation
uses Windows;
{ Default Functions }
function TDefaultFunctions_d_last_layer(input: Extended): Extended;stdcall;
begin
Result:=1;
end;
function TDefaultFunctions_d_layer1(input: Extended): Extended;stdcall;
begin
Re
没有合适的资源?快使用搜索试试~ 我知道了~
常用算法集合
共143个文件
gif:59个
pdf:24个
htm:16个
需积分: 9 32 下载量 39 浏览量
2008-07-06
14:25:21
上传
评论
收藏 6.15MB RAR 举报
温馨提示
遗传 递归 A* 神经 蚁群 模拟退火 搜索算法 二叉树 贪心算法等<br>收集的资料,详细的介绍以上算法,大部分有源码实现
资源推荐
资源详情
资源评论
收起资源包目录
常用算法集合 (143个子文件)
customcss.aspx 124B
遗传算法应用 (2).caj 301KB
遗传算法应用(1).caj 231KB
遗传算法应用 (9).caj 132KB
遗传算法应用 (6).caj 110KB
遗传算法应用 (4).caj 104KB
遗传算法应用 (10).caj 54KB
遗传算法应用 (8).caj 53KB
遗传算法应用 (5).caj 52KB
遗传算法应用 (7).caj 25KB
遗传算法应用 (3).caj 22KB
style.css 6KB
style.css 5KB
style.css 4KB
STYLE.css 2KB
STYLE.css 2KB
STYLE.css 2KB
z_makefile.css 1KB
一种前馈神经网络算法.doc 154KB
200486233641529.gif 9KB
200486235422921.gif 9KB
200486235436543.gif 6KB
20048623377778.gif 5KB
200486233611863.gif 5KB
200486233636698.gif 5KB
idxlogo.gif 4KB
pds.gif 4KB
200486234111209.gif 4KB
20048623411632.gif 3KB
200486234116628.gif 3KB
PoweredByAsp.Net.gif 3KB
xfok_gif_003.gif 2KB
logo-kz.gif 2KB
xfok_gif_002.gif 2KB
xfok_gif_007.gif 2KB
100x30_Logo.gif 2KB
BlueTabRight.gif 923B
tree_line1.gif 848B
tree_line1.gif 848B
tree_line1.gif 848B
tree_line2.gif 845B
tree_line2.gif 845B
tree_line2.gif 845B
tree_line3.gif 844B
tree_line3.gif 844B
tree_line3.gif 844B
arrow3.gif 530B
arrow3.gif 530B
arrow3.gif 530B
xml.gif 429B
divider.gif 411B
xml(1).gif 404B
xfok_gif_005.gif 251B
s_02.gif 239B
s2.gif 208B
TEAM.gif 115B
TEAM.gif 115B
TEAM.gif 115B
xfok_gif_016.gif 113B
xfok_gif_011.gif 96B
tree_folder4.gif 85B
tree_folder4.gif 85B
tree_folder4.gif 85B
ContractedSubBlock.gif 85B
ExpandedSubBlockStart.gif 83B
tree_folder3.gif 82B
arrow.gif 82B
tree_folder3.gif 82B
arrow.gif 82B
tree_folder3.gif 82B
arrow.gif 82B
ContractedBlock.gif 80B
ExpandedBlockStart.gif 79B
ExpandedSubBlockEnd.gif 71B
ExpandedBlockEnd.gif 68B
dot.gif 59B
None.gif 59B
bg.gif 44B
算法经典解释 .htm 148KB
二分图最大匹配的三种方法及代码.htm 68KB
VC知识库BLOG-小刀人-“背包问题”的递归算法.htm 56KB
BP神经网络的设计实例.htm 45KB
3个神经元的hopfield网络.htm 35KB
LVQ模式分类网络的设计.htm 34KB
递归算法及其应用.htm 22KB
递归查找目录树.htm 19KB
递归算法.htm 16KB
百度递归算法.htm 7KB
classtree.htm 5KB
classtree.htm 5KB
classtree.htm 5KB
CTreeCtrl的递归算法应用.htm 3KB
stat.htm 3KB
Click.htm 46B
m9.jpg 3KB
plogo1.jpg 3KB
stm31.js 33KB
stm31.js 33KB
stm31.js 33KB
1.js 267B
共 143 条
- 1
- 2
资源评论
gfkd_ly
- 粉丝: 0
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功