#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<time.h>
using namespace std;
struct individual{
int DNA[25];
int p;
};
int n;
int dist[25][25];
individual group[11];
individual nextGroup[11];
int size;
int varyP=8;
int season;
#define MAX 9999
void show(int season)
{
cout<<"time"<<season<<":"<<endl;
for(int i=1;i<=size;i++)
{
for(int j=1;j<=n;j++)
{
cout<<group[i].DNA[j]<<" ";
}
cout<<MAX-group[i].p<<endl;
}
cout<<endl;
}
void getInfo()
{
ifstream input("input.txt");
input>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
input>>dist[i][j];
}
}
}
void original()
{
srand(unsigned(time(0)));
for(int i=1;i<=size;i++)
{
group[i].DNA[1]=1;
for(int j=2;j<=n;j++)
{
group[i].DNA[j]=rand()%(n-j+1)+1;
}
}
}
int adaption(individual individual)
{
int *t=new int[n];
for(int i=1;i<=n;i++)
{
t[i]=i;
}
int *order=new int[n];
for(int i=1;i<=n;i++)
{
order[i]=t[individual.DNA[i]];
for(int j=individual.DNA[i]+1;j<=n;j++)
{
t[j-1]=t[j];
}
}
int cost=0;
cost+=dist[1][order[1]];
for(int i=1;i<n;i++)
{
cost+=dist[order[i]][order[i+1]];
}
cost+=dist[order[n]][1];
return MAX-cost;
}
void hybrid(int individual1,int individual2)
{
srand(unsigned(time(0)));
int p=rand()%n+1;
int t;
for(int i=p;i<=n;i++)
{
t=group[individual1].DNA[i];
group[individual1].DNA[i]=group[individual2].DNA[i];
group[individual2].DNA[i]=t;
}
}
void vary(int individual)
{
srand(unsigned(time(0)));
int p=rand()%(n-1)+2;
group[individual].DNA[p]=rand()%(n-p+1)+1;
}
void choose()
{
int total=0;
for(int i=1;i<=n;i++)
{
total+=group[i].p;
}
srand(unsigned(time(0)));
for(int i=1;i<=n;i++)
{
for(int j=1,p=0,pointer=rand()%total+1;j<=n;j++)
{
p+=group[j].p;
if(p>=pointer)
{
nextGroup[i]=group[j];
break;
}
}
}
for(int i=1;i<=n;i++)
{
group[i]=nextGroup[i];
}
}
void nature()
{
srand(unsigned(time(0)));
cout<<"please input the size of the group:";
cin>>size;
cout<<"input the time:";
cin>>season;
getInfo();
original();
for(int i=1;i<=season;i++)
{
show(i);
for(int j=1;j<size;j++)
{
hybrid(j,j+1);
int p=rand()%10+1;
if(p>=varyP) vary(j);
group[j].p=adaption(group[j]);
choose();
}
}
show(season);
}
void main()
{
nature();
system("pause");
}