⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 231.cpp

📁 模式识别----模式识别中势函数分类算法。。例子源码。对样本进行学习生成势函数
💻 CPP
字号:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <iostream.h>
#include <math.h>

#define n 6
#define m 30
#define d 3

//样本结构
struct sample {
	int x[d];
	int cl;
};
//势函数标识与索引结构
struct func {
	int symbol;
	int index;
};

struct shi{
	int sub[3];
};

//函数声明
void shifunc();
void ceshi(int x1, int x2, int x3);

struct shi lei[2];
struct func ftbl[m];
int k,r=-1,tag=1,i,j;
double g=0,temp;
struct sample s[10];//={{1,2,5,1},{1,1,2,1},{3,3,6,1},{5,6,10,2},{7,6,11,2},{8,7,12,2}};
const char FILE_NAME[] = "io.txt";



void main()
{
	int count=0;
	FILE *fp;
	int ch,ch2;
	int curr;
	
	//打开样本文件
	if((fp=fopen(FILE_NAME,"rb"))==NULL){
		std::cerr<<"很遗憾!无法打开文件-> "<<FILE_NAME<<" -_-\n";
		exit(0);
	}
	//打印样本
	i=0;
	cout<<"从"<<FILE_NAME<<"读取样本....\n";
	while(i<n){
		
		cout<<"样本"<<i+1<<":\t";
		for(int iii=0;iii<4;++iii){
			ch=fgetc(fp);
			ch2=fgetc(fp);
			//个位与十位
			if(ch2==' ') 
				curr=ch-'0';
			else 
				curr=(ch-'0')*10+ch2-'0';
			
			cout<<curr<<" ";
			if((iii+1)%4==0) cout<<"\n";
			if(iii==3) 
				s[i].cl=curr;//类别
			else 
				s[i].x[iii]=curr;//x1,x2,x3
		}
		++i;
		++count;
	}
	//cout<<"样本个数:from "<<FILE_NAME<<" is "<<count<<"\n";
	fclose(fp);
	
	cout<<"\n\n\n样本输出:\n";
	for(i=0;i<n;++i){
		for(j=0;j<4;++j)
		{
			if(j==3)
				cout<<s[i].cl;
			else cout<<s[i].x[j];
			cout<<" ";
			if((j+1)%4==0) cout<<"\n";
		}
	}
	shifunc();
	ceshi(2,3,5);
	ceshi(6,7,10);
	int q,w,e;
	while(1){
	cout<<"NEW:";
	cin>>q>>w>>e;
	ceshi(q,w,e);
	}
	for (int o=0;o<2;o++)
	{
		for(int p=0;p<3;p++)
			cout<<lei[o].sub[p]<<"\t";
		cout<<"\n";
	}
//	int i=2;
//	cout<<sqr(i)<<endl;
	return;
}

void shifunc()
{
	while(tag==1)
	{	tag=0;
		for(k=0;k<n;k++)
		{
			if(r==-1){r++;
					ftbl[r].symbol=1;
					ftbl[r].index=0;
					continue;
			}
			else{g=0;
				for(i=0;i<=r;i++)
				{
					temp=0;
					for(j=0;j<d;j++)
						temp+=(s[k].x[j]-s[ftbl[i].index].x[j])*(s[k].x[j]-s[ftbl[i].index].x[j]);
					g+=ftbl[i].symbol*exp(-temp);
				}
				if((g>0 && s[k].cl==1)||(g<0&&s[k].cl==2))continue;
				else{
					r++;ftbl[r].index=k;tag=1;
					if(g>0 && s[k].cl==2)
						ftbl[r].symbol=-1;
					else if(g<0&&s[k].cl==1)
						ftbl[r].symbol=1;
				}
			}
		}
	}
	cout<<"势函数:\n";
	system("color 6");
	for(i=0;i<=r;i++)
	{
	  if(ftbl[i].symbol==1)
		if(i==0)cout<<"exp{-[(x1";
		else cout<<"+exp{-[(x1";
	  else
		  cout<<"-exp{-[(x1";

	  if(s[ftbl[i].index].x[0]>0)
	  {
		  cout<<"-"<<s[ftbl[i].index].x[0]<<")^2+(x2";
		  lei[i].sub[0]=s[ftbl[i].index].x[0];
		  //cout<<lei[i].sub[0]<<"\n";
	  }
	  else if(s[ftbl[i].index].x[0]<0)
	  {
		  cout<<"+"<<-s[ftbl[i].index].x[0]<<")^2+(x2";
		  lei[i].sub[0]=s[ftbl[i].index].x[0];
	  }
	  else cout<<")^2+(x2";

	  if(s[ftbl[i].index].x[1]>0)
	  {
		  cout<<"-"<<s[ftbl[i].index].x[1]<<")^2+(x3";
		  lei[i].sub[1]=s[ftbl[i].index].x[1];
	  }
	  else if(s[ftbl[i].index].x[1]<0)
	  {
		  cout<<"+"<<-s[ftbl[i].index].x[0]<<")^2+(x3";
		  lei[i].sub[1]=s[ftbl[i].index].x[1];
	  }
	  else cout<<")^2+(x2";

	  if(s[ftbl[i].index].x[2]>0)
	  {
		  cout<<"-"<<s[ftbl[i].index].x[2]<<")^2]}";
		  lei[i].sub[2]=s[ftbl[i].index].x[2];
	  }
	  else if(s[ftbl[i].index].x[2]<0)
	  {
		  cout<<"+"<<-s[ftbl[i].index].x[0]<<")^2]}";
		   lei[i].sub[2]=s[ftbl[i].index].x[2];
	  }
	  else cout<<")^2]}";
	}
	cout<<"\n";
}

void ceshi(int x1, int x2, int x3)
{
	int rs, rs1, rs2;
	rs1=-((x1-1)*(x1-1)+(x2-2)*(x2-2)+(x3-5)*(x3-5));
	//rs1=-((x1-lei[0].sub[0])*(x1-lei[0].sub[0])+(x2-lei[0].sub[1])*(x2-lei[0].sub[1])+(x3-lei[0].sub[2])*(x3-lei[0].sub[2]));
	rs2=-((x1-5)*(x1-5)+(x2-6)*(x2-6)+(x3-10)*(x3-10));
	//rs1=-((x1-lei[1].sub[0])*(x1-lei[1].sub[0])+(x2-lei[1].sub[1])*(x2-lei[1].sub[1])+(x3-lei[1].sub[2])*(x3-lei[1].sub[2]));
	rs=rs1-rs2;
	if(rs>0)
		cout<<"新样本:"<<x1<<"\t"<<x2<<"\t"<<x3<<"\t"<<"属于样本类1\n";
	else if(rs<0)
		cout<<"新样本:"<<x1<<"\t"<<x2<<"\t"<<x3<<"\t"<<"属于样本类2\n";

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -