搜索
bottom↓
回复: 5

分享些仿生学的人工智能算法,提供给大家学习用

[复制链接]

出0入0汤圆

发表于 2016-5-21 11:02:43 | 显示全部楼层 |阅读模式
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; //迭代次数
long  lErrMsg = 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
{
TCHAR  sErrMsg[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:%2d  Psize:%3d  Pc:%f  Pm:%f  Dis:%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;
}
}
}
}
}

出100入85汤圆

发表于 2016-5-21 11:12:18 | 显示全部楼层
大哥,你能给个工程吗?

出0入0汤圆

发表于 2016-5-21 12:00:26 | 显示全部楼层
大哥,我觉得你分享的态度不够端正啊,什么都不说,直接东西放上来,什么都不说,就算不想解释下,也要说清楚一些意图好让大家去了解了解吧。

出0入0汤圆

发表于 2016-5-21 12:22:07 | 显示全部楼层
这个没用,大部分人都没看懂

出0入0汤圆

发表于 2018-2-2 11:07:55 | 显示全部楼层
看不懂,没法看,  java jgap 大家可以研究一下

出5入8汤圆

发表于 2018-2-2 16:36:05 | 显示全部楼层
附录~不知道从哪本书后面截出来的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 19:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表