คืออยากได้โค้ตที่แปลงจากโค้ตที่ให้มาเป็น
x/y = 0.10569105691057
อยากทราบว่า X มีค่าเป็นเท่าไหร่ Y มีค่าเป็นเท่าไหร่ เมื่อหารกันแล้วได้ 0.10569105691057
(ขอโค้ตนะคะ)
โดยการใช้การสุ่มค่า คะ
[code]#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define PopSize 9
#define PopLen 2
#define cr 0.8
#define mu 0.1
#define re 0.1
#define TSize 3
#define MaxGen 100
int Pop[PopSize][PopLen],NewPop[PopSize][PopLen];
int Fit[PopSize][2];
int SumFit;
int myrand(int l, int h){
int y;
y = h-l+1;
return(rand()%y + l);
}
void InitPop(){ //Create New Population
int i,j;
for(i=0;i<PopSize;i++){
for(j=0;j<PopLen;j++){
Pop
[j]=myrand(1,9);
}
}
}
void ShowPop(){
int i,j;
for(i=0;i<PopSize;i++){
for(j=0;j<PopLen;j++){
printf("%d ",Pop[Fit
[0]][j]); // i = > Fit[0]
}
printf("\tFit=%d\n",Fit
[1]);
}
}
void ShowNewPop(){
int i,j;
for(i=0;i<PopSize;i++){
for(j=0;j<PopLen;j++){
printf("%d ",NewPop
[j]);
}
printf("\n");
}
}
void FitEval(){
int i,j,c;
int r,z=0;
int f[81]={1,2,3,4,5,4,3,2,1,
2,3,4,5,6,5,4,3,2,
3,4,5,6,7,6,5,4,3,
4,5,6,7,8,7,6,5,4,
5,6,7,8,9,8,7,6,5,
4,5,6,7,8,7,6,5,4,
3,4,5,6,7,6,5,4,3,
2,3,4,5,6,5,4,3,2,
1,2,3,4,5,4,3,2,1};
for(i=0;i<PopSize;i++){
r=0;
if(Pop
[0]==1) {
z=(Pop
[0]+Pop[1])-2;
}else{
z=((((Pop
[0]-1)*9)+Pop[1])-1);
}
r=f[z];
Fit
[0]=i;
Fit
[1]=r;
}
for(i=0;i<PopSize-1;i++){
for(j=i;j<PopSize;j++){
if(Fit[j][1]>Fit
[1]){
c=Fit
[0];
Fit
[0]=Fit[j][0];
Fit[j][0]=c;
c=Fit
[1];
Fit
[1]=Fit[j][1];
Fit[j][1]=c;
}
}
}
SumFit=0;
for(i=0;i<PopSize;i++){
SumFit+=Fit
[1];
}
}
int TSelect(){
int solution,t,i;
solution=myrand(0,PopSize-1);
for(i=1;i<TSize;i++){
t=myrand(0,PopSize-1);
if(Fit[t][1] > Fit[solution][1]){
solution=t;
}
}
return(solution);
}
void Reproduction(){
int c,i,j;
if(PopSize==9){
c=1;
}else{
c=PopSize*re;
}
for(i=0;i<c;i++){
for(j=0;j<PopLen;j++){
NewPop
[j]=Pop[Fit[0]][j];
}
}
}
void Crossover(){
int c,i,j,p1,p2,cp;
c=PopSize*(re+cr);
if(PopSize==9){
c=7;
}else{
c=PopSize*(re+cr);
}
for(i=PopSize*re;i<c;i++){
p1=TSelect();
do{
p2=TSelect();
}while(p1==p2);
cp=1;
for(j=0;j<PopLen;j++){
if(j<cp){
NewPop
[j]=Pop[p1][j];
NewPop[i+1][j]=Pop[p2][j];
} else{
NewPop
[j]=Pop[p2][j];
NewPop[i+1][j]=Pop[p1][j];
}
}
i++;
}
}
void Mutation(){
int i,j,p1,mp,pn,x,c;
c=PopSize*(re+cr);
if(PopSize==9){
c=1;
}
for (i=c;i<PopSize;i++){
p1=TSelect();
mp=myrand(0,1);
for(j=0;j<PopLen;j++){
if(j!=mp){
NewPop
[j]=Pop[p1][j];
}else{
x = myrand(1,9);
NewPop
[j] = x;
}
}
}
}
void CopyPop(){
int i,j;
for(i=0;i<PopSize;i++){
for(j=0;j<PopLen;j++){
Pop
[j]=NewPop[j];
}
}
}
void ShowInd(int x){
int i;
printf("\n");
for(i=0;i<PopLen;i++){
printf("%d",Pop[x]
);
}
printf("\n");
}
main(){
int seed,gen,check=0;
seed = (unsigned) time(NULL);
srand(seed);
gen=0;
InitPop();
FitEval();
while(Fit[0][1]!=9 && gen<MaxGen){
printf("\n");
Reproduction();
Crossover();
Mutation();
CopyPop();
FitEval();
gen++;
printf("Gen = %d Fit = %d\n",gen,Fit[0][1]);
check=1;
ShowPop();
}
if(check==0){
printf("Gen = 0 Fit = 9\n",gen);
printf("\n +++ Ans +++\n");
ShowInd(Fit[0][0]);
}else{
printf("\n +++ Ans +++\n");
ShowInd(Fit[0][0]);
}
}
[/code]
Random C++
x/y = 0.10569105691057
อยากทราบว่า X มีค่าเป็นเท่าไหร่ Y มีค่าเป็นเท่าไหร่ เมื่อหารกันแล้วได้ 0.10569105691057
(ขอโค้ตนะคะ)
โดยการใช้การสุ่มค่า คะ
[code]#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define PopSize 9
#define PopLen 2
#define cr 0.8
#define mu 0.1
#define re 0.1
#define TSize 3
#define MaxGen 100
int Pop[PopSize][PopLen],NewPop[PopSize][PopLen];
int Fit[PopSize][2];
int SumFit;
int myrand(int l, int h){
int y;
y = h-l+1;
return(rand()%y + l);
}
void InitPop(){ //Create New Population
int i,j;
for(i=0;i<PopSize;i++){
for(j=0;j<PopLen;j++){
Pop[j]=myrand(1,9);
}
}
}
void ShowPop(){
int i,j;
for(i=0;i<PopSize;i++){
for(j=0;j<PopLen;j++){
printf("%d ",Pop[Fit[0]][j]); // i = > Fit[0]
}
printf("\tFit=%d\n",Fit[1]);
}
}
void ShowNewPop(){
int i,j;
for(i=0;i<PopSize;i++){
for(j=0;j<PopLen;j++){
printf("%d ",NewPop[j]);
}
printf("\n");
}
}
void FitEval(){
int i,j,c;
int r,z=0;
int f[81]={1,2,3,4,5,4,3,2,1,
2,3,4,5,6,5,4,3,2,
3,4,5,6,7,6,5,4,3,
4,5,6,7,8,7,6,5,4,
5,6,7,8,9,8,7,6,5,
4,5,6,7,8,7,6,5,4,
3,4,5,6,7,6,5,4,3,
2,3,4,5,6,5,4,3,2,
1,2,3,4,5,4,3,2,1};
for(i=0;i<PopSize;i++){
r=0;
if(Pop[0]==1) {
z=(Pop[0]+Pop[1])-2;
}else{
z=((((Pop[0]-1)*9)+Pop[1])-1);
}
r=f[z];
Fit[0]=i;
Fit[1]=r;
}
for(i=0;i<PopSize-1;i++){
for(j=i;j<PopSize;j++){
if(Fit[j][1]>Fit[1]){
c=Fit[0];
Fit[0]=Fit[j][0];
Fit[j][0]=c;
c=Fit[1];
Fit[1]=Fit[j][1];
Fit[j][1]=c;
}
}
}
SumFit=0;
for(i=0;i<PopSize;i++){
SumFit+=Fit[1];
}
}
int TSelect(){
int solution,t,i;
solution=myrand(0,PopSize-1);
for(i=1;i<TSize;i++){
t=myrand(0,PopSize-1);
if(Fit[t][1] > Fit[solution][1]){
solution=t;
}
}
return(solution);
}
void Reproduction(){
int c,i,j;
if(PopSize==9){
c=1;
}else{
c=PopSize*re;
}
for(i=0;i<c;i++){
for(j=0;j<PopLen;j++){
NewPop[j]=Pop[Fit[0]][j];
}
}
}
void Crossover(){
int c,i,j,p1,p2,cp;
c=PopSize*(re+cr);
if(PopSize==9){
c=7;
}else{
c=PopSize*(re+cr);
}
for(i=PopSize*re;i<c;i++){
p1=TSelect();
do{
p2=TSelect();
}while(p1==p2);
cp=1;
for(j=0;j<PopLen;j++){
if(j<cp){
NewPop[j]=Pop[p1][j];
NewPop[i+1][j]=Pop[p2][j];
} else{
NewPop[j]=Pop[p2][j];
NewPop[i+1][j]=Pop[p1][j];
}
}
i++;
}
}
void Mutation(){
int i,j,p1,mp,pn,x,c;
c=PopSize*(re+cr);
if(PopSize==9){
c=1;
}
for (i=c;i<PopSize;i++){
p1=TSelect();
mp=myrand(0,1);
for(j=0;j<PopLen;j++){
if(j!=mp){
NewPop[j]=Pop[p1][j];
}else{
x = myrand(1,9);
NewPop[j] = x;
}
}
}
}
void CopyPop(){
int i,j;
for(i=0;i<PopSize;i++){
for(j=0;j<PopLen;j++){
Pop[j]=NewPop[j];
}
}
}
void ShowInd(int x){
int i;
printf("\n");
for(i=0;i<PopLen;i++){
printf("%d",Pop[x]);
}
printf("\n");
}
main(){
int seed,gen,check=0;
seed = (unsigned) time(NULL);
srand(seed);
gen=0;
InitPop();
FitEval();
while(Fit[0][1]!=9 && gen<MaxGen){
printf("\n");
Reproduction();
Crossover();
Mutation();
CopyPop();
FitEval();
gen++;
printf("Gen = %d Fit = %d\n",gen,Fit[0][1]);
check=1;
ShowPop();
}
if(check==0){
printf("Gen = 0 Fit = 9\n",gen);
printf("\n +++ Ans +++\n");
ShowInd(Fit[0][0]);
}else{
printf("\n +++ Ans +++\n");
ShowInd(Fit[0][0]);
}
}
[/code]