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

📄 gene.cpp

📁 GEP(基因表达式程序设计)是一种新的演化算法
💻 CPP
字号:
// Gene.cpp: implementation of the Gene class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Gene.h"

#include <string.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Gene::Gene()
{

}

Gene::~Gene()
{

}

Gene::Gene(const char s[],int &p)
{
	strcpy(str,s);
	Dclength=p;
	cout<<"Initi:"<<str<<endl;
	outlength=0;
	aresult=0.0;
	nodepoint=0;
	begin=0;
}

void Gene::Insert()
{
	btree *p;
	btree *queue[34];
	int front,rear;

	head.data=str[0];
	head.left=NULL;head.middle=NULL;head.right=NULL;
	cout<<"Layer:"<<head.data;
	front=-1;
	rear=0;
	queue[rear]=&head;
	nodepoint=0;
	while(front!=rear)
	{
		front++;
		p=queue[front];
		if(p->data=='I'){
			node[nodepoint].data=str[rear+1];
			node[nodepoint].left=NULL;node[nodepoint].middle=NULL;node[nodepoint].right=NULL;
			p->left=&node[nodepoint];
			queue[rear+1]=p->left;
			cout<<node[nodepoint].data;
			nodepoint++;
			node[nodepoint].data=str[rear+2];
			node[nodepoint].left=NULL;node[nodepoint].middle=NULL;node[nodepoint].right=NULL;
			p->middle=&node[nodepoint];
			queue[rear+2]=p->middle;
			cout<<node[nodepoint].data;
			nodepoint++;
			node[nodepoint].data=str[rear+3];
			node[nodepoint].left=NULL;node[nodepoint].middle=NULL;node[nodepoint].right=NULL;
			p->right=&node[nodepoint];
			queue[rear+3]=p->right;
			cout<<node[nodepoint].data;
			nodepoint++;
			rear+=3;
		}
		else if(p->data=='+'||p->data=='-'||p->data=='*'||p->data=='/')
		{
			node[nodepoint].data=str[rear+1];
			node[nodepoint].left=NULL;node[nodepoint].middle=NULL;node[nodepoint].right=NULL;
			p->left=&node[nodepoint];
			queue[rear+1]=p->left;
			cout<<node[nodepoint].data;
			nodepoint++;
			node[nodepoint].data=str[rear+2];
			node[nodepoint].left=NULL;node[nodepoint].middle=NULL;node[nodepoint].right=NULL;
			p->middle=NULL;
			p->right=&node[nodepoint];
			queue[rear+2]=p->right;
			cout<<node[nodepoint].data;
			nodepoint++;
			rear+=2;
		}
		else if(p->data=='L'||p->data=='E'||p->data=='Q'||p->data=='~'||p->data=='S'||p->data=='C'||p->data=='T')
		{
			node[nodepoint].data=str[rear+1];
			node[nodepoint].left=NULL;node[nodepoint].middle=NULL;node[nodepoint].right=NULL;
			p->left=&node[nodepoint];p->middle=NULL;p->right=NULL;
			queue[rear+1]=p->left;
			cout<<node[nodepoint].data;
			nodepoint++;
			rear+=1;
		}
		else {p->left=NULL;p->middle=NULL;p->right=NULL;}
	}
	cout<<endl;
	headpoint=&head;
}

void Gene::Postorder(const btree *headpoint)
{
	if(headpoint!=NULL){
		if(headpoint->left!=NULL)Postorder(headpoint->left);
		if(headpoint->middle!=NULL)Postorder(headpoint->middle);
		if(headpoint->right!=NULL)Postorder(headpoint->right);
		//cout<<headpoint->data;
		output[outlength++]=headpoint->data;
	}
	else return;
}

void Gene::Result(const double Dc[],const double *tenvary)
{
	double temp;
	char   string[35];
	double number[34];
	int i,flag,position,begin;  //begin为Dc[]的下标指针

	output[outlength]='\0';
	cout<<"posto:"<<output<<endl;      
	flag=0;
	position=0;
	begin=0;

	while(output[position]!='\0'&&output[position]!='\n'&&position<outlength){
		string[flag]=output[position];
		if(string[flag]=='a'||string[flag]=='b'||string[flag]=='c'||string[flag]=='d'||string[flag]=='e'||string[flag]=='f')
		{
			if(string[flag]=='a'){
				number[flag]=tenvary[0];
				flag++;
				position++;
			}
			else if(string[flag]=='b'){
				number[flag]=tenvary[1];
				flag++;
				position++;
			}
			else if(string[flag]=='c'){
				number[flag]=tenvary[2];
				flag++;
				position++;
			}
			else if(string[flag]=='d'){
				number[flag]=tenvary[3];
				flag++;
				position++;
			}
			else if(string[flag]=='e'){
				number[flag]=tenvary[4];
				flag++;
				position++;
			}
			else if(string[flag]=='f'){
				number[flag]=tenvary[5];
				flag++;
				position++;
			}
		}
		else if(string[flag]=='?')
		{
			if(begin<23)number[flag]=Dc[begin++];
			else{
				number[flag]=Dc[0];
				//cout<<"error!!"<<endl;
			}
			flag++;
			position++;
		}
		else if(string[flag]=='I')
		{
			if(number[flag-3]>0)temp=number[flag-2];
			else temp=number[flag-1];
			flag-=3;
			number[flag]=temp;
			flag++;
			position++;
		}
		else if(string[flag]=='L'||string[flag]=='E'||string[flag]=='Q'||string[flag]=='~'||string[flag]=='S'||string[flag]=='C'||string[flag]=='T')
		{
			if(string[flag]=='L'){
				if(number[flag-1]>0)temp=logl(number[flag-1]);
				else temp=logl(-number[flag-1]);
			}
			else if(string[flag]=='E'){
				if(number[flag-1]<354)temp=expl(number[flag-1]);
				else temp=-1.0;
			}
			else if(string[flag]=='Q'){
				if(number[flag-1]>=0)temp=sqrtl(number[flag-1]);
				else temp=sqrtl(-number[flag-1]);
			}
			else if(string[flag]=='~'){
				if(number[flag-1]<154)temp=powl(10,(number[flag-1]));
				else temp=-1.0;
			}
			else if(string[flag]=='S')temp=sinl(number[flag-1]);
			else if(string[flag]=='C')temp=cosl(number[flag-1]);
			else             		    temp=tanl(number[flag-1]);   //tan

			flag-=1;
			number[flag]=temp;
			flag++;
			position++;
		}
		else
		{
			i=flag;
			switch(output[position])
			{
			case '+':
				{
					if(number[i-2]<(4.0e+306)&&number[i-2]>(-4.0e+306)&&number[i-1]<(4.0e+306)&&number[i-1]>(-4.0e+306))
					{temp=(number[i-2])+(number[i-1]);break;}
					else {temp=-1.0;break;}
				}
			case '-':
				{
					if(number[i-2]<(4.0e+306)&&number[i-2]>(-4.0e+306)&&number[i-1]<(4.0e+306)&&number[i-1]>(-4.0e+306))
					{temp=(number[i-2])-(number[i-1]);break;}
					else {temp=-1.0;break;}
				}
			case '*':
				{
					if(number[i-2]<(9.0e+151)&&number[i-2]>(-9.0e+151)&&number[i-1]<(9.0e+151)&&number[i-1]>(-9.0e+151))
					{temp=(number[i-2])*(number[i-1]);break;}
					else {temp=-1.0;break;}
				}
			case '/':
				{
					if(number[i-2]>(-9.0e+151)&&number[i-1]<(9.0e+151)&&number[i-1]>(-9.0e+151)&&number[i-1]!=0&&number[i-2]<(9.0e+151))
					{temp=(number[i-2])/(number[i-1]);break;}
					else {temp=-1.0;break;}
				}
			default :break;
			}
			flag-=2;
			number[flag]=temp;
			flag++;
			position++;
		}
    }

    if(number[flag-1]<(4.0e+100)&&number[flag-1]>(-4.0e+100)&&flag>0)aresult=number[flag-1];
	else aresult=-1.0;
}

double & Gene::Displayresult()
{
	return aresult;
}


void Gene::Setbegin()
{
	begin=0;
}

void Gene::Ofdd(const btree *head,ofstream &of,const double Dc[])
{
   if(head!=NULL)
   {
	   if(head->data=='I'){
		   of<<"(if(";
		   Ofdd(head->left,of,Dc);
		   of<<")>0,then ";
		   Ofdd(head->middle,of,Dc);
		   of<<",else ";
		   Ofdd(head->right,of,Dc);
		   of<<")";
	   }
      else if(head->data=='E'||head->data=='~'||head->data=='S'||head->data=='C'||head->data=='T')
	  {
		  switch(head->data)
		  {
		  case 'E':of<<"exp";break;
		  case '~':of<<"10.^";break;
		  case 'S':of<<"sin";break;
		  case 'C':of<<"cos";break;			  
		  case 'T':of<<"tan";break;
		  default:break;
		  }
		  of<<"(";
		  Ofdd(head->left,of,Dc);
	      of<<")";
	  }
	  else if(head->data=='L'||head->data=='Q')
	  {
		  switch(head->data)
		  {
		  case 'L':of<<"log";break;
		  case 'Q':of<<"sqrt";break;
		  default:break;
		  }
		  of<<"(abs(";
		  Ofdd(head->left,of,Dc);
	      of<<"))";
	  }
	  else if(head->data=='+'||head->data=='-'||head->data=='*'||head->data=='/')
	  {
		  of<<"(";
		  Ofdd(head->left,of,Dc);
	      if(head->data=='*'||head->data=='/')of<<"."<<head->data;
		  else of<<head->data;
          Ofdd(head->right,of,Dc);
		  of<<")";
	  }
	  else if(head->data=='?')
	  {
		  if(begin<23)
		  {
			  if(Dc[begin]<0)of<<"("<<Dc[begin]<<")";
			  else of<<Dc[begin];
			  begin++;
		  }
		  else {
			  begin=0;
			  if(Dc[begin]<0)of<<"("<<Dc[begin]<<")";
			  else of<<Dc[begin];
			  begin++;
		  }
	  }
	  else 
		  of<<head->data;
   }
   else return;
}

int & Gene::Genejudge(const double Dc[],const double *tenvary)
{
	double temp;
	char   string[35];         //maxnode+1
	double number[34];         //maxnode
	int i,flag,position,begin;

	output[outlength]='\0';
	//cout<<output<<endl;      
	flag=0;
	position=0;
	begin=0;

	while(output[position]!='\0'&&output[position]!='\n'&&position<outlength)
	{
		string[flag]=output[position];
		if(string[flag]=='a'||string[flag]=='b'||string[flag]=='c'||string[flag]=='d'||string[flag]=='e'||string[flag]=='f')
		{
			if(string[flag]=='a'){
				number[flag]=tenvary[0];
				flag++;
				position++;
			}
			else if(string[flag]=='b'){
				number[flag]=tenvary[1];
				flag++;
				position++;
			}
			else if(string[flag]=='c'){
				number[flag]=tenvary[2];
				flag++;
				position++;
			}
			else if(string[flag]=='d'){
				number[flag]=tenvary[3];
				flag++;
				position++;
			}
			else if(string[flag]=='e'){
				number[flag]=tenvary[4];
				flag++;
				position++;
			}
			else if(string[flag]=='f')
			{
				number[flag]=tenvary[5];
				flag++;
				position++;
			}
		}
		else if(string[flag]=='?')
		{
			if(begin<23)number[flag]=Dc[begin++];
			else number[flag]=Dc[0];
			flag++;
			position++;
		}
		else if(string[flag]=='I')
		{
			if(number[flag-3]>0)temp=number[flag-2];
			else temp=number[flag-1];
			flag-=3;
			number[flag]=temp;
			flag++;
			position++;
		}
		else if(string[flag]=='L'||string[flag]=='E'||string[flag]=='Q'||string[flag]=='~'||string[flag]=='S'||string[flag]=='C'||string[flag]=='T')
		{
			if(string[flag]=='L'){
				if(number[flag-1]>0)temp=logl(number[flag-1]);
				else temp=logl(-number[flag-1]);
			}
			else if(string[flag]=='E'){
				if(number[flag-1]<354)temp=expl(number[flag-1]);
				else {legal=0;break;}
			}
			else if(string[flag]=='Q'){
				if(number[flag-1]>=0)temp=sqrtl(number[flag-1]);
				else temp=sqrtl(-number[flag-1]);
			}
			else if(string[flag]=='~'){
				if(number[flag-1]<154)temp=powl(10,(number[flag-1]));
				else {legal=0;break;}
			}
			else if(string[flag]=='S')temp=sinl(number[flag-1]);
			else if(string[flag]=='C')temp=cosl(number[flag-1]);
			else                      temp=tanl(number[flag-1]);

			flag-=1;
			number[flag]=temp;
			flag++;
			position++;
		}
		else
		{
			i=flag;
			if(string[flag]=='+')
			{
				if(number[i-2]<(4.0e+306)&&number[i-2]>(-4.0e+306)&&number[i-1]<(4.0e+306)&&number[i-1]>(-4.0e+306))
					temp=(number[i-2])+(number[i-1]);
				else {legal=0;break;}
			}
			else if(string[flag]=='-')
			{
				if(number[i-2]<(4.0e+306)&&number[i-2]>(-4.0e+306)&&number[i-1]<(4.0e+306)&&number[i-1]>(-4.0e+306))
					temp=(number[i-2])-(number[i-1]);
				else {legal=0;break;}
			}
			else if(string[flag]=='*')
			{
				if(number[i-2]<(9.0e+151)&&number[i-2]>(-9.0e+151)&&number[i-1]<(9.0e+151)&&number[i-1]>(-9.0e+151))
					temp=(number[i-2])*(number[i-1]);
				else {legal=0;break;}
			}
			else //if(string[flag]=='/')
			{
				if(number[i-2]>(-9.0e+151)&&number[i-1]<(9.0e+151)&&number[i-1]>(-9.0e+151)&&number[i-1]!=0&&number[i-2]<(9.0e+151))
					temp=(number[i-2])/(number[i-1]);
				else {legal=0;break;}
			}
			flag-=2;
			number[flag]=temp;
			flag++;
			position++;
		}
    }
    return legal;
}

⌨️ 快捷键说明

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