📄 遗传算法图案dlg.cpp
字号:
// 遗传算法图案Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "遗传算法图案.h"
#include "遗传算法图案Dlg.h"
#include "math.h"
//#include "time.h"
#include "afxwin.h"
#define XX 14
#define YY 41
#define QUEUEN 32000//队列大小
#define CBBL 3//1/CBBL的概率向外传播
#define ZDZS 25//最大磁力指数
#define MX 781 //窗口宽
#define MY 488//窗口高
#define BF 15//色度摆动幅度
#define AA 100//变异方向的扭曲幅度
#define DIR 18////每个点的变异方向总数,0,1黑;2,3白;4,5,6,7,8,9其他单色,其他为渐变
#define MD 100//橡皮泥半宽度
#define QFBJ 100//起伏半径
#define CLKD 50//磁力场画法时的宽度
#define FXCBBJ 5//方向传播半径
#define YSCBBJ 80//颜色传播半径
unsigned char newmat[MX][MY][3];//新矩阵
unsigned char oldmat[MX][MY][3];//老矩阵
unsigned char *newp,*oldp;//新老指针
char used[MX][MY];//点使用标志
int queue[QUEUEN];//队列
CUIntArray across_point;//交叉点对
char variance_dir[MX][MY];//每个点的变异方向
long gravitation[MX][MY];//磁力场
unsigned char weight[MX][MY];//每点的权
CUIntArray particle;//质点
CByteArray mpmb;//磨平模板
int mpmbh;
char mpbj;//抹平半径
double sclc;//磁力场指数
char qfks;//起伏块数
char xpnks;//橡皮泥块数
char clcs;//磁力场点数
int mx,my;//权最大值点
char count=0;//操作计数器
unsigned char xpnt[2*MD+1][3];//橡皮泥条
unsigned char pjxpnt[2*MD+1][3];//平均橡皮泥条
int seed;//初始化随机数序列种子
int colony;//初始群体规模
int times;//生物年代
int acrossn;//一代选择交叉对数
char cloner;//克隆权重
char variancer;//变异权重
char cvp;//一个点产生克隆变异的概率
char hxfg,zxfg;//横向分割,纵向分割,颜色变化速度
int sbcc;//渗变层次
#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:
//{{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()
/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMyDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyDlg)
DDX_Control(pDX, IDC_title, m_title);
DDX_Control(pDX, IDC_draw, m_draw);
DDX_Control(pDX, IDC_sclcs, m_sclcs);
DDX_Control(pDX, IDC_BUTTON3, m_right);
DDX_Control(pDX, IDC_BUTTON2, m_left);
DDX_Control(pDX, IDC_xpnks, m_xpnks);
DDX_Control(pDX, IDC_qfks, m_qfks);
DDX_Control(pDX, IDC_sclc, m_sclc);
DDX_Control(pDX, IDC_xpn, m_xpn);
DDX_Control(pDX, IDC_qf, m_qf);
DDX_Control(pDX, IDC_mpbj, m_mpbj);
DDX_Control(pDX, IDC_save, m_save);
DDX_Control(pDX, IDC_clc, m_clc);
DDX_Control(pDX, IDC_mp, m_mp);
DDX_Control(pDX, IDC_zxfg, m_zxfg);
DDX_Control(pDX, IDC_sbcc, m_sbcc);
DDX_Control(pDX, IDC_hxfg, m_hxfg);
DDX_Control(pDX, IDC_PROGRESS1, m_jdt);
DDX_Control(pDX, IDC_cvp, m_cvp);
DDX_Control(pDX, IDC_pic, m_pic);
DDX_Control(pDX, IDC_acrossn, m_acrossn);
DDX_Control(pDX, IDC_cloner, m_cloner);
DDX_Control(pDX, IDC_colony, m_colony);
DDX_Control(pDX, IDC_variancer, m_variancer);
DDX_Control(pDX, IDC_times, m_times);
DDX_Control(pDX, IDC_seed, m_seed);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_draw, Ondraw)
ON_BN_CLICKED(IDC_save, Onsave)
ON_NOTIFY(UDN_DELTAPOS, IDC_colony, OnDeltaposcolony)
ON_BN_CLICKED(IDC_mp, Onmp)
ON_BN_CLICKED(IDC_clc, Onclc)
ON_BN_CLICKED(IDC_qf, Onqf)
ON_BN_CLICKED(IDC_xpn, Onxpn)
ON_BN_CLICKED(IDC_BUTTON2, Onleft)
ON_BN_CLICKED(IDC_BUTTON3, Onright)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers
BOOL CMyDlg::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
m_seed.SetBuddy(GetDlgItem(IDC_Eseed));
m_colony.SetBuddy(GetDlgItem(IDC_Ecolony));
m_times.SetBuddy(GetDlgItem(IDC_Etimes));
m_acrossn.SetBuddy(GetDlgItem(IDC_Eacrossn));
m_cloner.SetBuddy(GetDlgItem(IDC_Ecloner));
m_variancer.SetBuddy(GetDlgItem(IDC_Evariancer));
m_cvp.SetBuddy(GetDlgItem(IDC_Ecvp));
m_hxfg.SetBuddy(GetDlgItem(IDC_Ehxfg));
m_zxfg.SetBuddy(GetDlgItem(IDC_Ezxfg));
m_sbcc.SetBuddy(GetDlgItem(IDC_Esbcc));
m_mpbj.SetBuddy(GetDlgItem(IDC_Emp));
m_sclc.SetBuddy(GetDlgItem(IDC_Eclc));
m_qfks.SetBuddy(GetDlgItem(IDC_Eqfks));
m_xpnks.SetBuddy(GetDlgItem(IDC_Expnks));
m_sclcs.SetBuddy(GetDlgItem(IDC_Eclcs));
m_sclc.SetRange(1,20);//(+6)/10;
m_qfks.SetRange(1,20);
m_xpnks.SetRange(4,20);
m_sclc.SetPos(10);
m_qfks.SetPos(10);
m_xpnks.SetPos(10);
m_seed.SetRange(-1,10000);
m_seed.SetPos(-1);
m_colony.SetRange(500,2000);
m_colony.SetPos(1000);
m_times.SetRange(20,100);
m_times.SetPos(50);////////////////////////////
m_acrossn.SetRange(250,1000);
m_acrossn.SetPos(500);
m_cloner.SetRange(1,10);
m_variancer.SetRange(1,10);
m_cloner.SetPos(5);
m_variancer.SetPos(5);
m_cvp.SetRange(1,10);
m_cvp.SetPos(5);
m_jdt.SetRange(0,100);
m_hxfg.SetRange(4,20);
m_zxfg.SetRange(3,16);
m_sbcc.SetRange(50,1000);///////////////
m_hxfg.SetPos(10);
m_zxfg.SetPos(8);
m_sbcc.SetPos(200);///////////////////
m_mpbj.SetRange(1,10);
m_mpbj.SetPos(2);
m_sclc.SetRange(1,ZDZS);///10.;
m_qfks.SetRange(3,10);
m_xpnks.SetRange(4,20);
m_sclc.SetPos(ZDZS/2);
m_qfks.SetPos(2);
m_xpnks.SetPos(10);
m_mp.EnableWindow(FALSE);
m_save.EnableWindow(FALSE);
m_clc.EnableWindow(FALSE);
m_qf.EnableWindow(FALSE);
m_xpn.EnableWindow(FALSE);
m_left.EnableWindow(FALSE);
m_right.EnableWindow(FALSE);
m_sclcs.SetRange(1,40);
m_sclcs.SetPos(10);
srand(time(NULL));
//m_draw.SetFocus();
return TRUE; // return TRUE unless you set the focus to a control
}
void CMyDlg::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 CMyDlg::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 CMyDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void initrgbmat();//初始化rgb矩阵
void initdir();
void dsb1();//一代渗变,随机
void dsb2();//一代渗变,竞争
void initpart();
void move_point();//移动指针
void tydir();//同一方向
void clrnewp();
void trans();
void xpn1(int,int,int,char);
void xpn2(int,int,int,char);
void initweight();
void findmax(char f);
int aver1(int,int,int);
int aver2(int,int,int);
void CMyDlg::Ondraw()
{
// TODO: Add your control notification handler code here
int i;
m_mp.EnableWindow(FALSE);
m_save.EnableWindow(FALSE);
m_clc.EnableWindow(FALSE);
m_qf.EnableWindow(FALSE);
m_xpn.EnableWindow(FALSE);
m_left.EnableWindow(FALSE);
m_right.EnableWindow(FALSE);
read();//读入控制参数
if(seed>=0) srand(seed);
across_point.SetSize(4*acrossn);//分配内存
initrgbmat();//初始化rgb矩阵
initweight();//初始化权
initdir();//初始化颜色变异方向
myclear();
count=0;///////////
/*CString s;
CClientDC p(this);
RECT k;
m_pic.GetWindowRect(&k);
s.Format("%d %d",k.bottom-k.top,k.right-k.left);
p.TextOut(22,22,s);*/
/*CClientDC p(this);
int x,y;
for(x=0;x<MX;x++)
for(y=0;y<MY;y++)
if(variance_dir[x][y]==8)
p.SetPixelV(XX+x,YY+y,65536*rgbmat[x][y][0]+256*rgbmat[x][y][1]
+rgbmat[x][y][2]);*/
for(i=0;i<times;i++)
{
dsb2();//一代渗变
clone_or_variance();//克隆或变异
select_across();//选择交叉
findmax(0);//找最大权点,将其颜色变异方向传播
m_jdt.SetPos((int)(100*(i+1)/times+0.5));
}
for(i=0;i<10;i++)
{
findmax(1);//找最大权点,将其颜色传播
}
m_mp.EnableWindow(TRUE);
m_save.EnableWindow(TRUE);
m_clc.EnableWindow(TRUE);
m_qf.EnableWindow(TRUE);
m_xpn.EnableWindow(TRUE);
}
void initweight()
{
int i,j;
for(i=0;i<MX;i++)
for(j=0;j<MY;j++)
weight[i][j]=1+rand()%5;
}
void tydir()
{
int m,n;
for(m=0;m<MX;m++)
for(n=0;n<MY;n++)
variance_dir[m][n]=8;
}
void CMyDlg::Onsave()
{
// TODO: Add your control notification handler code here
CString path;
CClientDC p(this);
CFile fp;
long l;int i,j;char f;
CFileDialog cf(FALSE,"BMP",NULL,OFN_CREATEPROMPT|OFN_OVERWRITEPROMPT,NULL,NULL);
if(cf.DoModal()==IDOK)
{ path=cf.GetPathName();
//p.TextOut(33,44,path);
fp.Open(path,CFile::modeCreate|CFile::modeWrite);
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
bf.bfType=0x4d42;
bf.bfReserved1=0;
bf.bfReserved2=0;
bf.bfOffBits=54L;
bi.biSize=40L;
bi.biWidth=(long)MX;
bi.biHeight=(long)MY;
bi.biPlanes=1;
bi.biBitCount=24;
bi.biCompression=BI_RGB;
bi.biXPelsPerMeter=1024L;
bi.biYPelsPerMeter=768L;
bi.biClrUsed=0L;
bi.biClrImportant=0;
fp.Write(&bf,14);
fp.Write(&bi,40);
l=0L;
for(j=MY-1;j>=0;j--)
{
for(i=0;i<MX;i++)
{
fp.Write(&(newmat[i][j][0]),1);
fp.Write(&(newmat[i][j][1]),1);
fp.Write(&(newmat[i][j][2]),1);
l+=3;
}
while(l%4)
{f=0;fp.Write(&f,1);l++;}
}
bf.bfSize=54+l;
bi.biSizeImage=l;
fp.SeekToBegin();
fp.Write(&bf,14);
fp.Write(&bi,40);
fp.Close();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -