wangfanzhao 发表于 2010-1-5 15:10

好啊 最近掖在玩遗传算法 一定很有用阿

yinfeiyangfang 发表于 2010-1-7 09:04

回复 1# 落叶不黄

很好!最近正学遗传算法!希望能够分享!(本文来自于数学中国社区,网址为http://www.madio.net/mcm)

2010zzw 发表于 2010-1-31 15:01

ddddddddddddddd,好东西………………

ml61878016 发表于 2010-2-16 12:36

。。。。。。。。。。。。。。。。谢谢啊

ml61878016 发表于 2010-2-16 12:37

。。。。。。。。。。。。。。。。谢谢啊

jiqiren5328 发表于 2010-2-17 20:01

lu guo xia ge ,xiexie ~!~!~!~!~!!!!!!!!!!!

lxrambo 发表于 2010-4-28 22:51

很好!最近正学遗传算法!希望能够分享!

lxrambo 发表于 2010-4-28 22:51

试试看。。。。。。。。。。。。。。。。。。。。。。

新用户 发表于 2010-4-29 19:06

调试的时候就是有两个问题,弄了两天了,我也不好说,哪位高手帮忙指点下:非常感激,急急急!!!!! qq:394037668

Hamilton周游路线问题

8×8 的国际象棋棋盘上的一只马,恰好走过除起点外的其它63 个位置各一次,最后回到起点。这条路线称为一条马的Hamilton 周游路线。对于给定的m×n 的国际象棋棋盘,m和n均为大于5 的偶数,且|m-n|≤2,试设计一个分治算法找出一条马的Hamilton周游路线。

对于给定的偶数m,n≥6,且|m-n|≤2,编程计算m×n 的国际象棋棋盘一条马的Hamilton周游路线。



//算法实现:

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <afxtempl.h>
using namespace std;
template<class T>

void Make2DArray(T** &x , int rows , int cols )
{
//创建行指针
x = new T* ;
//为每一行分配空间
for( int  i= 0 ; i<rows; i++ )   
{
  x = new int ;
}
}
template<class T>

void Delete2DArray(T** &x , int rows)
{
//释放为每一行所分配的空间
for( int i = 0 ; i < rows ; i++ )
{
  delete[] x ;
}
// 释放行指针
delete[] x ;
x = 0 ;
}

//其中,grid是表示整数对的结构。
typedef struct
{
int x;
int y;
}grid;

//用一个类Knight实现算法。


class Knight
{
public:
Knight(int m,int n);
~Knight(){};
void out();
private:
int m,n;
grid *b66,*b68,*b86,*b88,*b810,*b108,*b1010,*b1012,*b1210,**link;
int pos(int x,int y,int col);
void step(int m,int n,int **a,grid *b);
void build(int m,int n,int offx,int offy,int col,grid *b);
void base(int mm,int nn,int offx,int offy);
bool comp(int mm,int nn,int offx,int offy );
};




//m和n分别表示棋盘的行数和列数。二维数组link用来表示Hamilton回路。
//b66,b68,b86,b88,b810,b108,b1010,b1012,b1210分别表示6*6,6*8,8*6,8*8,8*10,10*8,10*10,10*12,12*10棋盘上的结构化Hamilton回路。


//构造函数读入基础数据,初始化各数组。

Knight::Knight(int mm,int nn)
{
int i,j,**a;
ifstream fin0;
m=mm;n=nn;
b66=new grid;
b68=new grid;
b86=new grid;
b88=new grid;
b810=new grid;
b108=new grid;
b1010=new grid;
b1012=new grid;
b1210=new grid;
Make2DArray(link,m,n);
Make2DArray(a,10,12);

for(i=0;i<6;i++)
  for(j=0;j<6;j++)
   fin0>>a;
step(6,6,a,b66);
for(i=0;i<6;i++)
  for(j=0;j<8;j++)
   fin0>>a;
step(6,8,a,b68);
step(8,6,a,b86);
for(i=0;i<8;i++)
  for(j=0;j<8;j++)
   fin0>>a;
step(8,8,a,b88);
for(i=0;i<8;i++)
  for(j=0;j<10;j++)
   fin0>>a;
step(8,10,a,b810);
step(10,8,a,b108);
for(i=0;i<10;i++)
  for(j=0;j<10;j++)
   fin0>>a;
step(10,10,a,b1010);
for(i=0;i<10;i++)
  for(j=0;j<12;j++)
   fin0>>a;
step(10,12,a,b1012);
step(12,10,a,b1210);
      
}


//其中,step用于将读入的基础棋盘的Hamilton回路转化为网格数据。

void Knight::step(int m,int n,int **a,grid *b)
{
    int i,j,k=m*n;
    if(m<n)
{
  for(i=0;i<m;i++)
   for(j=0;j<n;j++)
   {
    int p=a-1;
    b.x=i;b.y=j;
   }
    }
    else{
  for(i=0;i<m;i++)
   for(j=0;j<n;j++){
    int p=a-1;
    b.x=i;b.y=j;
   }
    }
}


//分治法的主体由如下算法comp给出。
bool odd(int data)
{
if (data%2 ==0)
{
  return false;
}
return true;
}


bool Knight::comp(int mm,int nn,int offx,int offy)
{
    int mm1,mm2,nn1,nn2;
    int x,y,p;
    if(odd(mm)||odd(nn)||mm-nn>2||nn-mm>2||mm<6||nn<6)return 1;
    if(mm<12||nn<12){base(mm,nn,offx,offy);return 0;}  //基础解
    mm1=mm/2;
    if(mm%4<0)mm1--;
    mm2=mm-mm1;
    nn1=nn/2;
    if(nn%4>0)nn1--;
    nn2=nn-nn1;
    //分割步
    comp(mm1,nn1,offx,offy);
    comp(mm1,nn2,offx,offy+nn1);
    comp(mm2,nn1,offx+mm1,offy);
    comp(mm2,nn2,offx+mm1,offy+nn1);
    //合并步
    x=offx+mm1-1;y=offy+nn1-3;
    x=x-1;y=y+2;
    x=x-1;y=y+2;
    x=x+2;y=y-1;
    x=x+1;y=y+2;
    x=x+1;y=y-2;
    x=x+1;y=y-2;
    x=x-2;y=y+1;
   
    for(int i=0;i<8;i++) p=pos(x,y,n);
    for(i=1;i<8;i+=2){
  int j1=(i+1)%8,j2=(i+2)%8;
  if(link]].x==p) link]].x=p;
  else link]].y=p;
  if(link]].x==p) link]].x=p;
  else link]].y=p;
    }
    return 0;
}


//其中,base是根据基础解构造子棋盘的结构化Hamilton回路。

void Knight::base(int mm,int nn,int offx,int offy)
{
    if(mm==6&&nn==6)build(mm,nn,offx,offy,n,b66);
    if(mm==6&&nn==8)build(mm,nn,offx,offy,n,b68);
    if(mm==8&&nn==6)build(mm,nn,offx,offy,n,b86);
    if(mm==8&&nn==8)build(mm,nn,offx,offy,n,b88);
    if(mm==8&&nn==10)build(mm,nn,offx,offy,n,b810);
    if(mm==10&&nn==8)build(mm,nn,offx,offy,n,b108);
    if(mm==10&&nn==10)build(mm,nn,offx,offy,n,b1010);
    if(mm==10&&nn==12)build(mm,nn,offx,offy,n,b1012);
    if(mm==12&&nn==10)build(mm,nn,offx,offy,n,b1210);
}


//其实质性的构造由算法build来完成。

void Knight::build(int m,int n,int offx,int offy,int col,grid *b)
{
    int i,p,q,k=m*n;
    for(i=0;i<k;i++){
  int x1=offx+b.x,
   y1=offy+b.y,
   x2=offx+b[(i+1)%k].x,
   y2=offy+b[(i+1)%k].y;
  p=pos(x1,y1,col);q=pos(x2,y2,col);
  link.x=q;link.y=p;
    }
}


//其中,pos用于计算棋盘方格的编号。棋盘方格各行从上到下,各列从左到右依次编号为0,1,....,mn-1.

int Knight::pos(int x,int y,int col)
{
return col*x|y;
}


//最后,由out按照要求输出计算出的结构化Hamilton回路。

void Knight::out()
{
    int i,j,k,x,y,p,**a;
    Make2DArray(a,m,n);
    if(comp(m,n,0,0)) return;
    for(i=0;i<m;i++)
  for(j=0;j<n;j++) a=0;
  i=0;j=0;k=2;a=1;
  cout<<"(0,0)"<<"";
  for(p=1;p<m*n;p++){
   x=link.x;y=link.y;
   i=x/n;j=k%n;
   if(a>0){i=y/n;j=y%n;}
   a=k++;
   cout<<"("<<i<<","<<j<<")";
   if((k-1)%n==0) cout<<endl;
  }
  cout<<endl;
  for(i=0;i<m;i++){
   for(j=0;j<n;j++) cout<<a<<"";
   cout<<endl;
  }
}

wxrfly 发表于 2010-5-1 11:41

en !~这次正用的上~~~~~~~~~~~~~~
页: 1 2 3 [4] 5 6
查看完整版本: 遗传算法及其应用.pdf