OpticalNetworkDlg.cpp
上传用户:gzsenex
上传日期:2019-05-12
资源大小:79k
文件大小:24k
- // OpticalNetworkDlg.cpp : implementation file
- //
- #include "stdafx.h"
- #include "OpticalNetwork.h"
- #include "OpticalNetworkDlg.h"
- #include "math.h"
- #include "stdlib.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- #define MAX_GROUPSIZE 100 // 最大群体规模
- #define MAX_OBDNUM 10 // 最大OBD数目
- double TotalF=0; // 总适应度值
- int *GeneSerial[MAX_GROUPSIZE]; // 当前一代个体序列
- int *NextGeneSerial[MAX_GROUPSIZE]; // 下一代个体序列
- double Cost[MAX_GROUPSIZE]; // 总费用
- double F[MAX_GROUPSIZE]; // 每代个体适应度值
- double Pm[MAX_GROUPSIZE]; // 辅助变量
- double *OBD_OLT; // OBD_OLT之间路径长度
- double *ONU_OBD; // ONU_OBD之间路径长度
- double temp[MAX_GROUPSIZE][20];
- int nCurGANum = 0; // 基因算法当前进行的代数
- int nGACrossNum = 0; // 交叉个体数目
- int nGAVariNum = 0; // 变异个体数目
- int nOBDLimit[MAX_OBDNUM]; // 每个OBD的最大连接数
- int nCurOBDLimit[MAX_GROUPSIZE][MAX_OBDNUM]; // 当前一代中每个OBD的连接数
- int nNextOBDLimit[MAX_GROUPSIZE][MAX_OBDNUM]; // 进行交叉、变异等操作后,每个OBD的连接数
- int colornum=0; // 绘图时采用不同颜色的数目
- COLORREF COLOR[16]={0x008080F0,0x0000D080,0x00800080,0x008080E0, // 用于绘制OLT、ONU、OBD连线的颜色
- 0x0080E000,0x00E08000,0x0000E080,0x003020D0,
- 0x0080F080,0x00F08080,0x008080F0,0x00F0F080,
- 0x0080F020,0x00208080,0x008020F0,0x00A02080,};
-
- /////////////////////////////////////////////////////////////////////////////
- // 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()
- /////////////////////////////////////////////////////////////////////////////
- // COpticalNetworkDlg dialog
- COpticalNetworkDlg::COpticalNetworkDlg(CWnd* pParent /*=NULL*/)
- : CDialog(COpticalNetworkDlg::IDD, pParent)
- {
- memset(m_OBDX,0,sizeof(double)*100);
- memset(m_OBDY,0,sizeof(double)*100);
- memset(m_ONUX,0,sizeof(double)*100);
- memset(m_ONUY,0,sizeof(double)*100);
- m_ONUX[0] =98; m_ONUY[0] =70;
- m_ONUX[1] =16; m_ONUY[1] =48;
- m_ONUX[2] =50; m_ONUY[2] =15;
- m_ONUX[3] =94; m_ONUY[3] =2;
- m_ONUX[4] =8; m_ONUY[4] =8;
- m_ONUX[5] =88; m_ONUY[5] =12;
- m_ONUX[6] =80; m_ONUY[6] =30;
- m_ONUX[7] =18; m_ONUY[7] =66;
- m_ONUX[8] =86; m_ONUY[8] =45;
- m_ONUX[9] =22; m_ONUY[9] =77;
- m_ONUX[10]=62; m_ONUY[10]=86;
- m_ONUX[11]=24; m_ONUY[11]=2;
- m_ONUX[12]=66; m_ONUY[12]=32;
- m_ONUX[13]=87; m_ONUY[13]=59;
- m_ONUX[14]=33; m_ONUY[14]=88;
- m_ONUX[15]=44; m_ONUY[15]=89;
- m_ONUX[16]=97; m_ONUY[16]=8;
- m_ONUX[17]=18; m_ONUY[17]=12;
- m_ONUX[18]=42; m_ONUY[18]=58;
- m_ONUX[19]=73; m_ONUY[19]=66;
-
- m_OBDX[0] =45; m_OBDY[0] =55;
- m_OBDX[1] =78; m_OBDY[1] =78;
- m_OBDX[2] =25; m_OBDY[2] =25;
- m_OBDX[3] =30; m_OBDY[3] =50;
- m_OBDX[4] =90; m_OBDY[4] =70;
- m_OBDX[5] =30; m_OBDY[5] =40;
- m_OBDX[6] =80; m_OBDY[6] =10;
- m_OBDX[7] =10; m_OBDY[7] =70;
- m_OBDX[8] =85; m_OBDY[8] =40;
- m_OBDX[9] =80; m_OBDY[9] =20;
- m_CurGANum = 0;
- m_MiniCost = 0.0;
- m_bIsGa = FALSE;
- for(int c=0;c<16;c++)
- PenONU[c].CreatePen(PS_SOLID,1,COLOR[c]);
- PenOBD.CreatePen(PS_SOLID,2,0x00100000);
- //{{AFX_DATA_INIT(COpticalNetworkDlg)
- m_OLTX = 50.0;
- m_OLTY = 50.0;
- m_nONUNum = 20;
- m_GAVariProb = 0.05;
- m_GACrossProb = 0.6;
- m_GANum = 100;
- m_nGroupSize = 50;
- m_nOBDLimit = 4;
- m_nOBDNum = 10;
- m_SleepTime = 500;
- //}}AFX_DATA_INIT
- // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- }
- void COpticalNetworkDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(COpticalNetworkDlg)
- DDX_Text(pDX, IDC_EDIT_OLTX, m_OLTX);
- DDV_MinMaxDouble(pDX, m_OLTX, 0., 100.);
- DDX_Text(pDX, IDC_EDIT_OLTY, m_OLTY);
- DDV_MinMaxDouble(pDX, m_OLTY, 0., 100.);
- DDX_Text(pDX, IDC_EDIT_ONUNUM, m_nONUNum);
- DDV_MinMaxInt(pDX, m_nONUNum, 1, 100);
- DDX_Text(pDX, IDC_EDIT_VARIPROB, m_GAVariProb);
- DDV_MinMaxDouble(pDX, m_GAVariProb, 0., 1.);
- DDX_Text(pDX, IDC_EDIT_CROSSPROB, m_GACrossProb);
- DDV_MinMaxDouble(pDX, m_GACrossProb, 0., 1.);
- DDX_Text(pDX, IDC_EDIT_GANUM, m_GANum);
- DDX_Text(pDX, IDC_EDIT_GROUPSIZE, m_nGroupSize);
- DDX_Text(pDX, IDC_EDIT_OBDLIMIT, m_nOBDLimit);
- DDX_Text(pDX, IDC_EDIT_OBDNUM, m_nOBDNum);
- DDX_Text(pDX, IDC_EDIT_SLEEPTIME, m_SleepTime);
- DDV_MinMaxInt(pDX, m_SleepTime, 0, 10000);
- //}}AFX_DATA_MAP
- int i=0;
- int Start=0;
- for(Start=IDC_EDIT_OBDX1;Start<IDC_EDIT_OBDX1+10;Start++)
- {
- DDX_Text(pDX, IDC_EDIT_OBDX1+i, m_OBDX[i]);
- i++;
- }
- i=0;
- for(Start=IDC_EDIT_OBDY1;Start<IDC_EDIT_OBDY1+10;Start++)
- {
- DDX_Text(pDX, IDC_EDIT_OBDY1+i, m_OBDY[i]);
- i++;
- }
- i=0;
- for(Start=IDC_EDIT_ONUX1;Start<IDC_EDIT_ONUX1+20;Start++)
- {
- DDX_Text(pDX, IDC_EDIT_ONUX1+i, m_ONUX[i]);
- i++;
- }
- i=0;
- for(Start=IDC_EDIT_ONUY1;Start<IDC_EDIT_ONUY1+20;Start++)
- {
- DDX_Text(pDX, IDC_EDIT_ONUY1+i, m_ONUY[i]);
- i++;
- }
- }
- BEGIN_MESSAGE_MAP(COpticalNetworkDlg, CDialog)
- //{{AFX_MSG_MAP(COpticalNetworkDlg)
- ON_WM_SYSCOMMAND()
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- ON_BN_CLICKED(IDC_BUTTON_GA, OnButtonGa)
- ON_BN_CLICKED(IDABOUT, OnAbout)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // COpticalNetworkDlg message handlers
- BOOL COpticalNetworkDlg::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
- CAboutDlg about;
- about.DoModal();
-
- return TRUE; // return TRUE unless you set the focus to a control
- }
- void COpticalNetworkDlg::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 COpticalNetworkDlg::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
- {
- if(!m_bIsGa)
- {
- int NetLeft,NetBottom;
- int x_coordinate=0,y_coordinate=0;
- char txt[4];
- CString info;
- CPen Pen;
- CPen* OldPen;
- CDC* pDC=GetDC();
- CRect RectClient,Workarea;
- GetClientRect(RectClient);
- Workarea.left=RectClient.left+RectClient.right/3-15;
- Workarea.right=RectClient.right;
- Workarea.top=RectClient.top;
- Workarea.bottom=RectClient.bottom;
- pDC->Rectangle(Workarea);
- pDC->SetBkColor(0x00FFFFFF);
- NetLeft=Workarea.left+25;
- NetBottom=Workarea.bottom-20;
- pDC->MoveTo(NetLeft,NetBottom);
- pDC->LineTo(NetLeft+500,NetBottom);
- pDC->MoveTo(NetLeft,NetBottom);
- pDC->LineTo(NetLeft,NetBottom-500);
- pDC->TextOut(NetLeft+500,NetBottom-12,"X");
- pDC->TextOut(NetLeft+5,NetBottom-505,"Y");
- pDC->SetTextColor(0x000000FF);
- info.Format("已进化代数 %d",0);//+1);//wsprintf(txt,"%d",m_CurGANum+1);
- pDC->TextOut(NetLeft+100,NetBottom-520,info);
- info="最小费用 ";//_MiniCost);//wsprintf(txt,"%4.6f",m_MiniCost);
- pDC->TextOut(NetLeft+250,NetBottom-520,info);
-
- Pen.CreatePen(PS_SOLID,2,0x00100000);
- OldPen=pDC->SelectObject(&PenOBD);
- for(int b1=0;b1<m_nOBDNum;b1++)
- {
- pDC->MoveTo(NetLeft+m_OBDX[b1]*5,NetBottom-m_OBDY[b1]*5);
- pDC->LineTo(NetLeft+m_OLTX*5,NetBottom-m_OLTY*5);
- }
- Pen.DeleteObject();
- pDC->SelectObject(OldPen);
- pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
- for(x_coordinate=0;x_coordinate<=10;x_coordinate++)
- {
- char xn[4];
- wsprintf(xn,"%d",x_coordinate*10);
- pDC->TextOut(NetLeft+x_coordinate*50-8,NetBottom+2,xn);
- }
- for(y_coordinate=1;y_coordinate<=10;y_coordinate++)
- {
- char yn[4];
- wsprintf(yn,"%d",y_coordinate*10);
- if(y_coordinate==10)
- pDC->TextOut(NetLeft-24,NetBottom-y_coordinate*50,yn);
- else
- pDC->TextOut(NetLeft-22,NetBottom-y_coordinate*50,yn);
- }
- pDC->SetTextColor(0x000000FF);
- pDC->TextOut(NetLeft+m_OLTX*5-7,NetBottom-m_OLTY*5-7,"★");
- pDC->SetTextColor(0x00FF0000);
- for(int a1=0;a1<m_nOBDNum;a1++)
- {
- wsprintf(txt,"%d",a1+1);
- pDC->TextOut(NetLeft+m_OBDX[a1]*5-3,NetBottom-m_OBDY[a1]*5-9,txt);
- }
- pDC->SetTextColor(0x0000FF00);
- for(int a2=0;a2<m_nONUNum;a2++)
- {
- wsprintf(txt,"%d",a2+1);
- pDC->TextOut(NetLeft+m_ONUX[a2]*5-3,NetBottom-m_ONUY[a2]*5-9,txt);
- }
- pDC->SetTextColor(0x00FFFFFF);
- pDC->TextOut(NetLeft+507,NetBottom-508,"c");
- pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
- pDC->SetBkColor(GetSysColor(COLOR_WINDOW));
- }
- else
- DrawNetwork();
- CDialog::OnPaint();
- }
- }
- // The system calls this to obtain the cursor to display while the user drags
- // the minimized window.
- HCURSOR COpticalNetworkDlg::OnQueryDragIcon()
- {
- return (HCURSOR) m_hIcon;
- }
- // 搜索最小C值
- double COpticalNetworkDlg::FindMiniC(double *data, int len)
- {
- double mini=data[0];
- int mininum=0;
- for(int n=0;n<len;n++)
- {
- if(data[n]<mini)
- {
- mini=data[n];
- mininum=n;
- }
- }
- return mini;
- }
- // 基因算法的具体实现
- void COpticalNetworkDlg::OnButtonGa()
- {
- // 取得基因算法所需参数
- UpdateData(TRUE);
- // 分配内存
- OBD_OLT=(double *)malloc(sizeof(double)*m_nOBDNum);
- ONU_OBD=(double *)malloc(sizeof(double)*m_nONUNum*m_nOBDNum);
- // 根据群体规模和交叉概率计算出交叉个体个数
- nGACrossNum = m_nGroupSize*m_GACrossProb/2;
- // 根据群体规模和变异概率计算出变异个体个数
- nGAVariNum = m_nGroupSize*m_GAVariProb;
- // 设置已进行过基因算法标志
- m_bIsGa=TRUE;
- // 为当前一代个体分配内存
- for(int k=0;k<m_nGroupSize;k++)
- GeneSerial[k]=(int *) malloc(sizeof(int)*m_nONUNum);
- // 为当前一代个体交叉和变异后的新产生的个体分配内存
- for(int u=0;u<nGACrossNum*2+nGAVariNum;u++)
- NextGeneSerial[u]=(int *)malloc(sizeof(int)*m_nONUNum);
- // 参数有效性检查
- if(m_nONUNum>=m_nOBDLimit*m_nOBDNum)
- {
- AfxMessageBox("ONU数目过多,或者OBD数目过少,或OBD最大连接数目过小!",MB_OK|MB_ICONINFORMATION,NULL);
- return;
- }
- if(m_nGroupSize<nGACrossNum*2+nGAVariNum)
- {
- AfxMessageBox("群体规模过小,或者交叉概率过大,或者变异概率过大!",MB_OK|MB_ICONINFORMATION,NULL);
- return;
- }
- for(int n1=0;n1<m_nOBDNum;n1++)
- {
- OBD_OLT[n1]=sqrt((m_OBDX[n1]-m_OLTX)*(m_OBDX[n1]-m_OLTX)+(m_OBDY[n1]-m_OLTY)*(m_OBDY[n1]-m_OLTY));
- nOBDLimit[n1]=m_nOBDLimit;
- }
- int LimitTotal=0;
- int CurGroupSize=1;
- for(int p=0;p<m_nOBDNum;p++)
- LimitTotal+=nOBDLimit[p];
- for(int q=0;q<m_nONUNum;q++)
- {
- if(CurGroupSize>MAX_GROUPSIZE*10)
- break;
- else
- {
- CurGroupSize=LimitTotal*CurGroupSize;
- LimitTotal--;
- }
- }
- if(m_nGroupSize>CurGroupSize||m_nGroupSize>MAX_GROUPSIZE*10)
- return;
- // 计算ONU和OBD之间距离
- for(int i=0;i<m_nONUNum;i++)
- for(int j=0;j<m_nOBDNum;j++)
- *(ONU_OBD+i*m_nOBDNum+j)=sqrt((m_ONUX[i]-m_OBDX[j])*(m_ONUX[i]-m_OBDX[j])+(m_ONUY[i]-m_OBDY[j])*(m_ONUY[i]-m_OBDY[j]));
- // 产生初始基因序列
- for(int i1=0;i1<m_nGroupSize;i1++)
- {
- for(int k=0;k<m_nOBDNum;k++)
- nCurOBDLimit[i1][k]=0;
- for(int j1=0;j1<m_nONUNum;j1++)
- {
- int RandInt;
- Random:RandInt=RandomInt(0,m_nOBDNum-1);
- if(nCurOBDLimit[i1][RandInt]<=nOBDLimit[RandInt]-1)
- {
- *(GeneSerial[i1]+j1)=RandInt;
- nCurOBDLimit[i1][RandInt]++;
- }
- else
- goto Random; // 不满足约束条件2时,重新产生基因序列
- }
- }
- // 基因算法具体实现
- for( nCurGANum=0;nCurGANum<m_GANum;nCurGANum++)
- {
- // 计算当前一代群体中每个个体的适应度数值F
- for(int i=0;i<m_nGroupSize;i++)
- {
- Cost[i]=0;
- for(int j=0;j<m_nONUNum;j++)
- {
- Cost[i]=Cost[i]+*(ONU_OBD+j*m_nOBDNum+*(GeneSerial[i]+j))+*(OBD_OLT+*(GeneSerial[i]+j));
- temp[i][j]=*(ONU_OBD+j*m_nOBDNum+*(GeneSerial[i]+j));
- }
- F[i]=1/Cost[i];
- TotalF=F[i]+TotalF;
- }
- // 归一化F值
- for(int a=0;a<m_nGroupSize;a++)
- Pm[a]=F[a]/TotalF*100;
- // 将当前一代群体中的个体按F值从大到小排序
- for(int b=0;b<m_nGroupSize-1;b++)
- {
- FindMiniF(Pm,m_nGroupSize-b);
- }
- m_CurGANum=nCurGANum;
- // 查找当前一代中的最小费用个体
- m_MiniCost=FindMiniC(Cost,m_nGroupSize);
- // 绘制图形
- DrawNetwork();
- // 交叉操作
- for(int c=0;c<nGACrossNum;c++)
- {
- int nExchangePos,temp=0;
- int nNextOBD1;
- int nNextOBD2;
- int LimitLoop=0;
- int new1=0; // 发生交叉个体1在当前一代群体中位置
- int new2=0; // 发生交叉个体2在当前一代群体中位置
- //int temp=0;
- Limit1:new1=RandomInt(0,m_nGroupSize-1);
- temp=RandomInt(0,m_nGroupSize-1);
- // 由于当前一代群体中个体已经按照F从大到小排序
- // 如果new1>temp,则位置new1处个体F值小于temp处个体F值
- // 所以选定new1=temp处个体进行交叉,体现了F值较大的个体有较多机会进行交叉
- if(new1>temp)
- new1=temp;
- new2=RandomInt(0,m_nGroupSize-1);
- temp=RandomInt(0,m_nGroupSize-1);
- if(new2>temp)
- new2=temp;
- for(int g=0;g<m_nOBDNum;g++)
- {
- nNextOBDLimit[2*c][g]=nCurOBDLimit[new1][g];
- nNextOBDLimit[2*c+1][g]=nCurOBDLimit[new2][g];
- }
-
- Limit2:nExchangePos=RandomInt(0,m_nONUNum-1); // 被选中交叉个体的基因序列中用于交叉的基因位
- nNextOBD1=nNextOBDLimit[2*c][*(GeneSerial[new2]+nExchangePos)]+1;
- nNextOBD2=nNextOBDLimit[2*c+1][*(GeneSerial[new1]+nExchangePos)]+1;
- LimitLoop++;
- if((nNextOBD1>nOBDLimit[*(GeneSerial[new2]+nExchangePos)])||(nNextOBD2>nOBDLimit[*(GeneSerial[new1]+nExchangePos)]))
- if(LimitLoop>50) // 跳转到Limit2重新产生交叉位满50次,仍未满足约束条件2,
- goto Limit1; // 则跳转到Limit1,重新产生交叉个体在当前一代群体中位置
- else
- goto Limit2; // 交叉后,不满足约束条件2,跳转到Limit2重新产生交叉位
-
- // 交叉成功,产生新的个体
- for(int m=0;m<m_nONUNum;m++)
- {
- if(m==nExchangePos)
- {
- *(NextGeneSerial[2*c]+nExchangePos)=*(GeneSerial[new2]+nExchangePos);
- *(NextGeneSerial[2*c+1]+nExchangePos)=*(GeneSerial[new1]+nExchangePos);
- nNextOBDLimit[2*c][*(GeneSerial[new2]+nExchangePos)]++;
- nNextOBDLimit[2*c][*(GeneSerial[new1]+nExchangePos)]--;
- nNextOBDLimit[2*c+1][*(GeneSerial[new2]+nExchangePos)]--;
- nNextOBDLimit[2*c+1][*(GeneSerial[new1]+nExchangePos)]++;
- }
- else
- {
- *(NextGeneSerial[2*c]+m)=*(GeneSerial[new1]+m);
- *(NextGeneSerial[2*c+1]+m)=*(GeneSerial[new2]+m);
- }
- }
- }
- // 变异操作
- for(int d=0;d<nGAVariNum;d++)
- {
- int nVariIndividual=0;
- int nVariPos=0;
- int VariLoop=0;
- Vari1:VariLoop=0;
- nVariIndividual=RandomInt(0,m_nGroupSize-1); // 发生变异个体在当前一代群体中位置
- nVariPos=RandomInt(0,m_nONUNum-1); // 发生变异个体的基因序列中变异的基因位
- for(int z=0;z<m_nOBDNum;z++)
- nNextOBDLimit[2*nGACrossNum+d][z]=nCurOBDLimit[nVariIndividual][z];
- for(int h=0;h<m_nONUNum;h++)
- {
- if(h==nVariPos)
- {
- int nVariValue;
- int nNextVari;
- Vari2: nVariValue=RandomInt(0,m_nOBDNum-1); // 产生变异位变异后的值
- if(nVariValue==*(GeneSerial[nVariIndividual]+nVariPos))
- {
- VariLoop++;
- if(VariLoop==100) // 跳转到Vari2满50次,随机产生的变异位的值仍等于待变异位的当前值
- goto Vari1; // 则跳转到Vair1,重新产生变异个体在当前一代群体中位置
- else
- goto Vari2; // 变异位的值等于待变异位的当前值,跳转到Vari2,重新产生变异位变异后的值
- }
- nNextVari=nNextOBDLimit[2*nGACrossNum+d][nVariValue]+1;
- if(nNextVari>nOBDLimit[nVariValue])
- {
- VariLoop++;
- if(VariLoop==100)// 跳转到Vari2重新产生变异位满50次,仍未满足约束条件2,
- goto Vari1; // 则跳转到Vair1,重新产生变异个体在当前一代群体中位置
- else
- goto Vari2; // 变异后,不满足约束条件2,跳转到Vari2重新产生变异位
- }
- // 变异成功
- *(NextGeneSerial[2*nGACrossNum+d]+h)=nVariValue;
- nNextOBDLimit[2*nGACrossNum+d][nVariValue]++;
- nNextOBDLimit[2*nGACrossNum+d][*(GeneSerial[nVariIndividual]+nVariPos)]--;
- }
- else
- *(NextGeneSerial[2*nGACrossNum+d]+h)=*(GeneSerial[nVariIndividual]+h);
- }
- }
-
- // 产生下一代群体
- for(int e=0;e<2*nGACrossNum+nGAVariNum;e++)
- {
- for(int f=0;f<m_nONUNum;f++)
- *(GeneSerial[m_nGroupSize-e-1]+f)=*(NextGeneSerial[e]+f);
- for(int x=0;x<m_nOBDNum;x++)
- nCurOBDLimit[m_nGroupSize-e-1][x]=nNextOBDLimit[e][x];
- }
- Sleep(m_SleepTime);
- }
- }
- // 产生1~100之间的随机整数
- int COpticalNetworkDlg::RandomInt(int low,int high)
- {
- int result;
- result=rand();
- return result%(high+1);
- }
- // 搜索最小F值
- void COpticalNetworkDlg::FindMiniF(double *data,int len)
- {
- double mini=data[0];
- int mininum=0;
- int CurOBDTemp;
- int *GeneSerTemp;
- double datatemp;
- for(int n=0;n<len;n++)
- if(mini>data[n])
- {
- mini=data[n];
- mininum=n;
- }
- if(mininum!=len-1)
- {
- datatemp=*(data+len-1);
- *(data+len-1)=*(data+mininum);
- *(data+mininum)=datatemp;
- GeneSerTemp=GeneSerial[len-1];
- GeneSerial[len-1]=GeneSerial[mininum];
- GeneSerial[mininum]=GeneSerTemp;
- for(int n2=0;n2<m_nOBDNum;n2++)
- {
- CurOBDTemp=nCurOBDLimit[mininum][n2];
- nCurOBDLimit[mininum][n2]=nCurOBDLimit[len-1][n2];
- nCurOBDLimit[len-1][n2]=CurOBDTemp;
- }
- }
- }
- void COpticalNetworkDlg::DrawNetwork()
- {
- int NetLeft,NetBottom;
- int x_coordinate=0,y_coordinate=0;
- char txt[4];
- CString info;
- CDC* pDC=GetDC();
- CRect RectClient,Workarea;
- GetClientRect(RectClient);
- Workarea.left=RectClient.left+RectClient.right/3-15;
- Workarea.right=RectClient.right;
- Workarea.top=RectClient.top;
- Workarea.bottom=RectClient.bottom;
- pDC->Rectangle(Workarea);
- pDC->SetBkColor(0x00FFFFFF);
- NetLeft=Workarea.left+25;
- NetBottom=Workarea.bottom-20;
- pDC->MoveTo(NetLeft,NetBottom);
- pDC->LineTo(NetLeft+500,NetBottom);
- pDC->MoveTo(NetLeft,NetBottom);
- pDC->LineTo(NetLeft,NetBottom-500);
- pDC->TextOut(NetLeft+500,NetBottom-12,"X");
- pDC->TextOut(NetLeft+5,NetBottom-505,"Y");
- pDC->SetTextColor(0x000000FF);
- info.Format("已进化代数 %d",m_CurGANum+1);
- pDC->TextOut(NetLeft+100,NetBottom-520,info);
- info.Format("最小费用 %5.5f",m_MiniCost);
- pDC->TextOut(NetLeft+250,NetBottom-520,info);
- pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
- for(x_coordinate=0;x_coordinate<=10;x_coordinate++)
- {
- char xn[4];
- wsprintf(xn,"%d",x_coordinate*10);
- pDC->TextOut(NetLeft+x_coordinate*50-8,NetBottom+2,xn);
- }
- for(y_coordinate=1;y_coordinate<=10;y_coordinate++)
- {
- char yn[4];
- wsprintf(yn,"%d",y_coordinate*10);
- if(y_coordinate==10)
- pDC->TextOut(NetLeft-24,NetBottom-y_coordinate*50,yn);
- else
- pDC->TextOut(NetLeft-22,NetBottom-y_coordinate*50,yn);
- }
- PtrOldPen=pDC->SelectObject(&PenOBD);
- for(int b1=0;b1<m_nOBDNum;b1++)
- {
- pDC->MoveTo(NetLeft+m_OBDX[b1]*5,NetBottom-m_OBDY[b1]*5);
- pDC->LineTo(NetLeft+m_OLTX*5,NetBottom-m_OLTY*5);
- }
- for(int b2=0;b2<m_nONUNum;b2++)
- {
- pDC->SelectObject(&PenONU[colornum]);
- pDC->MoveTo(NetLeft+m_ONUX[b2]*5,NetBottom-m_ONUY[b2]*5);
- pDC->LineTo(NetLeft+m_OBDX[*(GeneSerial[0]+b2)]*5,NetBottom-m_OBDY[*(GeneSerial[0]+b2)]*5);
- colornum++;
- if(colornum==16)
- colornum=0;
- }
- pDC->SelectObject(PtrOldPen);
- pDC->SetTextColor(0x000000FF);
- pDC->TextOut(NetLeft+m_OLTX*5-7,NetBottom-m_OLTY*5-7,"★");
- pDC->SetTextColor(0x00FF0000);
- for(int a1=0;a1<m_nOBDNum;a1++)
- {
- wsprintf(txt,"%d",a1+1);
- pDC->TextOut(NetLeft+m_OBDX[a1]*5-3,NetBottom-m_OBDY[a1]*5-9,txt);
- }
- pDC->SetTextColor(0x0000FF00);
- for(int a2=0;a2<m_nONUNum;a2++)
- {
- wsprintf(txt,"%d",a2+1);
- pDC->TextOut(NetLeft+m_ONUX[a2]*5-3,NetBottom-m_ONUY[a2]*5-9,txt);
- }
- pDC->SetTextColor(0x00FFFFFF);
- pDC->TextOut(NetLeft+507,NetBottom-508,"c");
- pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
- pDC->SetBkColor(GetSysColor(COLOR_WINDOW));
-
- }
- void COpticalNetworkDlg::OnAbout()
- {
- CAboutDlg dlg;
- dlg.DoModal();
- }
- void COpticalNetworkDlg::OnOK()
- {
- CDialog::OnOK();
- }