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 !~这次正用的上~~~~~~~~~~~~~~