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

📄 gfdlg.cpp

📁 用vc++编写的遗传算法程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// GFDlg.cpp : implementation file
//

#include "stdafx.h"
#include "GF.h"
#include "GFDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#include "help.h"
#include "process.h"
#include "iostream.h"
#include <stdio.h>
#include <math.h>
#include "stdlib.h"
#define StackMaxSize 50
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CGFDlg dialog

CGFDlg::CGFDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CGFDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CGFDlg)
	m_function = _T("x*sin(31.4*x+y)+2.0");
	m_pc = 0.5;
	m_pm = 0.05;
	m_maxgen = 100;
	m_popsize = 50;
	m_l = 6;
	m_min = -1;
	m_max = 2;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CGFDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGFDlg)
	DDX_Control(pDX, IDC_BUTTON1, m_help);
	DDX_Control(pDX, IDC_LIST2, m_output3);
	DDX_Control(pDX, IDC_COMBO1, m_change);
	DDX_Control(pDX, IDC_EDIT18, m_output1);
	DDX_Control(pDX, IDC_LIST1, m_output2);
	DDX_Text(pDX, IDC_EDIT1, m_function);
	DDX_Text(pDX, IDC_EDIT2, m_pc);
	DDX_Text(pDX, IDC_EDIT3, m_pm);
	DDX_Text(pDX, IDC_EDIT4, m_maxgen);
	DDX_Text(pDX, IDC_EDIT5, m_popsize);
	DDX_Text(pDX, IDC_EDIT19, m_l);
	DDX_Text(pDX, IDC_EDIT20, m_min);
	DDX_Text(pDX, IDC_EDIT21, m_max);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CGFDlg, CDialog)
	//{{AFX_MSG_MAP(CGFDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_EN_CHANGE(IDC_EDIT1, OnChange_function)
	ON_EN_CHANGE(IDC_EDIT2, OnChange_pc)
	ON_EN_CHANGE(IDC_EDIT3, OnChange_pm)
	ON_EN_CHANGE(IDC_EDIT4, OnChange_maxgen)
	ON_EN_CHANGE(IDC_EDIT5, OnChange_popsize)
	ON_EN_CHANGE(IDC_EDIT18, OnChange_output1)
	ON_LBN_SELCHANGE(IDC_LIST1, OnSelchange_output2)
	ON_CBN_EDITCHANGE(IDC_COMBO1, OnEditchangeCombo_chanshu)
	ON_EN_CHANGE(IDC_EDIT19, OnChangeEdit_l)
	ON_EN_CHANGE(IDC_EDIT20, OnChangeEdit_min)
	ON_EN_CHANGE(IDC_EDIT21, OnChangeEdit_max)
	ON_LBN_SELCHANGE(IDC_LIST2, OnSelchangeList_change)
	ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo_chanshu)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton_help)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGFDlg message handlers

BOOL CGFDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
    
	m_change.AddString("z");
   	m_change.AddString("y");
	m_change.AddString("x");
	m_change.InsertString(-1,"e");
	m_change.InsertString(-1,"f");
	m_change.InsertString(-1,"g");
	m_change.InsertString(-1,"h");

	m_change.SetCurSel(0);
    chanshu[0].c='x';
	chanshu[0].m_min=-1;
    chanshu[0].m_max=2;
	chanshu[0].l=21;
    for(int i=1;i<7;i++)
		chanshu[i].l=0;
   

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	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);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CGFDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CGFDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CGFDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////接收函数////////////////////////////////

struct Stack{
	float stack[StackMaxSize];
	int top;
};
void InitStack(Stack&s)
{
	s.top=-1;
}
int StackEmpty(Stack&s)
{
	if(s.top==-1)return 0;
	else return 1;
}

void Push(Stack&s,const float item)
{
	if(s.top==StackMaxSize-1){
		exit(1);
	}
	s.top++;
	s.stack[s.top]=item;
}
float Pop(Stack &s)
{
	if(s.top==-1)exit(1);
	float temp=s.stack[s.top];
	s.top--;
	return temp;
}
////////////////////////////////////////////////////////////////////
////////////////////////////////字符////////////////////////////////
struct Stack_c{
	char stack[StackMaxSize];
	int top;
};
void InitStack_c(Stack_c&s)
{
	s.top=-1;
}
int StackEmpty_c(Stack_c&s)
{
	if(s.top==-1)return 0;
	else return 1;
}

void Push_c(Stack_c&s,const char item)
{
	if(s.top==StackMaxSize-1){
		exit(1);
	}
	s.top++;
	s.stack[s.top]=item;
}
char Peek_c(Stack_c &s)
{
	return s.stack[s.top];
}
char Pop_c(Stack_c &s)
{
	if(s.top==-1)exit(1);
	char temp=s.stack[s.top];
	s.top--;
	return temp;
}
int Precedence(char op)
{
	switch(op)
	{
	case'+':
	case'-':return 1;
	case'*':
	case'^':
    case'/':return 2;
    case'(':
    
    case'@':return 0;

	}
}
float ater(char ch)
{
                if(ch=='0'){return 0;}
		        else if(ch=='1'){return 1;}
			    else if(ch=='2'){return 2;}
				else if(ch=='3'){return 3;}
				else if(ch=='4'){return 4;}
				else if(ch=='5'){return 5;}
				else if(ch=='6'){return 6;}
				else if(ch=='7'){return 7;}
				else if(ch=='8'){return 8;}
				else if(ch=='9'){return 9;}
}
float Compute(CString l,double x,double y,double z,double e,double f,double g,double h)
{
	l=l+'@';
	Stack s;
	InitStack(s);
	//double x=0.5,y=-0.5,z=0.5;
	char ch;
	float save;
	int i=0;
	while(l.GetAt(i)!='@'){
	//for(int i=0;i<l.GetLength();i++){
	   ch=l.GetAt(i++);
	   switch(ch){
       case 's':
		   //Pop(s);
		   save=sin(Pop(s));
		   Push(s,save);
		   break;
	   case 'c':
            //Pop(s);
		   save=cos(Pop(s));
		   Push(s,save);
		   break;
	   case 'a':
		   // Pop(s);
		   save=atan(Pop(s));
		   Push(s,save);
		   break;
	   case 't':
		   //Pop(s);
		   save=tan(Pop(s));
		   Push(s,save);
		   break;
	   case '+':
		   save=Pop(s)+Pop(s);
		   Push(s,save);
           break;
	   case '-':
		   save=Pop(s);
		   save=Pop(s)-save;
		   Push(s,save);
           break;
	   case '*':
		   save=Pop(s)*Pop(s);
		   Push(s,save);
           break;
	   case '^':
		   save=Pop(s);
		   save=pow(Pop(s),save);
		   Push(s,save);
		   break;
	   case '/':
		   save=Pop(s);
		   if(save!=0)
			   save=Pop(s)/save;
		   else exit(1);
		   Push(s,save);
           break;
	   default: 
		        
                save=0;
				while(ch!=' '){
				if(ch=='0'){save=save*10;}
		        else if(ch=='1'){save=save*10+1;}
			    else if(ch=='2'){save=save*10+2;}
				else if(ch=='3'){save=save*10+3;}
				else if(ch=='4'){save=save*10+4;}
				else if(ch=='5'){save=save*10+5;}
				else if(ch=='6'){save=save*10+6;}
				else if(ch=='7'){save=save*10+7;}
				else if(ch=='8'){save=save*10+8;}
				else if(ch=='9'){save=save*10+9;}
				else if(ch=='x'){Push(s,x);}
				else if(ch=='y'){Push(s,y);}
				else if(ch=='z'){Push(s,z);}
				else if(ch=='e'){Push(s,e);}
				else if(ch=='f'){Push(s,f);}
				else if(ch=='g'){Push(s,g);}
				else if(ch=='h'){Push(s,h);}
				else if(ch=='.')
				{
					int n=10;
				    while(l.GetAt(i)!=' ')
					{
						ch=l.GetAt(i++);
						save=save+ater(ch)/n;
						n=n*10;
						ch=l.GetAt(i);
					}
				}
				ch=l.GetAt(i++);
				}
				if(save)Push(s,save);
	   }
     }
       return s.stack[0];
}
CString  Change(CString s1)
{
	char p=' ';
    int m=0;
	CString s2,s3="";
	s1=s1+'@';
    while(p!='@'){
		p=s1.GetAt(m);
		s3=s3+s1.GetAt(m);
		if(p=='s'||p=='c'||p=='a'||p=='t')m=m+2;
        m++;
	}
    s1=s3;



	Stack_c r;
	InitStack_c(r);
	Push_c(r,'@');
	int i=0;
	char ch=s1[i];
	while(ch!='@')
	{
		if(ch=='('){
			Push_c(r,ch);
			ch=s1.GetAt(++i);
		}
		else if(ch=='s'||ch=='c'||ch=='a'||ch=='t')
		{
			
		Push_c(r,ch);
         
			
			ch=s1.GetAt(++i);
		}
		else if(ch==')'){
			while(Peek_c(r)!='(')
			{
				s2=s2+Pop_c(r);
				s2=s2+' ';
				
	
			}
			Pop_c(r);
			char temp=Peek_c(r);
			if(temp=='s'||temp=='c'||temp=='a'||temp=='t'){
				s2=s2+temp+' ';
			    Pop_c(r);
			}
			ch=s1.GetAt(++i);
		}
		else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='^')
		{
			char w=Peek_c(r);
			while(Precedence(w)>=Precedence(ch))
			{
				s2=s2+w;
				s2=s2+' ';
				
			
				Pop_c(r);
				w=Peek_c(r);
			}
			Push_c(r,ch);
			ch=s1.GetAt(++i);
		}
		else{
			while(ch=='0'||ch=='1'||ch=='2'||ch=='3'||ch=='4'||ch=='5'||ch=='5'||ch=='6'||ch=='7'||ch=='8'||ch=='9'||ch=='.'||ch=='x'||ch=='y'||ch=='z'||ch=='e'||ch=='f'||ch=='g'||ch=='h')
            {
				s2=s2+ch;
				ch=s1.GetAt(++i);
			}
			s2=s2+' ';
		}
	}
      ch=Pop_c(r);
	  while(ch!='@'){
		  s2=s2+ch;
		  s2=s2+' ';
		 
		  ch=Pop_c(r);
	  }
	  return s2;
}




///////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////遗传算法开始/////////////////////////////////////////



////////////////////////////产生[0 1]的随机数 /////////////////


void CGFDlg::initmalloc()     /*为全局数据变量分配空间 */

⌨️ 快捷键说明

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