b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

ddx_cbstring_ddx在0轴之上图解_ddr和ddx

电脑杂谈  发布时间:2017-03-01 20:59:53  来源:网络整理
ddx_cbstringddx_cbstring

1

附录 C 基本算法

C.1 二进制编码的简单遗传算法源程序

// SCCADlg.cpp : implementation file

#include "stdafx.h"

#include "math.h"

#include "SCCA.h"

#include "SCCADlg.h"

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

#include "time.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// 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:

2

//{{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()

/////////////////////////////////////////////////////////////////////////////

// CSCCADlg dialog

CSCCADlg::CSCCADlg(CWnd* pParent /*=NULL*/)

: CDialog(CSCCADlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CSCCADlg)

m_N = 0;

m_c = 0;

m_ge = 0;

m_zz = 0.0;

m_x2 = 0.0;

m_x3 = 0.0;

m_x4 = 0.0;

m_x5 = 0.0;

m_y1 = 0.0;

m_y2 = 0.0;

m_y3 = 0.0;

m_y4 = 0.0;

m_y5 = 0.0;

3

m_fev = 0;

m_now = 0;

m_SP2 = _T("");

m_x1 = 0;

m_PP2 = _T("");

m_Pm = 0.0;

m_Pc = 0.0;

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CSCCADlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CSCCADlg)

DDX_Control(pDX, IDC_LIST1, m_PP);

DDX_Control(pDX, IDC_COMBO1, m_SP);

DDX_Text(pDX, IDC_EDIT1, m_N);

DDX_Text(pDX, IDC_EDIT2, m_c);

DDX_Text(pDX, IDC_EDIT3, m_ge);

DDX_Text(pDX, IDC_EDIT7, m_zz);

DDX_Text(pDX, IDC_EDIT9, m_x2);

DDX_Text(pDX, IDC_EDIT10, m_x3);

DDX_Text(pDX, IDC_EDIT11, m_x4);

DDX_Text(pDX, IDC_EDIT12, m_x5);

DDX_Text(pDX, IDC_EDIT13, m_y1);

DDX_Text(pDX, IDC_EDIT14, m_y2);

DDX_Text(pDX, IDC_EDIT15, m_y3);

DDX_Text(pDX, IDC_EDIT16, m_y4);

DDX_Text(pDX, IDC_EDIT17, m_y5);

DDX_Text(pDX, IDC_EDIT6, m_fev);

DDX_Text(pDX, IDC_EDIT18, m_now);

DDX_CBString(pDX, IDC_COMBO1, m_SP2);

DDX_Text(pDX, IDC_EDIT8, m_x1);

DDX_LBString(pDX, IDC_LIST1, m_PP2);

DDX_Text(pDX, IDC_EDIT4, m_Pm);

DDX_Text(pDX, IDC_EDIT19, m_Pc);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CSCCADlg, CDialog)

//{{AFX_MSG_MAP(CSCCADlg)

ON_WM_SYSCOMMAND()

4

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

ON_CBN_EDITCHANGE(IDC_COMBO1, OnEditchangeCombo1)

ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeSP)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CSCCADlg message handlers

BOOL CSCCADlg::OnInitDialog()

{

CDialog::OnInitDialog();

// 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 CSCCADlg::OnSysCommand(UINT nID, LPARAM lParam)

5

{

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 CSCCADlg::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 CSCCADlg::OnQueryDragIcon()

6

{

return (HCURSOR) m_hIcon;

}

void CSCCADlg::OnButton1()

{

// TODO: Add your control notification handler code here

Window();

//--------------------------------------------------------------

UpdateData();

//--------------------------------------------

if (m_SP2=="")

{

m_SP2="F005";

UpdateData(false);

}

if (m_N==0||m_ge==0||m_Pc==0||m_Pm==0)

{

m_N=100;

//m_c=5;

m_ge=100;

m_Pc=0.8;

m_Pm=0.15;

UpdateData(false);

} //设置默认参数

//--------------------------------------------------------------

int N=m_N;

int funn;

int c;

double Pc=m_Pc;

double Pm=m_Pm;

int ge=m_ge;

double vup,vdown,ting;

int i,j,k,L;

//===========================

if (m_SP2=="F001") //定义测试问题的变量区间

{

funn=1;

vup=0.5;

vdown=-0.5;c=1;

ting=100000000000000000;

}

else if (m_SP2=="F003")

{

7

funn=3;

vup=1;

vdown=-1;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F004")

{

funn=4;

vup=10;

vdown=-10;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F005")

{

funn=5;

vup=1;

vdown=-1;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F006")

{

funn=6;

vup=1;

vdown=-1;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F007")

{

funn=7;

vup=5.12;

vdown=-5.12;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F008")

{

funn=8;

vup=5.12;

vdown=-5.12;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F009")

{

funn=9;

vup=5.12;

8

vdown=-5.12;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F011")

{

funn=11;

vup=5.12;

vdown=-5.12;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F013")

{

funn=13;

vup=10;

vdown=-10;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F014")

{

funn=14;

vup=512;

vdown=-512;c=2;

ting=100000000000000000;

}

m_c=c;

UpdateData(false);

//--------------------------------------------------------------

//算法程序(输入变量:N 种群规模;funn 测试问题;c 变量维数;ge 最大进化代数;

// vup 变量上限;vdown 变量下限;ting 终止适应度值(如果没有请设置成足够大的数)

//输出变量:it 进化代数;guiji[]最优值进化轨迹;fev 评价次数

//--------------------------------------------------------------

int CL=20; //编码长度

int (*v)[100];

v=new int [300][100];

int (*vs)[100];

vs=new int [300][100];

double (*v1)[5];

v1 = new double [300][5];

int aa[100],bb[100];

double fa1[5];

double fit1[300],fit[300],guiji[10000];

9

double z=32768,max;

double abb;

int fev=0;int it=0,ab;

double sollution=-1*10000000;

double r[100], max1;

int maxhang[100],maxhang1[100];

//定义程序变量

srand( (unsigned)time( NULL ) );

//-------------------------------------------------------------

for (i=0;i<N;i++)

{

for (j=0;j<c*CL;j++)

{

abb=rand()/z;

if (abb<=0.5)

{

v[i][j]=0;

}

else

{

v[i][j]=1;

}

}

} //初始化二进制种群;

for (i=0;i<N;i++)

{

for (j=0;j<c;j++)

{

v1[i][j]=0;

for (k=0;k<CL;k++)

{

if (v[i][j*CL+k]==1)

{

v1[i][j]=v1[i][j]+pow(2,CL-k-1);

}

else

{

v1[i][j]=v1[i][j];

}

}

fa1[j]=v1[i][j]*(vup-vdown)/(pow(2,CL)-1)+vdown;

}

10

fit[i]=comfit(funn,c,fa1);

}//译码

fev=fev+N; //计算适应度值

max=fit[0];

for (i=1;i<N;i++)

{

if (max<fit[i])

{

max=fit[i];

for(j=0;j<c*CL;j++)

{

maxhang[j]=v[i][j];

}

}

}

while (it<ge&&sollution<ting)

{

for (i=0;i<N;i++)

{

for (j=0;j<c*CL;j++)

{

aa[j]=v[i][j];

}

fa1[1]=fit[i];

ab=rand()%N;

for (j=0;j<c*CL;j++)

{

bb[j]=v[ab][j];

}

fa1[2]=fit[ab];

if (fa1[1]<fa1[2])

{

for (j=0;j<c*CL;j++)

{

vs[i][j]=bb[j];

}

fit1[i]=fa1[2];

}

else

{

for (j=0;j<c*CL;j++)

{

11

vs[i][j]=aa[j];

}

fit1[i]=fa1[1];

}

}

v=vs;

for (i=0;i<N;i++)

{

fit[i]=fit1[i];

}

//联赛选择

//交叉

for (i=0;i<N;i++)

{

if(rand()/z<Pc)

{

for (j=0;j<c*CL;j++)

{

aa[j]=v[i][j];

}

ab=rand()%N;

for (j=0;j<c*CL;j++)

{

bb[j]=v[ab][j];

}

ab=rand()%(c*CL);

for (j=0;j<ab;j++)

{

aa[j]=bb[j];

}

for(j=0;j<c*CL;j++)

{

v[i][j]=aa[j];

}

}

}

//变异

for (i=0;i<N;i++)

{

for (L=0;L<c*CL;L++)

{

r[L]=rand()/z;

}

12

for (k=0;k<c*CL;k++)

{

if (r[k]<=Pm*1.000/(c*CL))

{

v[i][k]=1-v[i][k];

}

}

}

for (i=0;i<N;i++)

{

for (j=0;j<c;j++)

{

v1[i][j]=0;

for (k=0;k<CL;k++)

{

if (v[i][j*CL+k]==1)

{

v1[i][j]=v1[i][j]+pow(2,CL-k-1);

}

else

{

v1[i][j]=v1[i][j];

}

}

fa1[j]=v1[i][j]*(vup-vdown)/(pow(2,CL)-1)+vdown;

}

fit[i]=comfit(funn,c,fa1);

} //译码

fev=fev+N; //计算适应度值

//------------------------------------------------------------------

max1=fit[0];

for (i=1;i<N;i++)

{

if (max1<fit[i])

{

max1=fit[i];

for(j=0;j<c*CL;j++)

{

maxhang1[j]=v[i][j];

}

}

}

if (max<max1)

13

{

max=max1;

for(j=0;j<c*CL;j++)

{

maxhang[j]=maxhang1[j];

}

}

//输出结果:

sollution=max;

guiji[it]=sollution;

it=it+1;

m_now=it;

UpdateData(false);

}

//----------------------------

huatu();

huaquxian(it,guiji,fev);

//算法程序(输入变量:N 种群规模;funn 测试问题;c 变量维数;ge 最大进化代数

//输出变量:it 进化代数;guiji[]最优值进化轨迹;fev 评价次数

}

void CSCCADlg::Window()//界面的预处理

{

CClientDC dc1(this);

CString str1="";

dc1.SetTextColor(RGB(255,0,0));

dc1.TextOut(380,310,str1);

CClientDC shuazi(this);

CBrush sz(RGB(250,250,250));

CBrush *p_oldbrush;

p_oldbrush=shuazi.SelectObject(&sz);

CRect rect(225,15,600,253);

shuazi.FillRect(&rect,p_oldbrush);

}

void CSCCADlg::huatu()//画网格//四顶点坐标(228,22)(580,22)(228,250)(580,250)

{

CClientDC dc(this);

CPen a1(PS_DOT,1,RGB(255,255,0));

CPen *p_oldpen;

p_oldpen=dc.SelectObject(&a1);

//POINT points[3]={{10,150},{50,200},{70,160}};

14

//dc.Polyline(points,(ge-1));

dc.MoveTo(404,22);

dc.LineTo(404,250);

dc.MoveTo(228,136);

dc.LineTo(580,136);

dc.MoveTo(316,22);

dc.LineTo(316,250);

dc.MoveTo(228,79);

dc.LineTo(580,79);

dc.MoveTo(492,22);

dc.LineTo(492,250);

dc.MoveTo(228,193);

dc.LineTo(580,193);

dc.MoveTo(228,22);

dc.LineTo(580,22);

dc.MoveTo(580,22);

dc.LineTo(580,250);

CPen a2(PS_SOLID,1,RGB(0,0,0));

p_oldpen=dc.SelectObject(&a2);

dc.MoveTo(228,15);

dc.LineTo(228,250);

dc.MoveTo(228,250);

dc.LineTo(590,250);

dc.MoveTo(225,25);

dc.LineTo(228,15);

dc.MoveTo(228,15);

dc.LineTo(231,25);

dc.MoveTo(580,248);

dc.LineTo(590,250);

dc.MoveTo(590,250);

dc.LineTo(580,252);

dc.SelectObject(p_oldpen);

}

void CSCCADlg::huaquxian(int ab, double c[],int fev)//ab 是进化代数,fev 为计算函数值次数,c 为进化的轨迹(长为 a

的一维数组)

{

int ge=ab;

15

double gz=c[0];

double dx,dy;

int xo=228,yo=250;

int i;

if (c[0]!=c[ge-1])

{

dx=352.0/ge;

dy=228.0/(gz-c[ge-1]);

m_zz=c[ge-1];

m_fev=fev;

m_x1=1;

m_x2=floor(ge/4.0);

m_x3=floor(ge/2.0);

m_x4=floor(ge*3/4.0);

m_x5=ge;

m_y1=gz;

m_y2=gz-(gz-c[ge-1])/4.0;

m_y3=gz-(gz-c[ge-1])/2.0;

m_y4=gz-(gz-c[ge-1])*3/4.0;

m_y5=c[ge-1];

UpdateData(false);

for (i=1;i<ge;i++)

{

//------------------------------

CClientDC dc(this);

CPen a(PS_SOLID,2,RGB(255,0,0));

CPen *p_oldpen;

p_oldpen=dc.SelectObject(&a);

dc.MoveTo(xo+(i-1)*dx,yo+dy*(c[i-1]-c[0]));

dc.LineTo(xo+i*dx,yo+dy*(c[i]-c[0]));

dc.SelectObject(p_oldpen);//画图

//------------------------------

}

}

else

{

dx=352.0/ge;

dy=0;

m_zz=c[ge-1];

m_fev=fev;

m_x1=1;

m_x2=floor(ge/4.0);

m_x3=floor(ge/2.0);

m_x4=floor(ge*3/4.0);

16

m_x5=ge;

m_y1=0;

m_y2=0.5*c[ge-1];

m_y3=c[ge-1];

m_y4=1.5*c[ge-1];

m_y5=2*c[ge-1];

UpdateData(false);

CClientDC dc(this);

CPen a(PS_SOLID,2,RGB(255,0,0));

CPen *p_oldpen;

p_oldpen=dc.SelectObject(&a);

dc.MoveTo(228,135);

dc.LineTo(580,135);

dc.SelectObject(p_oldpen);//画图

}

CClientDC dc2(this);

CString str2="";

dc2.TextOut(380,310,str2);

}

double CSCCADlg::comfit(int funn,int vn,double v1i[])

//计算一个个体的适应度,funn 为函数序号,vn 为变量维数,v1i[]为一个个体

{

int i;double f1=0,f1h,f1m;

switch (funn)

{

case 1:

{

f1=10+(sin(1/v1i[0]))/((v1i[0]-0.16)*(v1i[0]-0.16)+0.1);

}

break;

case 3:

{

f1=pow(v1i[0],2)+pow(v1i[1],2)-0.3*cos(3*3.1415926535897931*v1i[0])+0.3*cos(4*3.1415926535897931*v1i[1])+0.3;

f1=-1*f1;

}

break;

case 4:

{

f1h=0;f1m=0;

for (i=1;i<6;i++)

{

17

f1h=f1h+i*cos((i+1)*v1i[0]+i);

f1m=f1m+i*cos((i+1)*v1i[1]+i);

}

f1=f1h*f1m;

f1=-1*f1;

}

break;

case 5:

{

f1=1+v1i[0]*sin(4*3.1415926*v1i[0])-v1i[1]*sin(4*3.1415926*v1i[1]+3.1415926)+sin(6*sqrt(v1i[0]*v1i[0]+v1i[1]*v1i[1]))/(

6*sqrt(v1i[0]*v1i[0]+v1i[1]*v1i[1])+pow(10,-15));

}

break;

case 6:

{

f1=1+v1i[0]*sin(4*3.1415926*v1i[0])-v1i[1]*sin(4*3.1415926*v1i[1]+3.1415926);

}

break;

case 7:

{

f1=pow(3/(0.05+pow(v1i[0],2)+pow(v1i[1],2)),2)+pow(pow(v1i[0],2)+pow(v1i[1],2),2);

}

break;

case 8:

{

f1=-1*pow(pow(v1i[0],2)+pow(v1i[1],2),0.25)*(pow(sin(50*pow(v1i[0]*v1i[0]+v1i[1]*v1i[1],0.1)),2)+1.0);

}

break;

case 9:

{

for (i=0;i<2;i++)

{

f1=f1+pow(v1i[i],2)-10*cos(2*3.1415926*v1i[i]);

}

f1=10*vn+f1;

f1=-1*f1;

}

break;

case 11:

{

f1=-1*pow(v1i[0],2)-1*pow(v1i[1],2);

}

18

break;

case 13:

{

f1=0.5+(pow(sin(sqrt(v1i[0]*v1i[0]+v1i[1]*v1i[1])),2)-0.5)/pow(1+0.001*(pow(v1i[0]*v1i[0]+v1i[1]*v1i[1],2)),2);

f1=-1*f1;

}

break;

case 14:

{

f1=v1i[0]*sin(sqrt(fabs(v1i[1]+1-v1i[0])))*cos(sqrt(fabs(v1i[1]+1+v1i[0])))+(v1i[1]+1)*cos(sqrt(fabs(v1i[1]+1-v1i[0])))*

sin(sqrt(fabs(v1i[1]+1+v1i[0])));

f1=-1*f1;

}

break;

}

return (f1);

}

C.2 二进制编码的简单克隆选择算法源程序

// SCCADlg.cpp : implementation file

#include "stdafx.h"

#include "math.h"

#include "SCCA.h"

#include "SCCADlg.h"

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

#include "time.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

19

{

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()

/////////////////////////////////////////////////////////////////////////////

// CSCCADlg dialog

20

CSCCADlg::CSCCADlg(CWnd* pParent /*=NULL*/)

: CDialog(CSCCADlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CSCCADlg)

m_N = 0;

m_c = 0;

m_ge = 0;

m_zz = 0.0;

m_x2 = 0.0;

m_x3 = 0.0;

m_x4 = 0.0;

m_x5 = 0.0;

m_y1 = 0.0;

m_y2 = 0.0;

m_y3 = 0.0;

m_y4 = 0.0;

m_y5 = 0.0;

m_Nb = 0.0;

m_fev = 0;

m_now = 0;

m_SP2 = _T("");

m_x1 = 0;

m_PP2 = _T("");

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CSCCADlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CSCCADlg)

DDX_Control(pDX, IDC_LIST1, m_PP);

DDX_Control(pDX, IDC_COMBO1, m_SP);

DDX_Text(pDX, IDC_EDIT1, m_N);

DDX_Text(pDX, IDC_EDIT2, m_c);

DDX_Text(pDX, IDC_EDIT3, m_ge);

DDX_Text(pDX, IDC_EDIT7, m_zz);

DDX_Text(pDX, IDC_EDIT9, m_x2);

DDX_Text(pDX, IDC_EDIT10, m_x3);

DDX_Text(pDX, IDC_EDIT11, m_x4);

DDX_Text(pDX, IDC_EDIT12, m_x5);

DDX_Text(pDX, IDC_EDIT13, m_y1);

DDX_Text(pDX, IDC_EDIT14, m_y2);

21

DDX_Text(pDX, IDC_EDIT15, m_y3);

DDX_Text(pDX, IDC_EDIT16, m_y4);

DDX_Text(pDX, IDC_EDIT17, m_y5);

DDX_Text(pDX, IDC_EDIT19, m_Nb);

DDX_Text(pDX, IDC_EDIT6, m_fev);

DDX_Text(pDX, IDC_EDIT18, m_now);

DDX_CBString(pDX, IDC_COMBO1, m_SP2);

DDX_Text(pDX, IDC_EDIT8, m_x1);

DDX_LBString(pDX, IDC_LIST1, m_PP2);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CSCCADlg, CDialog)

//{{AFX_MSG_MAP(CSCCADlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

ON_CBN_EDITCHANGE(IDC_COMBO1, OnEditchangeCombo1)

ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeSP)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CSCCADlg message handlers

BOOL CSCCADlg::OnInitDialog()

{

CDialog::OnInitDialog();

// 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);

22

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 CSCCADlg::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 CSCCADlg::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);

23

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 CSCCADlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

void CSCCADlg::OnButton1()

{

// TODO: Add your control notification handler code here

Window();

//--------------------------------------------------------------

UpdateData();

//--------------------------------------------

if (m_SP2=="")

{

m_SP2="F005";

UpdateData(false);

}

if (m_N==0||m_ge==0||m_Nb==0)

{

m_N=50;

//m_c=5;

m_ge=100;

m_Nb=5;

UpdateData(false);

} //设置算法默认参数

//--------------------------------------------------------------

int N=m_N;

int funn;

int c;

double Nb=m_Nb;

24

int ge=m_ge;

double vup,vdown,ting;

int i,j,k,L; //定义算法变量

//===========================

if (m_SP2=="F001") //定义测试问题的变量区间

{

funn=1;

vup=0.5;

vdown=-0.5;c=1;

ting=100000000000000000;

}

else if (m_SP2=="F003")

{

funn=3;

vup=1;

vdown=-1;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F004")

{

funn=4;

vup=10;

vdown=-10;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F005")

{

funn=5;

vup=1;

vdown=-1;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F006")

{

funn=6;

vup=1;

vdown=-1;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F007")

{

funn=7;

vup=5.12;

vdown=-5.12;c=2;

25

ting=100000000000000000;

}

else if (m_SP2=="F008")

{

funn=8;

vup=5.12;

vdown=-5.12;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F009")

{

funn=9;

vup=5.12;

vdown=-5.12;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F011")

{

funn=11;

vup=5.12;

vdown=-5.12;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F013")

{

funn=13;

vup=10;

vdown=-10;c=2;

ting=100000000000000000;

}

else if (m_SP2=="F014")

{

funn=14;

vup=512;

vdown=-512;c=2;

ting=100000000000000000;

}

m_c=c;

UpdateData(false);

//--------------------------------------------------------------

//算法程序(输入变量:N 种群规模;funn 测试问题;c 变量维数;Nb 克隆比例;ge 最大进化代数;

// vup 变量上限;vdown 变量下限;ting 终止亲和度值(如果没有请设置成足够大的数)

//输出变量:it 进化代数;guiji[]最优值进化轨迹;fev 评价次数

//--------------------------------------------------------------

26

double Nc; Nc=N*Nb;

int CL=20; //编码长度

int (*v)[100];

v=new int [300][100];

double (*v1)[5];

v1 = new double [300][5];

double fa1[5];

double fit1[50],fit[300],guiji[10000];

double z=32768,ab,max;

double Ns,yop;

int fev=0;int it=0;

double sollution=-1*10000000;

int sub[50][100];

double r[100], maxhang[100];

//定义程序变量

//srand( (unsigned)time( NULL ) );

//-------------------------------------------------------------

for (i=0;i<N;i++)

{

for (j=0;j<c*CL;j++)

{

ab=rand()/z;

if (ab<=0.5)

{

v[i][j]=0;

}

else

{

v[i][j]=1;

}

}

} //初始化二进制种群;

for (i=0;i<N;i++)

{

for (j=0;j<c;j++)

{

v1[i][j]=0;

for (k=0;k<CL;k++)

{

if (v[i][j*CL+k]==1)

27

{

v1[i][j]=v1[i][j]+pow(2,CL-k-1);

}

else

{

v1[i][j]=v1[i][j];

}

}

fa1[j]=v1[i][j]*(vup-vdown)/(pow(2,CL)-1)+vdown;

}

fit[i]=comfit(funn,c,fa1);

} //译码

fev=fev+N; //计算亲合度值

while (it<ge&&sollution<ting)

{

for (i=0;i<N;i++)

{

Ns=Nb;

for (j=0;j<Ns;j++)

{

for (k=0;k<c*CL;k++)

{

sub[j][k]=v[i][k];

}

for (L=0;L<c*CL;L++)

{

r[L]=rand()/z;

}

for (k=0;k<c*CL;k++)

{

if (r[k]<=1.000000000000/CL)

{

sub[j][k]=1-sub[j][k];

}

}

} //克隆操作

for (j=0;j<Ns;j++)

{

for (k=0;k<c;k++)

{

v1[j][k]=0;

28

for (L=0;L<CL;L++)

{

if (sub[j][k*CL+L]==1)

{

v1[j][k]=v1[j][k]+pow(2,CL-L-1);

}

else

{

v1[j][k]=v1[j][k];

}

}

fa1[k]=v1[j][k]*(vup-vdown)/(pow(2,CL)-1)+vdown;

}

fit1[j]=comfit(funn,c,fa1);

fev=fev+1;

} //克隆子群体计算亲和度值

//------------------------------------------------------------------

max=fit[i];

for (k=0;k<c*CL;k++)

{

maxhang[k]=v[i][k];

}

for (k=0;k<Ns;k++)

{

if (max<fit1[k])

{

max=fit1[k];

for (L=0;L<c*CL;L++)

{

maxhang[L]=sub[k][L];

}

}

}

for (k=0;k<c*CL;k++)

{

v[i][k]=maxhang[k];

}

fit[i]=max;

} //克隆选择完成

max=fit[0];

for (i=1;i<N;i++)

{

if (max<fit[i])

29

{

max=fit[i];

}

}

//输出结果:

sollution=max;

guiji[it]=sollution;

it=it+1;

m_now=it;

UpdateData(false);

}

//----------------------------

huatu();

huaquxian(it,guiji,fev);

//算法程序(输入变量:N 种群规模;funn 测试问题;c 变量维数;Nb 克隆比例;ge 最大进化代数

//输出变量:it 进化代数;guiji[]最优值进化轨迹;fev 评价次数

delete [] v;

delete [] v1;

}

void CSCCADlg::Window()//界面的预处理

{

CClientDC dc1(this);

CString str1="";

dc1.SetTextColor(RGB(255,0,0));

dc1.TextOut(380,310,str1);

CClientDC shuazi(this);

CBrush sz(RGB(250,250,250));

CBrush *p_oldbrush;

p_oldbrush=shuazi.SelectObject(&sz);

CRect rect(225,15,600,253);

shuazi.FillRect(&rect,p_oldbrush);

}

void CSCCADlg::huatu()//画网格//四顶点坐标(228,22)(580,22)(228,250)(580,250)

{

CClientDC dc(this);

CPen a1(PS_DOT,1,RGB(255,255,0));

CPen *p_oldpen;

p_oldpen=dc.SelectObject(&a1);

//POINT points[3]={{10,150},{50,200},{70,160}};

//dc.Polyline(points,(ge-1));

30

dc.MoveTo(404,22);

dc.LineTo(404,250);

dc.MoveTo(228,136);

dc.LineTo(580,136);

dc.MoveTo(316,22);

dc.LineTo(316,250);

dc.MoveTo(228,79);

dc.LineTo(580,79);

dc.MoveTo(492,22);

dc.LineTo(492,250);

dc.MoveTo(228,193);

dc.LineTo(580,193);

dc.MoveTo(228,22);

dc.LineTo(580,22);

dc.MoveTo(580,22);

dc.LineTo(580,250);

CPen a2(PS_SOLID,1,RGB(0,0,0));

p_oldpen=dc.SelectObject(&a2);

dc.MoveTo(228,15);

dc.LineTo(228,250);

dc.MoveTo(228,250);

dc.LineTo(590,250);

dc.MoveTo(225,25);

dc.LineTo(228,15);

dc.MoveTo(228,15);

dc.LineTo(231,25);

dc.MoveTo(580,248);

dc.LineTo(590,250);

dc.MoveTo(590,250);

dc.LineTo(580,252);

dc.SelectObject(p_oldpen);

}

void CSCCADlg::huaquxian(int ab, double c[],int fev)//ab 是进化代数,fev 为计算函数值次数,c 为进化的轨迹(长为 a

的一维数组)

{

int ge=ab;

double gz=c[0];

31

double dx,dy;

int xo=228,yo=250;

int i;

if (c[0]!=c[ge-1])

{

dx=352.0/ge;

dy=228.0/(gz-c[ge-1]);

m_zz=c[ge-1];

m_fev=fev;

m_x1=1;

m_x2=floor(ge/4.0);

m_x3=floor(ge/2.0);

m_x4=floor(ge*3/4.0);

m_x5=ge;

m_y1=gz;

m_y2=gz-(gz-c[ge-1])/4.0;

m_y3=gz-(gz-c[ge-1])/2.0;

m_y4=gz-(gz-c[ge-1])*3/4.0;

m_y5=c[ge-1];

UpdateData(false);

for (i=1;i<ge;i++)

{

//------------------------------

CClientDC dc(this);

CPen a(PS_SOLID,2,RGB(255,0,0));

CPen *p_oldpen;

p_oldpen=dc.SelectObject(&a);

dc.MoveTo(xo+(i-1)*dx,yo+dy*(c[i-1]-c[0]));

dc.LineTo(xo+i*dx,yo+dy*(c[i]-c[0]));

dc.SelectObject(p_oldpen); //画图

//------------------------------

}

}

else

{

dx=352.0/ge;

dy=0;

m_zz=c[ge-1];

m_fev=fev;

m_x1=1;

m_x2=floor(ge/4.0);

m_x3=floor(ge/2.0);

m_x4=floor(ge*3/4.0);

m_x5=ge;

32

m_y1=0;

m_y2=0.5*c[ge-1];

m_y3=c[ge-1];

m_y4=1.5*c[ge-1];

m_y5=2*c[ge-1];

UpdateData(false);

CClientDC dc(this);

CPen a(PS_SOLID,2,RGB(255,0,0));

CPen *p_oldpen;

p_oldpen=dc.SelectObject(&a);

dc.MoveTo(228,135);

dc.LineTo(580,135);

dc.SelectObject(p_oldpen); //画图

}

CClientDC dc2(this);

CString str2="";

dc2.TextOut(380,310,str2);

}

double CSCCADlg::comfit(int funn,int vn,double v1i[])

//计算一个抗体的亲和力,funn 为函数序号,vn 为变量维数,v1i[]为一个抗体

{

int i;double f1=0,f1h,f1m;

switch (funn)

{

case 1:

{

f1=10+(sin(1/v1i[0]))/((v1i[0]-0.16)*(v1i[0]-0.16)+0.1);

}

break;

case 3:

{

f1=pow(v1i[0],2)+pow(v1i[1],2)-0.3*cos(3*3.1415926535897931*v1i[0])+0.3*cos(4*3.1415926535897931*v1i[1])+0.3;

f1=-1*f1;

}

break;

case 4:

{

f1h=0;f1m=0;

for (i=1;i<6;i++)

{

f1h=f1h+i*cos((i+1)*v1i[0]+i);

33

f1m=f1m+i*cos((i+1)*v1i[1]+i);

}

f1=f1h*f1m;

f1=-1*f1;

}

break;

case 5:

{

f1=1+v1i[0]*sin(4*3.1415926*v1i[0])-v1i[1]*sin(4*3.1415926*v1i[1]+3.1415926)+sin(6*sqrt(v1i[0]*v1i[0]+v1i[1]*v1i[1]))/(

6*sqrt(v1i[0]*v1i[0]+v1i[1]*v1i[1])+pow(10,-15));

}

break;

case 6:

{

f1=1+v1i[0]*sin(4*3.1415926*v1i[0])-v1i[1]*sin(4*3.1415926*v1i[1]+3.1415926);

}

break;

case 7:

{

f1=pow(3/(0.05+pow(v1i[0],2)+pow(v1i[1],2)),2)+pow(pow(v1i[0],2)+pow(v1i[1],2),2);

}

break;

case 8:

{

f1=-1*pow(pow(v1i[0],2)+pow(v1i[1],2),0.25)*(pow(sin(50*pow(v1i[0]*v1i[0]+v1i[1]*v1i[1],0.1)),2)+1.0);

}

break;

case 9:

{

for (i=0;i<2;i++)

{

f1=f1+pow(v1i[i],2)-10*cos(2*3.1415926*v1i[i]);

}

f1=10*vn+f1;

f1=-1*f1;

}

break;

case 11:

{

f1=-1*pow(v1i[0],2)-1*pow(v1i[1],2);

}

break;

34

case 13:

{

f1=0.5+(pow(sin(sqrt(v1i[0]*v1i[0]+v1i[1]*v1i[1])),2)-0.5)/pow(1+0.001*(pow(v1i[0]*v1i[0]+v1i[1]*v1i[1],2)),2);

f1=-1*f1;

}

break;

case 14:

{

f1=v1i[0]*sin(sqrt(fabs(v1i[1]+1-v1i[0])))*cos(sqrt(fabs(v1i[1]+1+v1i[0])))+(v1i[1]+1)*cos(sqrt(fabs(v1i[1]+1-v1i[0])))*

sin(sqrt(fabs(v1i[1]+1+v1i[0])));

f1=-1*f1;

}

break;

}

return (f1);

}

C.3 用于 TSP 问题的克隆选择算法

#include "stdafx.h"

#include "TSP.h"

#include "stdlib.h"

#include "TSPDoc.h"

#include "TSPView.h"

#include "math.h"

#include "conio.h"

#include "time.h"

#include "afx.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CTSPView

IMPLEMENT_DYNCREATE(CTSPView, CFormView)

BEGIN_MESSAGE_MAP(CTSPView, CFormView)

//{{AFX_MSG_MAP(CTSPView)

ON_BN_CLICKED(IDC_BUTTON_input, OnBUTTONinput)

35

ON_BN_CLICKED(IDC_BUTTON_Clone, OnBUTTONClone)

ON_BN_CLICKED(IDC_BUTTON2, OnOK)

ON_WM_PAINT()

//}}AFX_MSG_MAP

// Standard printing commands

ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CTSPView construction/destruction

CTSPView::CTSPView()

: CFormView(CTSPView::IDD)

{

//{{AFX_DATA_INIT(CTSPView)

m_popsize1 = 0;

m_lchrom1 = 0;

m_maxgen1 = 0;

m_pcross1 = 0.9;

m_pmutation1 = 0.1;

m_maxfitness = 0.0;

m_avgfitness = 0.0;

m_minfitness = 0.0;

//m_sunfitness = 0.0;

//m_gen = 0;

m_maxfitness2 = 0.0;

m_avgfitness2 = 0.0;

m_minfitness2 = 0.0;

//m_sunfitness2 = 0.0;

//m_fname = _T("");

//m_bestPop = _T("");

//}}AFX_DATA_INIT

// TODO: add construction code here

}

CTSPView::~CTSPView()

{

//if(oldpop!=NULL)

//delete(oldpop);

}

36

void CTSPView::DoDataExchange(CDataExchange* pDX)

{

CFormView::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CTSPView)

DDX_Text(pDX, IDC_EDIT1, m_popsize1);

DDX_Text(pDX, IDC_EDIT2, m_lchrom1);

DDX_Text(pDX, IDC_EDIT3, m_maxgen1);

DDX_Text(pDX, IDC_EDIT4, m_pcross1);

DDX_Text(pDX, IDC_EDIT5, m_pmutation1);

DDX_Text(pDX, IDC_EDIT12, m_maxfitness);

DDX_Text(pDX, IDC_EDIT13, m_avgfitness);

DDX_Text(pDX, IDC_EDIT14, m_minfitness);

//DDX_Text(pDX, IDC_EDIT15, m_sunfitness);

//DDX_Text(pDX, IDC_EDIT20, m_gen);

DDX_Text(pDX, IDC_EDIT21, m_maxfitness2);

DDX_Text(pDX, IDC_EDIT22, m_avgfitness2);

DDX_Text(pDX, IDC_EDIT23, m_minfitness2);

//DDX_Text(pDX, IDC_EDIT24, m_sunfitness2);

//DDX_Text(pDX, IDC_EDIT26, m_fname);

//DDX_Text(pDX, IDC_EDIT_BestPop, m_bestPop);

//}}AFX_DATA_MAP

}

BOOL CTSPView::PreCreateWindow(CREATESTRUCT& cs)

{

return CFormView::PreCreateWindow(cs);

}

void CTSPView::OnInitialUpdate()

{

bDrawDone = FALSE; //debug

CFormView::OnInitialUpdate();

GetParentFrame()->RecalcLayout();

ResizeParentToFit();

}

/////////////////////////////////////////////////////////////////////////////

// CTSPView printing

BOOL CTSPView::OnPreparePrinting(CPrintInfo* pInfo)

{

// default preparation

return DoPreparePrinting(pInfo);

}

37

void CTSPView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

}

void CTSPView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

}

void CTSPView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)

{

}

/////////////////////////////////////////////////////////////////////////////

// CTSPView diagnostics

#ifdef _DEBUG

void CTSPView::AssertValid() const

{

CFormView::AssertValid();

}

void CTSPView::Dump(CDumpContext& dc) const

{

CFormView::Dump(dc);

}

CTSPDoc* CTSPView::GetDocument() // non-debug version is inline

{

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTSPDoc)));

return (CTSPDoc*)m_pDocument;

}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////

// CTSPView message handlers

void CTSPView::initialize()

{

int k,j,minx,miny,maxx,maxy;

m_lchrom=m_lchrom1; //抗体长度(优化点的个数)

38

m_maxgen=m_maxgen1; //最大叠代次数

m_pcross=m_pcross1; //交叉概率

m_pmutation=m_pmutation1; //变异概率

m_popsize=m_popsize1; //抗体群规模

minx=0; miny=0;

maxx=0; maxx=0;

srand( (unsigned)time( NULL ) );

for(k=0;k<m_lchrom;k++)

{

x[k]=rand()*450/RAND_MAX+300;

y[k]=rand()*410/RAND_MAX+20;

if(x[k]>maxx) maxx=x[k];

if(x[k]<minx) minx=x[k];

if(y[k]>maxy) maxy=y[k];

if(y[k]<miny) miny=y[k];

}

if((maxx-minx)>(maxy-miny)) {maxxy=maxx-minx;}

else {maxxy=maxy-miny;}

maxdd=0.0;

for(k=0;k<m_lchrom;k++)

for(j=0;j<m_lchrom;j++)

{dd[k*m_lchrom+j]=_hypot(x[k]-x[j],y[k]-y[j]);

if(maxdd<dd[k*m_lchrom+j]) maxdd=dd[k*m_lchrom+j];

}

refpd=dd[m_lchrom-1];

for(k=0;k<m_lchrom-1;k++)

refpd=refpd+dd[k*m_lchrom+k+1];

ff=1.0;

zoom=1;

initpop();

statistics(oldpop); //计算初始抗体群最大、最小和平均亲和度

initreprot(); //显示结果

}

void CTSPView::draw()

{

int k;

int x1=300,y1=15;

int nPenStyle;

int nWidth;

COLORREF LineColor;

COLORREF FillColor;

39

FillColor=RGB(255,255,255); //刷子的填充色的值

LineColor=RGB(0,0,0); //线的颜色

nWidth=1; //线宽

nPenStyle=PS_SOLID; //设定线型为实线

CPen Pen;

CBrush Brush,Brush1;

CPen *OldPen;

CBrush *OldBrush;

CClientDC dc(this);

OnPrepareDC(&dc);

Pen.CreatePen(nPenStyle,nWidth,LineColor);

OldPen=dc.SelectObject(&Pen);

Brush.CreateSolidBrush(FillColor);

OldBrush=dc.SelectObject(&Brush);

//画背景和边框

CPoint leftTop(x1,y1);

CPoint rightBottom(x1+700,y1+610);

CRect Rect(leftTop,rightBottom);

dc.FillRect(&Rect,&Brush);

dc.SelectObject(OldBrush);

dc.MoveTo(x1+700,y1);

dc.LineTo(x1,y1);

dc.LineTo(x1,y1+610);

dc.LineTo(x1+700,y1+610);

dc.LineTo(x1+700,y1);

dc.SelectObject(OldPen);

dc.MoveTo(x[0],y[0]);

for(k=0;k<m_lchrom;k++)

{dc.LineTo(x[k],y[k]);}

Brush1.CreateSolidBrush(RGB(255,0,0));

dc.SelectObject(&Brush1);

for(k=0;k<m_lchrom;k++)

{

dc.Ellipse(x[k]-2,y[k]-2,x[k]+2,y[k]+2);

}

dc.SelectObject(OldBrush);

}

void CTSPView::OnOK()

40

{

UpdateData(TRUE);

gen=0; //迭代次数

initialize();

}

void CTSPView::initpop() //生成初始抗体群

{

int j1;

int k5,i1,i2,j,i,k,j2,j3,j4,p5[maxstring];

float f1;

j=0;

for(k=0;k<m_lchrom;k++)

oldpop[j].chrom[k]=k;

for(k=0;k<m_lchrom;k++)

p5[k]=oldpop[j].chrom[k];

for(j=0;j<m_popsize;j++)

{

srand( (unsigned)time( NULL ) );

for(k=0;k<m_lchrom;k++)

{ j3=rand()%m_lchrom;

j4=rand()%m_lchrom;

j1=p5[j3];

p5[j3]=p5[j4];

p5[j4]=j1;

}

for(k=0;k<m_lchrom;k++)

oldpop[j].chrom[k]=p5[k];

}

for(j=0;j<m_popsize;j++)

{oldpop[j].x=(float)decode(oldpop[j].chrom); //个体的路径长度

oldpop[j].fitness=objfunc(oldpop[j].x); //个体的亲和度

oldpop[j].parent1=0;

oldpop[j].parent2=0;

oldpop[j].xsite=0;

}

}

float CTSPView::decode(int* pp)

{int j,k,l;

float tt;

tt=dd[pp[0]*m_lchrom+pp[m_lchrom-1]];

41

for(j=0;j<m_lchrom-1;j++)

tt=tt+dd[pp[j]*m_lchrom+pp[j+1]];

tt=tt/zoom;

return tt;

}

float CTSPView::objfunc(float x1)

{

float y;

y=ff/x1;

return y;

}

void CTSPView::statistics(struct pp *pop)//计算最大、最小和平均亲和度

{int j;

sumfitness=pop[0].fitness;

min=pop[0].fitness;

max=pop[0].fitness;

maxpp=0;

minpp=0;

for(j=1;j<m_popsize;j++)

{sumfitness=sumfitness+pop[j].fitness;

if(pop[j].fitness>max)

{max=pop[j].fitness;

maxpp=j;

}

if(pop[j].fitness<min)

{min=pop[j].fitness;

minpp=j;

}

}

avg=sumfitness/(float)m_popsize;

}

void CTSPView::initreprot()

{

m_maxfitness=1.0/max;

m_avgfitness=1.0/avg;

m_minfitness=1.0/min;

m_sunfitness=sumfitness;

UpdateData(FALSE);

42

}

void CTSPView::report()

{int k,ix,iy,jx,jy;

int tt;

float ttt;

int x1=300,y1=15;

int nPenStyle;

int nWidth;

COLORREF LineColor;

COLORREF FillColor;

FillColor=RGB(255,255,255); //刷子的填充色的值

LineColor=RGB(0,0,0); //线的颜色

nWidth=1; //线宽

nPenStyle=PS_SOLID; //线型实线

CPen Pen;

CBrush Brush,Brush1;

CPen *OldPen;

CBrush *OldBrush;

CClientDC dc(this);

OnPrepareDC(&dc);

Pen.CreatePen(nPenStyle,nWidth,LineColor);

OldPen=dc.SelectObject(&Pen);

Brush.CreateSolidBrush(FillColor);

OldBrush=dc.SelectObject(&Brush);

//画背景和边框

CPoint leftTop(x1,y1);

CPoint rightBottom(x1+700,y1+610);

CRect Rect(leftTop,rightBottom);

dc.FillRect(&Rect,&Brush);

dc.SelectObject(OldBrush);

dc.MoveTo(x1+700,y1);

dc.LineTo(x1,y1);

dc.LineTo(x1,y1+610);

dc.LineTo(x1+700,y1+610);

dc.LineTo(x1+700,y1);

dc.SelectObject(OldPen);

43

dc.MoveTo(x[oldpop[maxpp].chrom[0]],y[oldpop[maxpp].chrom[0]]);

for(k=0;k<m_lchrom;k++)

{ dc.LineTo(x[oldpop[maxpp].chrom[k]],y[oldpop[maxpp].chrom[k]]);}

Brush1.CreateSolidBrush(RGB(255,0,0));

dc.SelectObject(&Brush1);

for(k=0;k<m_lchrom;k++)

{

dc.Ellipse(x[oldpop[maxpp].chrom[k]]-2,y[oldpop[maxpp].chrom[k]]-2,x[oldpop[maxpp].chrom[k]]+2,y[oldpop[maxpp].

chrom[k]]+2);

}

dc.SelectObject(OldBrush);

}

int CTSPView::flip(float probability)

{float ppp;

ppp=rand()/RAND_MAX;

if(ppp<=probability) return 1;

else return 0;

}

void CTSPView::inversion(int k,int j,int *ss)

{int i,l1;

int tt;

l1=(j-k)/2;

for(i=0;i<l1;i++)

{

tt=ss[k+i+1];

ss[k+i+1]=ss[j-i];

ss[j-i]=tt;

}

}

void CTSPView::OnBUTTONinput()

{

int k,j;

float temp1,temp2,zoom1,zoom2;

FILE *fp;

44

//UpdateData(TRUE);

gen=0; //迭代次数

longlErrMsg = 0;

OPENFILENAME ofn;

TCHAR sfile[MAX_PATH];

ZeroMemory(&ofn, sizeof(ofn));

ZeroMemory(sfile, sizeof(TCHAR)*MAX_PATH);

// NULL terminated.

sfile[0] = '\0';

// nfile=GetFileName(sfile) const;

// Initialize OPENFILENAME structure.

ofn.lStructSize = sizeof(ofn);

ofn.hwndOwner = NULL;

ofn.lpstrFile = sfile;

ofn.nMaxFile = MAX_PATH;

ofn.lpstrFilter = "*.dat";

ofn.nFilterIndex = 0;

ofn.lpstrTitle = TEXT("请选择一个文件");

ofn.lpstrInitialDir ="\\data";//NULL; //"C:\\Documents and Settings\\walker\\桌面\\data";

ofn.lpstrCustomFilter = NULL ;

ofn.nMaxCustFilter = 0;

ofn.lpstrFileTitle = NULL;

ofn.nMaxFileTitle = 0;

ofn.nFileOffset = 0;

ofn.nFileExtension = 0;

ofn.lpstrDefExt = NULL;

ofn.lCustData = 0;

ofn.lpfnHook = 0;

ofn.lpTemplateName = 0;

ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;

// Call GetOpenFileName().

if (GetOpenFileName(&ofn))

{

;// MessageBox(TEXT("GetOpenFileName() Successful"), TEXT("OpenDialog"), MB_OK);

}

else

45

{

TCHARsErrMsg[256];

lErrMsg = CommDlgExtendedError();

wsprintf(sErrMsg,TEXT("请选择一个文件打开"), lErrMsg);

MessageBox(sErrMsg, TEXT("error!"), MB_OK);

}

//return lErrMsg;

fp = fopen( sfile, "r+" );

k=0;

while( !feof( fp ) )

{

fscanf(fp,"%f %f",&temp1,&temp2);

x[k]=temp1;

y[k]=temp2;

k=k+1;

fscanf(fp,"\n");

}

fclose(fp);

m_lchrom1=k;

m_maxgen1=1000;

m_pcross1=0.7;

m_pmutation1=0.1;

m_popsize1=100;

m_fname="dhf";

m_lchrom=m_lchrom1; //抗体长度(优化点的个数)

m_maxgen=m_maxgen1; //最大迭代次数

m_pcross=m_pcross1; //交叉概率

m_pmutation=m_pmutation1; //变异概率

m_popsize=m_popsize1; //抗体群规模

minx=0; miny=0;

maxx=0; maxy=0;

for(k=0;k<m_lchrom;k++)

{

46

if(x[k]>maxx) maxx=x[k];

if(x[k]<minx) minx=x[k];

if(y[k]>maxy) maxy=y[k];

if(y[k]<miny) miny=y[k];

}

if((maxx-minx)>(maxy-miny)) {maxxy=maxx-minx;}

else {maxxy=maxy-miny;}

xx=maxx-minx;

yy=maxy-miny;

zoom1=700.0/xx;

zoom2=600.0/yy;

if(zoom1>zoom2) { zoom=zoom2;}

else{zoom=zoom1;}

for(k=0;k<m_lchrom;k++)

{

x[k]=x[k]*zoom+(300-minx*zoom);

y[k]=y[k]*zoom+(20-miny*zoom);

}

maxdd=0.0;

for(k=0;k<m_lchrom;k++)

for(j=0;j<m_lchrom;j++)

{dd[k*m_lchrom+j]=_hypot(x[k]-x[j],y[k]-y[j]);

if(maxdd<dd[k*m_lchrom+j]) maxdd=dd[k*m_lchrom+j];

}

refpd=dd[m_lchrom-1];

for(k=0;k<m_lchrom-1;k++)

refpd=refpd+dd[k*m_lchrom+k+1];

ff=1.0;

initpop();

statistics(oldpop);

initreprot();

//draw();

}

void CTSPView::OnPaint()

{

47

CPaintDC dc(this);

draw();

if (bDrawDone)

{

report();

}

} //保持刷新后的图

void CTSPView::OnBUTTONClone()

{

int k,j;

int temp;

FILE *fp1;

gen=0;

bDrawDone = FALSE; //debug

maxold=min;

fname=m_fname;

fp=fopen("d:\\CbestR.dat","w+");

fp1=fopen("d:\\Cbest.dat","w+");

fprintf(fp,"Cities:%2dPsize:%3dPc:%fPm:%fDis:%f

Gen:%3d\n",m_lchrom,m_popsize,m_pcross,m_pmutation,oldpop[maxpp].x,gen);

do{

gen=gen+1;

Clonegeneration();//生成子代群体

for(j=0;j<m_popsize;j++)

{

// oldpop[j].x=(float)decode(oldpop[j].chrom);

oldpop[j].fitness=objfunc(oldpop[j].x);

}

statistics(oldpop);

report();

fprintf(fp,"\n%f %5d",oldpop[maxpp].x,gen);

m_bestPop="";

for(k=0;k<m_lchrom;k++)

{

temp=oldpop[maxpp].chrom[k];

fprintf(fp1,"%d ",temp);

}

fprintf(fp1,"\n");

48

m_gen=gen;

m_maxfitness2=1.0/max;

m_avgfitness2=1.0/avg;

m_minfitness2=1.0/min;

m_sunfitness2=sumfitness;

UpdateData(FALSE);

}while(gen<m_maxgen);

bDrawDone = TRUE; //debug

fclose(fp1);

fclose(fp);

}

void CTSPView::Clonegeneration()

{ srand( (unsigned)time( NULL ) );

int k,k1,j,j2,j4,i1,i2,Nc,m,kc;

int ts1[maxstring],ts2[maxstring];

double f1,f2,temp1,temp2;

j=0;Nc=4;

for (j=0;j<m_popsize;j++)

{

temp2=10000000000000.0;

for (kc=0;kc<Nc;kc++)

{

for(k1=0;k1<m_lchrom;k1++)

{

ts1[k1]=oldpop[j].chrom[k1];

} //克隆

for(j2=0;j2<m_lchrom;j2++)

{

// for(k=0;k<m_lchrom;k++)

k=rand()%m_lchrom;

m=rand()%m_lchrom;

// if(k==j) continue;

if(k>m) {i1=m;i2=k;}

else {i1=k;i2=m;}

f1=dd[m_lchrom*ts1[i1]+ts1[i2]];

f1=f1+dd[m_lchrom*ts1[(i1+1)%m_lchrom]+ts1[(i2+1)%m_lchrom]];

f2=dd[m_lchrom*ts1[i1]+ts1[(i1+1)%m_lchrom]];

f2=f2+dd[m_lchrom*ts1[i2]+ts1[(i2+1)%m_lchrom]];

49

if(f1<=f2)

{

inversion(i1,i2,ts1);

}//进行逆转操作

}

temp1=(float)decode(ts1);

if (temp1<=temp2)

{

temp2=temp1;

for(j4=0;j4<m_lchrom;j4++)

{

ts2[j4]=ts1[j4];

}

}

if (oldpop[j].x>temp2)

{

for(j4=0;j4<m_lchrom;j4++)

{

oldpop[j].chrom[j4]=ts2[j4];

oldpop[j].x=temp2;

}

}

}

}

}


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-35253-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 张素梅
        张素梅

        好漂亮

      • 陈潜心
        陈潜心

        海洋公约的缔约国当然可以说12海里是入侵

      • 胡夏雨
        胡夏雨

        嘴硬是没用的

      热点图片
      拼命载入中...