// demo.cpp
// 2004-05-06 by ShanLanshan
//
// 此程序用于测试神经元的库函数
// 它展示了怎样用这个库所生成的三层BP网络来求解那个臭名昭著的XOR问题
// 在Visual Stduio 2003上编译通过,要注意启动运行时信息的支持
// 并且在包含路径中添加这个库所在的目录
#include <stdio.h>
#include <assert.h>
#include <errno.h>
#include "public/ann/neuron.h"
#include "public/ann/bp/bpneuron.h"
#include "public/prob.h"
#include "public/ann/vec_container.h"
#include "public/ann/vector.h"
#include "public/ann/annfunc/annfunc.h"
#include <fstream>
using namespace ann;
static void build_sample(AnnVectorContainer *sample);
int main(int argc, char *argv[])
{
char s[1024];
const char *file = "C:\\bpnet.txt";
AnnFuncGroup *fg;
fg = annfunc_get("sign");
assert(fg != NULL);
BPNet net;
AnnVector vec_input, vec_output, vec_tutor, vec_env;
AnnVectorContainer sample;
std::ifstream is;
is.open(file);
if (is.is_open()) {
std::cout << "open file ok\n";
net << is;
} else {
net.init("2 * 2 * 1");
net >> std::cout;
net.mutual_conn();
prob_set_seed(0);
net >> std::cout;
net.random();
}
net >> std::cout;
std::cin >> s;
vec_env.set_size(net.get_interface_division());
vec_env.get_sub_vector(0, net.get_input_division(), &vec_input);
vec_env.get_sub_vector(net.get_input_division(), net.get_output_division(), &vec_tutor);
vec_output.set_size(net.get_output_division());
build_sample(&sample);
for (int i=0; i<500; ++i) {
vec_env = *(sample.get_vector());
net.set_input(&vec_input);
net.converse();
net.get_output(&vec_output);
fg->multi_main(vec_output.get_buffer(), vec_output.get_size(), NULL);
vec_output.release_buffer();
std::cout << "\n\nSample" << i << " " << vec_env << std::endl
<< "tutor : " << vec_tutor << std::endl
<< "output: " << vec_output << std::endl
<< std::endl;
net.learn(&vec_tutor);
}
net >> std::cout;
std::ofstream fs;
fs.open(file);
net >> fs;
std::cin >> s;
return 0;
}
static void build_sample(AnnVectorContainer *sample)
{
AnnVector vec;
int a [][3] = {
{-1, -1, 1},
{-1, 1, -1},
{1, -1, -1},
{1, 1, 1}
};
assert(sample != NULL);
vec.set_size(3);
for (int i=0; i<4; ++i) {
vec->set_element(0, a[i], 3);
sample->add(vec);
}
}