OpticalNetworkDlg.cpp
上传用户:gzsenex
上传日期:2019-05-12
资源大小:79k
文件大小:24k
源码类别:

DNA

开发平台:

Visual C++

  1. // OpticalNetworkDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "OpticalNetwork.h"
  5. #include "OpticalNetworkDlg.h"
  6. #include "math.h"
  7. #include "stdlib.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. #define  MAX_GROUPSIZE 100       // 最大群体规模
  14. #define  MAX_OBDNUM    10        // 最大OBD数目
  15. double TotalF=0;                 // 总适应度值
  16. int    *GeneSerial[MAX_GROUPSIZE];     // 当前一代个体序列   
  17. int    *NextGeneSerial[MAX_GROUPSIZE]; // 下一代个体序列
  18. double Cost[MAX_GROUPSIZE];      // 总费用
  19. double F[MAX_GROUPSIZE];         // 每代个体适应度值
  20. double Pm[MAX_GROUPSIZE];        // 辅助变量
  21. double *OBD_OLT;                 // OBD_OLT之间路径长度
  22. double *ONU_OBD;                 // ONU_OBD之间路径长度
  23. double temp[MAX_GROUPSIZE][20];
  24. int    nCurGANum    = 0;         // 基因算法当前进行的代数
  25. int    nGACrossNum  = 0;         // 交叉个体数目
  26. int    nGAVariNum   = 0;         // 变异个体数目
  27. int    nOBDLimit[MAX_OBDNUM];    // 每个OBD的最大连接数         
  28. int    nCurOBDLimit[MAX_GROUPSIZE][MAX_OBDNUM];   // 当前一代中每个OBD的连接数
  29. int    nNextOBDLimit[MAX_GROUPSIZE][MAX_OBDNUM];  // 进行交叉、变异等操作后,每个OBD的连接数
  30. int    colornum=0;               // 绘图时采用不同颜色的数目
  31. COLORREF COLOR[16]={0x008080F0,0x0000D080,0x00800080,0x008080E0,  // 用于绘制OLT、ONU、OBD连线的颜色
  32.                     0x0080E000,0x00E08000,0x0000E080,0x003020D0,
  33. 0x0080F080,0x00F08080,0x008080F0,0x00F0F080,
  34. 0x0080F020,0x00208080,0x008020F0,0x00A02080,};
  35.                     
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CAboutDlg dialog used for App About
  38. class CAboutDlg : public CDialog
  39. {
  40. public:
  41. CAboutDlg();
  42. // Dialog Data
  43. //{{AFX_DATA(CAboutDlg)
  44. enum { IDD = IDD_ABOUTBOX };
  45. //}}AFX_DATA
  46. // ClassWizard generated virtual function overrides
  47. //{{AFX_VIRTUAL(CAboutDlg)
  48. protected:
  49. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  50. //}}AFX_VIRTUAL
  51. // Implementation
  52. protected:
  53. //{{AFX_MSG(CAboutDlg)
  54. //}}AFX_MSG
  55. DECLARE_MESSAGE_MAP()
  56. };
  57. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  58. {
  59. //{{AFX_DATA_INIT(CAboutDlg)
  60. //}}AFX_DATA_INIT
  61. }
  62. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  63. {
  64. CDialog::DoDataExchange(pDX);
  65. //{{AFX_DATA_MAP(CAboutDlg)
  66. //}}AFX_DATA_MAP
  67. }
  68. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  69. //{{AFX_MSG_MAP(CAboutDlg)
  70. // No message handlers
  71. //}}AFX_MSG_MAP
  72. END_MESSAGE_MAP()
  73. /////////////////////////////////////////////////////////////////////////////
  74. // COpticalNetworkDlg dialog
  75. COpticalNetworkDlg::COpticalNetworkDlg(CWnd* pParent /*=NULL*/)
  76. : CDialog(COpticalNetworkDlg::IDD, pParent)
  77. {
  78. memset(m_OBDX,0,sizeof(double)*100);
  79. memset(m_OBDY,0,sizeof(double)*100);
  80. memset(m_ONUX,0,sizeof(double)*100);
  81. memset(m_ONUY,0,sizeof(double)*100);
  82. m_ONUX[0] =98;   m_ONUY[0] =70;
  83. m_ONUX[1] =16;   m_ONUY[1] =48;
  84. m_ONUX[2] =50;   m_ONUY[2] =15;
  85. m_ONUX[3] =94;   m_ONUY[3] =2;
  86. m_ONUX[4] =8;    m_ONUY[4] =8;
  87. m_ONUX[5] =88;   m_ONUY[5] =12;
  88. m_ONUX[6] =80;   m_ONUY[6] =30;
  89. m_ONUX[7] =18;   m_ONUY[7] =66;
  90. m_ONUX[8] =86;   m_ONUY[8] =45;
  91. m_ONUX[9] =22;   m_ONUY[9] =77;
  92. m_ONUX[10]=62;   m_ONUY[10]=86;
  93. m_ONUX[11]=24;   m_ONUY[11]=2;
  94. m_ONUX[12]=66;   m_ONUY[12]=32;
  95. m_ONUX[13]=87;   m_ONUY[13]=59;
  96. m_ONUX[14]=33;   m_ONUY[14]=88;
  97. m_ONUX[15]=44;   m_ONUY[15]=89;
  98. m_ONUX[16]=97;   m_ONUY[16]=8;
  99. m_ONUX[17]=18;   m_ONUY[17]=12;
  100. m_ONUX[18]=42;   m_ONUY[18]=58;
  101. m_ONUX[19]=73;   m_ONUY[19]=66;
  102. m_OBDX[0] =45;   m_OBDY[0] =55;
  103. m_OBDX[1] =78;   m_OBDY[1] =78;
  104. m_OBDX[2] =25;   m_OBDY[2] =25;
  105. m_OBDX[3] =30;   m_OBDY[3] =50;
  106. m_OBDX[4] =90;   m_OBDY[4] =70;
  107. m_OBDX[5] =30;   m_OBDY[5] =40;
  108. m_OBDX[6] =80;   m_OBDY[6] =10;
  109. m_OBDX[7] =10;   m_OBDY[7] =70;
  110. m_OBDX[8] =85;   m_OBDY[8] =40;
  111. m_OBDX[9] =80;   m_OBDY[9] =20;
  112. m_CurGANum = 0;
  113. m_MiniCost = 0.0;
  114. m_bIsGa = FALSE;
  115. for(int c=0;c<16;c++)
  116.     PenONU[c].CreatePen(PS_SOLID,1,COLOR[c]);
  117. PenOBD.CreatePen(PS_SOLID,2,0x00100000);
  118. //{{AFX_DATA_INIT(COpticalNetworkDlg)
  119. m_OLTX = 50.0;
  120. m_OLTY = 50.0;
  121. m_nONUNum = 20;
  122. m_GAVariProb = 0.05;
  123. m_GACrossProb = 0.6;
  124. m_GANum = 100;
  125. m_nGroupSize = 50;
  126. m_nOBDLimit = 4;
  127. m_nOBDNum = 10;
  128. m_SleepTime = 500;
  129. //}}AFX_DATA_INIT
  130. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  131. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  132. }
  133. void COpticalNetworkDlg::DoDataExchange(CDataExchange* pDX)
  134. {
  135. CDialog::DoDataExchange(pDX);
  136. //{{AFX_DATA_MAP(COpticalNetworkDlg)
  137. DDX_Text(pDX, IDC_EDIT_OLTX, m_OLTX);
  138. DDV_MinMaxDouble(pDX, m_OLTX, 0., 100.);
  139. DDX_Text(pDX, IDC_EDIT_OLTY, m_OLTY);
  140. DDV_MinMaxDouble(pDX, m_OLTY, 0., 100.);
  141. DDX_Text(pDX, IDC_EDIT_ONUNUM, m_nONUNum);
  142. DDV_MinMaxInt(pDX, m_nONUNum, 1, 100);
  143. DDX_Text(pDX, IDC_EDIT_VARIPROB, m_GAVariProb);
  144. DDV_MinMaxDouble(pDX, m_GAVariProb, 0., 1.);
  145. DDX_Text(pDX, IDC_EDIT_CROSSPROB, m_GACrossProb);
  146. DDV_MinMaxDouble(pDX, m_GACrossProb, 0., 1.);
  147. DDX_Text(pDX, IDC_EDIT_GANUM, m_GANum);
  148. DDX_Text(pDX, IDC_EDIT_GROUPSIZE, m_nGroupSize);
  149. DDX_Text(pDX, IDC_EDIT_OBDLIMIT, m_nOBDLimit);
  150. DDX_Text(pDX, IDC_EDIT_OBDNUM, m_nOBDNum);   
  151. DDX_Text(pDX, IDC_EDIT_SLEEPTIME, m_SleepTime);
  152. DDV_MinMaxInt(pDX, m_SleepTime, 0, 10000);
  153. //}}AFX_DATA_MAP
  154. int i=0;
  155. int Start=0;
  156. for(Start=IDC_EDIT_OBDX1;Start<IDC_EDIT_OBDX1+10;Start++)
  157. {
  158. DDX_Text(pDX, IDC_EDIT_OBDX1+i, m_OBDX[i]);
  159.     i++;
  160. }
  161. i=0;
  162. for(Start=IDC_EDIT_OBDY1;Start<IDC_EDIT_OBDY1+10;Start++)
  163. {
  164. DDX_Text(pDX, IDC_EDIT_OBDY1+i, m_OBDY[i]);
  165.     i++;
  166. }
  167. i=0;
  168. for(Start=IDC_EDIT_ONUX1;Start<IDC_EDIT_ONUX1+20;Start++)
  169. {
  170. DDX_Text(pDX, IDC_EDIT_ONUX1+i, m_ONUX[i]);
  171.     i++;
  172. }
  173.     i=0;
  174. for(Start=IDC_EDIT_ONUY1;Start<IDC_EDIT_ONUY1+20;Start++)
  175. {
  176. DDX_Text(pDX, IDC_EDIT_ONUY1+i, m_ONUY[i]);
  177.     i++;
  178. }
  179. }
  180. BEGIN_MESSAGE_MAP(COpticalNetworkDlg, CDialog)
  181. //{{AFX_MSG_MAP(COpticalNetworkDlg)
  182. ON_WM_SYSCOMMAND()
  183. ON_WM_PAINT()
  184. ON_WM_QUERYDRAGICON()
  185. ON_BN_CLICKED(IDC_BUTTON_GA, OnButtonGa)
  186. ON_BN_CLICKED(IDABOUT, OnAbout)
  187. //}}AFX_MSG_MAP
  188. END_MESSAGE_MAP()
  189. /////////////////////////////////////////////////////////////////////////////
  190. // COpticalNetworkDlg message handlers
  191. BOOL COpticalNetworkDlg::OnInitDialog()
  192. {
  193. CDialog::OnInitDialog();
  194. // Add "About..." menu item to system menu.
  195. // IDM_ABOUTBOX must be in the system command range.
  196. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  197. ASSERT(IDM_ABOUTBOX < 0xF000);
  198. CMenu* pSysMenu = GetSystemMenu(FALSE);
  199. if (pSysMenu != NULL)
  200. {
  201. CString strAboutMenu;
  202. strAboutMenu.LoadString(IDS_ABOUTBOX);
  203. if (!strAboutMenu.IsEmpty())
  204. {
  205. pSysMenu->AppendMenu(MF_SEPARATOR);
  206. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  207. }
  208. }
  209. // Set the icon for this dialog.  The framework does this automatically
  210. //  when the application's main window is not a dialog
  211. SetIcon(m_hIcon, TRUE); // Set big icon
  212. SetIcon(m_hIcon, FALSE); // Set small icon
  213. // TODO: Add extra initialization here
  214. CAboutDlg about;
  215. about.DoModal();
  216. return TRUE;  // return TRUE  unless you set the focus to a control
  217. }
  218. void COpticalNetworkDlg::OnSysCommand(UINT nID, LPARAM lParam)
  219. {
  220. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  221. {
  222. CAboutDlg dlgAbout;
  223. dlgAbout.DoModal();
  224. }
  225. else
  226. {
  227. CDialog::OnSysCommand(nID, lParam);
  228. }
  229. }
  230. // If you add a minimize button to your dialog, you will need the code below
  231. //  to draw the icon.  For MFC applications using the document/view model,
  232. //  this is automatically done for you by the framework.
  233. void COpticalNetworkDlg::OnPaint() 
  234. {
  235. if (IsIconic())
  236. {
  237. CPaintDC dc(this); // device context for painting
  238. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  239. // Center icon in client rectangle
  240. int cxIcon = GetSystemMetrics(SM_CXICON);
  241. int cyIcon = GetSystemMetrics(SM_CYICON);
  242. CRect rect;
  243. GetClientRect(&rect);
  244. int x = (rect.Width() - cxIcon + 1) / 2;
  245. int y = (rect.Height() - cyIcon + 1) / 2;
  246. // Draw the icon
  247. dc.DrawIcon(x, y, m_hIcon);
  248. }
  249. else
  250. {   
  251. if(!m_bIsGa)
  252. {
  253.    int NetLeft,NetBottom;
  254.    int x_coordinate=0,y_coordinate=0;
  255.        char txt[4];
  256.        CString info;
  257.        CPen Pen;
  258.        CPen* OldPen;  
  259.        CDC* pDC=GetDC();
  260.    CRect RectClient,Workarea;
  261.            GetClientRect(RectClient);
  262.            Workarea.left=RectClient.left+RectClient.right/3-15;
  263.            Workarea.right=RectClient.right;
  264.            Workarea.top=RectClient.top;
  265.            Workarea.bottom=RectClient.bottom;
  266.            pDC->Rectangle(Workarea);
  267.            pDC->SetBkColor(0x00FFFFFF);
  268.        NetLeft=Workarea.left+25;
  269.        NetBottom=Workarea.bottom-20;
  270.        pDC->MoveTo(NetLeft,NetBottom);
  271.            pDC->LineTo(NetLeft+500,NetBottom);
  272.        pDC->MoveTo(NetLeft,NetBottom);
  273.        pDC->LineTo(NetLeft,NetBottom-500);  
  274.        pDC->TextOut(NetLeft+500,NetBottom-12,"X");
  275.        pDC->TextOut(NetLeft+5,NetBottom-505,"Y");
  276.        pDC->SetTextColor(0x000000FF);
  277.        info.Format("已进化代数 %d",0);//+1);//wsprintf(txt,"%d",m_CurGANum+1);
  278.        pDC->TextOut(NetLeft+100,NetBottom-520,info);
  279.        info="最小费用 ";//_MiniCost);//wsprintf(txt,"%4.6f",m_MiniCost);
  280.        pDC->TextOut(NetLeft+250,NetBottom-520,info);
  281.  
  282.        Pen.CreatePen(PS_SOLID,2,0x00100000);
  283.        OldPen=pDC->SelectObject(&PenOBD);
  284.        for(int b1=0;b1<m_nOBDNum;b1++)
  285.    {   
  286.        pDC->MoveTo(NetLeft+m_OBDX[b1]*5,NetBottom-m_OBDY[b1]*5);
  287.        pDC->LineTo(NetLeft+m_OLTX*5,NetBottom-m_OLTY*5);
  288.    }
  289.        Pen.DeleteObject();
  290.        pDC->SelectObject(OldPen);
  291.        pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
  292.        for(x_coordinate=0;x_coordinate<=10;x_coordinate++)
  293.    {
  294.            char xn[4];
  295.          wsprintf(xn,"%d",x_coordinate*10);
  296.        pDC->TextOut(NetLeft+x_coordinate*50-8,NetBottom+2,xn);
  297.    }
  298.        for(y_coordinate=1;y_coordinate<=10;y_coordinate++)
  299.    {
  300.            char yn[4];
  301.        wsprintf(yn,"%d",y_coordinate*10);
  302.        if(y_coordinate==10)
  303.        pDC->TextOut(NetLeft-24,NetBottom-y_coordinate*50,yn);
  304.        else
  305.        pDC->TextOut(NetLeft-22,NetBottom-y_coordinate*50,yn);
  306.    }
  307.        pDC->SetTextColor(0x000000FF);
  308.        pDC->TextOut(NetLeft+m_OLTX*5-7,NetBottom-m_OLTY*5-7,"★");
  309.        pDC->SetTextColor(0x00FF0000);
  310.        for(int a1=0;a1<m_nOBDNum;a1++)
  311.    {
  312.        wsprintf(txt,"%d",a1+1);
  313.            pDC->TextOut(NetLeft+m_OBDX[a1]*5-3,NetBottom-m_OBDY[a1]*5-9,txt);
  314.    }
  315.        pDC->SetTextColor(0x0000FF00);
  316.        for(int a2=0;a2<m_nONUNum;a2++)
  317.    {
  318.                wsprintf(txt,"%d",a2+1);
  319.                pDC->TextOut(NetLeft+m_ONUX[a2]*5-3,NetBottom-m_ONUY[a2]*5-9,txt);
  320.    }
  321.        pDC->SetTextColor(0x00FFFFFF);
  322.        pDC->TextOut(NetLeft+507,NetBottom-508,"c");
  323.        pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
  324.        pDC->SetBkColor(GetSysColor(COLOR_WINDOW));
  325. }
  326.     else
  327.  DrawNetwork();
  328.  CDialog::OnPaint();
  329. }
  330. }
  331. // The system calls this to obtain the cursor to display while the user drags
  332. //  the minimized window.
  333. HCURSOR COpticalNetworkDlg::OnQueryDragIcon()
  334. {
  335. return (HCURSOR) m_hIcon;
  336. }
  337. // 搜索最小C值
  338. double COpticalNetworkDlg::FindMiniC(double *data, int len)
  339. double mini=data[0];
  340. int mininum=0;
  341. for(int n=0;n<len;n++)
  342. {
  343. if(data[n]<mini)
  344. {
  345. mini=data[n];
  346.     mininum=n;
  347. }
  348. }
  349. return mini;
  350. }
  351. // 基因算法的具体实现
  352. void COpticalNetworkDlg::OnButtonGa() 
  353. {     
  354.  // 取得基因算法所需参数 
  355.  UpdateData(TRUE);
  356.      // 分配内存
  357.      OBD_OLT=(double *)malloc(sizeof(double)*m_nOBDNum);
  358.      ONU_OBD=(double *)malloc(sizeof(double)*m_nONUNum*m_nOBDNum);
  359.      // 根据群体规模和交叉概率计算出交叉个体个数
  360.  nGACrossNum = m_nGroupSize*m_GACrossProb/2;
  361.  // 根据群体规模和变异概率计算出变异个体个数
  362.      nGAVariNum  = m_nGroupSize*m_GAVariProb;
  363.  // 设置已进行过基因算法标志
  364.  m_bIsGa=TRUE;
  365.  // 为当前一代个体分配内存
  366.      for(int k=0;k<m_nGroupSize;k++)
  367.           GeneSerial[k]=(int *) malloc(sizeof(int)*m_nONUNum);
  368.   // 为当前一代个体交叉和变异后的新产生的个体分配内存
  369.      for(int u=0;u<nGACrossNum*2+nGAVariNum;u++)
  370.           NextGeneSerial[u]=(int *)malloc(sizeof(int)*m_nONUNum);
  371.      // 参数有效性检查
  372.  if(m_nONUNum>=m_nOBDLimit*m_nOBDNum)
  373.  {
  374.   AfxMessageBox("ONU数目过多,或者OBD数目过少,或OBD最大连接数目过小!",MB_OK|MB_ICONINFORMATION,NULL);
  375.           return; 
  376.  }
  377.  if(m_nGroupSize<nGACrossNum*2+nGAVariNum)
  378.  {
  379.   AfxMessageBox("群体规模过小,或者交叉概率过大,或者变异概率过大!",MB_OK|MB_ICONINFORMATION,NULL);
  380.           return; 
  381.  }
  382.      for(int n1=0;n1<m_nOBDNum;n1++)
  383.      {
  384.           OBD_OLT[n1]=sqrt((m_OBDX[n1]-m_OLTX)*(m_OBDX[n1]-m_OLTX)+(m_OBDY[n1]-m_OLTY)*(m_OBDY[n1]-m_OLTY));
  385.           nOBDLimit[n1]=m_nOBDLimit;
  386.      } 
  387.      int LimitTotal=0;
  388.      int CurGroupSize=1;
  389.      for(int p=0;p<m_nOBDNum;p++)
  390.           LimitTotal+=nOBDLimit[p];
  391.      for(int q=0;q<m_nONUNum;q++)
  392.      {
  393.           if(CurGroupSize>MAX_GROUPSIZE*10)
  394.           break;
  395.           else
  396.           {
  397.              CurGroupSize=LimitTotal*CurGroupSize;
  398.              LimitTotal--;
  399.           }
  400.      }
  401.      if(m_nGroupSize>CurGroupSize||m_nGroupSize>MAX_GROUPSIZE*10)
  402.           return;
  403.  // 计算ONU和OBD之间距离
  404.      for(int i=0;i<m_nONUNum;i++)
  405.           for(int j=0;j<m_nOBDNum;j++)                                            
  406.      *(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]));
  407.      // 产生初始基因序列   
  408.  for(int i1=0;i1<m_nGroupSize;i1++)
  409.      {          
  410.           for(int k=0;k<m_nOBDNum;k++)
  411.               nCurOBDLimit[i1][k]=0;
  412.           for(int j1=0;j1<m_nONUNum;j1++)
  413.           {
  414.              int RandInt;
  415.       Random:RandInt=RandomInt(0,m_nOBDNum-1);
  416.              if(nCurOBDLimit[i1][RandInt]<=nOBDLimit[RandInt]-1)
  417.              {
  418.                 *(GeneSerial[i1]+j1)=RandInt;
  419.                 nCurOBDLimit[i1][RandInt]++; 
  420.              }
  421.              else
  422.                 goto Random;   // 不满足约束条件2时,重新产生基因序列
  423.           } 
  424.      }
  425.  // 基因算法具体实现
  426.      for( nCurGANum=0;nCurGANum<m_GANum;nCurGANum++)
  427.      {   
  428.           // 计算当前一代群体中每个个体的适应度数值F
  429.   for(int i=0;i<m_nGroupSize;i++)
  430.           {    
  431.              Cost[i]=0;
  432.  for(int j=0;j<m_nONUNum;j++)
  433.  {   
  434.  Cost[i]=Cost[i]+*(ONU_OBD+j*m_nOBDNum+*(GeneSerial[i]+j))+*(OBD_OLT+*(GeneSerial[i]+j));             
  435.          temp[i][j]=*(ONU_OBD+j*m_nOBDNum+*(GeneSerial[i]+j));
  436.  }  
  437.  F[i]=1/Cost[i]; 
  438.  TotalF=F[i]+TotalF;
  439.           }
  440.           // 归一化F值
  441.   for(int a=0;a<m_nGroupSize;a++)
  442.              Pm[a]=F[a]/TotalF*100;
  443.           // 将当前一代群体中的个体按F值从大到小排序
  444.   for(int b=0;b<m_nGroupSize-1;b++)
  445.   {
  446.   FindMiniF(Pm,m_nGroupSize-b);
  447.   }
  448.   m_CurGANum=nCurGANum;
  449.        // 查找当前一代中的最小费用个体
  450.   m_MiniCost=FindMiniC(Cost,m_nGroupSize);
  451.   // 绘制图形
  452.   DrawNetwork();
  453.           // 交叉操作
  454.   for(int c=0;c<nGACrossNum;c++)
  455.           {  
  456.  int nExchangePos,temp=0;
  457.              int nNextOBD1;
  458.              int nNextOBD2;
  459.  int LimitLoop=0;
  460.              int new1=0;     // 发生交叉个体1在当前一代群体中位置
  461.  int new2=0;     // 发生交叉个体2在当前一代群体中位置
  462.              //int temp=0;
  463.       Limit1:new1=RandomInt(0,m_nGroupSize-1);   
  464.  temp=RandomInt(0,m_nGroupSize-1);
  465.              // 由于当前一代群体中个体已经按照F从大到小排序
  466.  // 如果new1>temp,则位置new1处个体F值小于temp处个体F值
  467.  // 所以选定new1=temp处个体进行交叉,体现了F值较大的个体有较多机会进行交叉
  468.  if(new1>temp)  
  469.                 new1=temp;
  470.              new2=RandomInt(0,m_nGroupSize-1);
  471.              temp=RandomInt(0,m_nGroupSize-1);
  472.              if(new2>temp)
  473.                 new2=temp;             
  474.              for(int g=0;g<m_nOBDNum;g++)
  475.              { 
  476.                  nNextOBDLimit[2*c][g]=nCurOBDLimit[new1][g];
  477.                  nNextOBDLimit[2*c+1][g]=nCurOBDLimit[new2][g];
  478.              } 
  479.             
  480.       Limit2:nExchangePos=RandomInt(0,m_nONUNum-1);  // 被选中交叉个体的基因序列中用于交叉的基因位
  481.              nNextOBD1=nNextOBDLimit[2*c][*(GeneSerial[new2]+nExchangePos)]+1;
  482.              nNextOBD2=nNextOBDLimit[2*c+1][*(GeneSerial[new1]+nExchangePos)]+1;
  483.  LimitLoop++;
  484.              if((nNextOBD1>nOBDLimit[*(GeneSerial[new2]+nExchangePos)])||(nNextOBD2>nOBDLimit[*(GeneSerial[new1]+nExchangePos)]))
  485.                  if(LimitLoop>50)   // 跳转到Limit2重新产生交叉位满50次,仍未满足约束条件2,
  486. goto Limit1;    // 则跳转到Limit1,重新产生交叉个体在当前一代群体中位置
  487.  else
  488.     goto Limit2;    // 交叉后,不满足约束条件2,跳转到Limit2重新产生交叉位
  489.              
  490.      // 交叉成功,产生新的个体
  491.  for(int m=0;m<m_nONUNum;m++)
  492.              {   
  493.                  if(m==nExchangePos)
  494.                  {
  495.                     *(NextGeneSerial[2*c]+nExchangePos)=*(GeneSerial[new2]+nExchangePos);
  496.                     *(NextGeneSerial[2*c+1]+nExchangePos)=*(GeneSerial[new1]+nExchangePos);
  497.                     nNextOBDLimit[2*c][*(GeneSerial[new2]+nExchangePos)]++;
  498.                     nNextOBDLimit[2*c][*(GeneSerial[new1]+nExchangePos)]--;
  499.                     nNextOBDLimit[2*c+1][*(GeneSerial[new2]+nExchangePos)]--;
  500.                     nNextOBDLimit[2*c+1][*(GeneSerial[new1]+nExchangePos)]++;                   
  501.                  }
  502.                  else
  503.                  {
  504.                     *(NextGeneSerial[2*c]+m)=*(GeneSerial[new1]+m);
  505.                     *(NextGeneSerial[2*c+1]+m)=*(GeneSerial[new2]+m);
  506.                  }
  507.               }            
  508.            } 
  509.            // 变异操作
  510.    for(int d=0;d<nGAVariNum;d++)
  511.            {
  512.                int nVariIndividual=0;
  513.                int nVariPos=0;
  514.    int VariLoop=0;
  515.          Vari1:VariLoop=0;
  516.    nVariIndividual=RandomInt(0,m_nGroupSize-1); // 发生变异个体在当前一代群体中位置
  517.    nVariPos=RandomInt(0,m_nONUNum-1);           // 发生变异个体的基因序列中变异的基因位
  518.                for(int z=0;z<m_nOBDNum;z++)
  519.                    nNextOBDLimit[2*nGACrossNum+d][z]=nCurOBDLimit[nVariIndividual][z];
  520.                for(int h=0;h<m_nONUNum;h++)
  521.                {
  522.                    if(h==nVariPos)
  523.                    {
  524.                       int nVariValue;
  525.                       int nNextVari;
  526.                Vari2: nVariValue=RandomInt(0,m_nOBDNum-1);  // 产生变异位变异后的值
  527.                       if(nVariValue==*(GeneSerial[nVariIndividual]+nVariPos))
  528.   {   
  529.   VariLoop++;
  530.   if(VariLoop==100) // 跳转到Vari2满50次,随机产生的变异位的值仍等于待变异位的当前值
  531.   goto Vari1;   // 则跳转到Vair1,重新产生变异个体在当前一代群体中位置
  532.   else
  533.       goto Vari2; // 变异位的值等于待变异位的当前值,跳转到Vari2,重新产生变异位变异后的值
  534.   }
  535.                       nNextVari=nNextOBDLimit[2*nGACrossNum+d][nVariValue]+1;
  536.                       if(nNextVari>nOBDLimit[nVariValue])
  537.                       {   
  538.   VariLoop++;
  539.   if(VariLoop==100)// 跳转到Vari2重新产生变异位满50次,仍未满足约束条件2,
  540.   goto Vari1;  // 则跳转到Vair1,重新产生变异个体在当前一代群体中位置
  541.   else
  542.       goto Vari2;  // 变异后,不满足约束条件2,跳转到Vari2重新产生变异位
  543.   }
  544.   // 变异成功
  545.                       *(NextGeneSerial[2*nGACrossNum+d]+h)=nVariValue;
  546.                       nNextOBDLimit[2*nGACrossNum+d][nVariValue]++;
  547.                       nNextOBDLimit[2*nGACrossNum+d][*(GeneSerial[nVariIndividual]+nVariPos)]--;
  548.                    }
  549.                    else
  550.                       *(NextGeneSerial[2*nGACrossNum+d]+h)=*(GeneSerial[nVariIndividual]+h);
  551.                 }
  552.            } 
  553.            
  554.            // 产生下一代群体
  555.    for(int e=0;e<2*nGACrossNum+nGAVariNum;e++)
  556.            {
  557.                for(int f=0;f<m_nONUNum;f++)
  558.                    *(GeneSerial[m_nGroupSize-e-1]+f)=*(NextGeneSerial[e]+f);
  559.                for(int x=0;x<m_nOBDNum;x++)
  560.                    nCurOBDLimit[m_nGroupSize-e-1][x]=nNextOBDLimit[e][x];
  561.            }
  562.    Sleep(m_SleepTime);
  563.       }
  564. }
  565. // 产生1~100之间的随机整数
  566. int COpticalNetworkDlg::RandomInt(int low,int high)
  567. {
  568.     int result;
  569. result=rand();
  570.     return result%(high+1);
  571. }
  572. // 搜索最小F值
  573. void COpticalNetworkDlg::FindMiniF(double *data,int len)
  574. {
  575.    double mini=data[0];
  576.    int    mininum=0;
  577.    int    CurOBDTemp;
  578.    int    *GeneSerTemp;
  579.    double datatemp;   
  580.    for(int n=0;n<len;n++)
  581.       if(mini>data[n])
  582.       {
  583.          mini=data[n];
  584.          mininum=n;
  585.       }
  586.    if(mininum!=len-1)
  587.    {
  588.       datatemp=*(data+len-1);
  589.       *(data+len-1)=*(data+mininum);
  590.       *(data+mininum)=datatemp;
  591.       GeneSerTemp=GeneSerial[len-1];
  592.   GeneSerial[len-1]=GeneSerial[mininum];
  593.   GeneSerial[mininum]=GeneSerTemp;   
  594.   for(int n2=0;n2<m_nOBDNum;n2++)
  595.   {
  596.   CurOBDTemp=nCurOBDLimit[mininum][n2];
  597.       nCurOBDLimit[mininum][n2]=nCurOBDLimit[len-1][n2];
  598.   nCurOBDLimit[len-1][n2]=CurOBDTemp; 
  599.   }
  600.    }
  601. }
  602. void COpticalNetworkDlg::DrawNetwork()
  603. {
  604.      int NetLeft,NetBottom;
  605.  int x_coordinate=0,y_coordinate=0;
  606.  char txt[4];
  607.  CString info;  
  608.  CDC* pDC=GetDC();
  609.      CRect RectClient,Workarea;
  610.      GetClientRect(RectClient);
  611.      Workarea.left=RectClient.left+RectClient.right/3-15;
  612.      Workarea.right=RectClient.right;
  613.      Workarea.top=RectClient.top;
  614.      Workarea.bottom=RectClient.bottom;
  615.      pDC->Rectangle(Workarea);
  616.      pDC->SetBkColor(0x00FFFFFF);
  617.  NetLeft=Workarea.left+25;
  618.  NetBottom=Workarea.bottom-20;
  619.  pDC->MoveTo(NetLeft,NetBottom);
  620.      pDC->LineTo(NetLeft+500,NetBottom);
  621.  pDC->MoveTo(NetLeft,NetBottom);
  622.  pDC->LineTo(NetLeft,NetBottom-500);  
  623.  pDC->TextOut(NetLeft+500,NetBottom-12,"X");
  624.  pDC->TextOut(NetLeft+5,NetBottom-505,"Y");
  625.  pDC->SetTextColor(0x000000FF);
  626.  info.Format("已进化代数 %d",m_CurGANum+1);
  627.  pDC->TextOut(NetLeft+100,NetBottom-520,info);
  628.  info.Format("最小费用 %5.5f",m_MiniCost);
  629.  pDC->TextOut(NetLeft+250,NetBottom-520,info);
  630.  pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
  631.  for(x_coordinate=0;x_coordinate<=10;x_coordinate++)
  632.  {
  633.     char xn[4];
  634. wsprintf(xn,"%d",x_coordinate*10);
  635. pDC->TextOut(NetLeft+x_coordinate*50-8,NetBottom+2,xn);
  636.  }
  637.  for(y_coordinate=1;y_coordinate<=10;y_coordinate++)
  638.  {
  639.     char yn[4];
  640. wsprintf(yn,"%d",y_coordinate*10);
  641. if(y_coordinate==10)
  642. pDC->TextOut(NetLeft-24,NetBottom-y_coordinate*50,yn);
  643. else
  644. pDC->TextOut(NetLeft-22,NetBottom-y_coordinate*50,yn);
  645.  }
  646.  PtrOldPen=pDC->SelectObject(&PenOBD);
  647.  for(int b1=0;b1<m_nOBDNum;b1++)
  648.  {   
  649.  pDC->MoveTo(NetLeft+m_OBDX[b1]*5,NetBottom-m_OBDY[b1]*5);
  650.  pDC->LineTo(NetLeft+m_OLTX*5,NetBottom-m_OLTY*5);
  651.  }
  652.  for(int b2=0;b2<m_nONUNum;b2++)
  653.  {  
  654.  pDC->SelectObject(&PenONU[colornum]);
  655.  pDC->MoveTo(NetLeft+m_ONUX[b2]*5,NetBottom-m_ONUY[b2]*5);
  656.  pDC->LineTo(NetLeft+m_OBDX[*(GeneSerial[0]+b2)]*5,NetBottom-m_OBDY[*(GeneSerial[0]+b2)]*5);
  657.  colornum++;
  658.  if(colornum==16)
  659. colornum=0;  
  660.  }
  661.  pDC->SelectObject(PtrOldPen);    
  662.  pDC->SetTextColor(0x000000FF);
  663.  pDC->TextOut(NetLeft+m_OLTX*5-7,NetBottom-m_OLTY*5-7,"★");
  664.  pDC->SetTextColor(0x00FF0000);
  665.  for(int a1=0;a1<m_nOBDNum;a1++)
  666.  {
  667.  wsprintf(txt,"%d",a1+1);
  668.      pDC->TextOut(NetLeft+m_OBDX[a1]*5-3,NetBottom-m_OBDY[a1]*5-9,txt);
  669.  }
  670.  pDC->SetTextColor(0x0000FF00);
  671.  for(int a2=0;a2<m_nONUNum;a2++)
  672.  {
  673.          wsprintf(txt,"%d",a2+1);
  674.          pDC->TextOut(NetLeft+m_ONUX[a2]*5-3,NetBottom-m_ONUY[a2]*5-9,txt);
  675.  }
  676.  pDC->SetTextColor(0x00FFFFFF);
  677.  pDC->TextOut(NetLeft+507,NetBottom-508,"c");
  678.  pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
  679.  pDC->SetBkColor(GetSysColor(COLOR_WINDOW));
  680.  
  681. }
  682. void COpticalNetworkDlg::OnAbout() 
  683. {
  684.      CAboutDlg dlg;
  685.      dlg.DoModal();
  686. }
  687. void COpticalNetworkDlg::OnOK() 
  688. {
  689. CDialog::OnOK();
  690. }