📄 ucom_rw.cpp
字号:
#include<iostream.h>
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<fstream.h>
#include<stdlib.h>
#include<iomanip.h>
#include<dos.h>
#include<time.h>
#define boddah 6
#define max_lchrom 45
#define max_popsize 91
/*These are the min&max combined total output power for every stages
Stage1 - 1100<<pow<<1200
Stage2 - 1400<<pow<<1500
Stage3 - 1600<<pow<<1700
Stage4 - 1800<<pow<<1900
Stage5 - 1400<<pow<<1500
Stage6 - 1100<<pow<<1200
*/
/*capacity load units | Coefficient of units
ai bi ci
100 << Power1 << 625 | 0.008 8 500
100 << Power2 << 625 | 0.0096 6.4 400
75 << Power3 << 600 | 0.01 7.9 600
75 << Power4 << 500 | 0.011 7.5 400
Fitness function
Cost1 = (0.5*ai*Power + bi*Power + ci) + Transition cost
Startup cost - RM3000
Shutdown cost -RM1500
*/
struct poop{int conv,chr[max_lchrom];float ratio,fitness,sumpowgen;
float pow1,pow2,pow3,pow4;
float pw1,pw2,pw3,pw4,total_pow;
}
initpop[max_popsize],tempop[max_popsize],offspring1[1],offspring2[1],solution[7];
struct kumite{float fitness;int win;int id;}
opp[6];
int champ,champ2,x2,myran,checker,rini;
float qq,y,dummy,totalfit;
int i,j,lchrom,popsize,gen,k,z,mark,mark2,m;
int zero,ada,nomb,a,b,crossover,mutation;
int marker;
float error;
float cost1,cost2,cost3,cost4;
float maxfit,minfit,avgfit,sumfit;
float sumfitness,sumratio1,sumratio2;
float jum2[max_popsize],jum[max_popsize],power1[max_popsize],power2[max_popsize],
power3[max_popsize],power4[max_popsize];
float val1[max_popsize],val2[max_popsize];
int ranum,fittest,bilchrom,parent[3],list[max_popsize],dice,dice2;
float opp1,opp2;
float p1,p2,p3,p4,checksum,v1,v2;
float partition[max_popsize],tmp,dum1,dum2;
time_t start,end;
void gen_rand_pop(int);
void build_wheel(int);
void eval_fitness(int,int);
void xover(int,int,int);
void mutate(int,int,int);
void replicate(int,int,int);
void setpop(int);
int migrate(int,int);
int migrate2(int,int);
void migratelit(int);
void calc_power(int);
int check_vacancy(int);
void correct_offspring();
int geterr();
void tournament(int);
void nu_tour(int);
void display2();
void display();
int preserve(int,int);
void zilch(int);
void preent(int);
void preent2(int);
void roulette(int);
void jeremy();
void intro();
main()
{
clrscr();
popsize = 18;
lchrom = 44;
randomize();
intro();
gotoxy(30,11);
cout<<"GA running";
start=time(NULL);
for(int ga=1;ga<=6;ga++)
{
gen = 1;
marker = 0;
zilch(ga);
gen_rand_pop(ga);
calc_power(1);
eval_fitness(1,ga);
geterr();
reproduce:
preent(ga);
setpop(1);
//migratelit(1);
selection:
roulette(1);
a = 5;
b = 15;
for(m=1;m<=4;m++)
{
gen_xover:
mark = 0; mark2 = 0;
crossover = random(100) + 1;
if(crossover == 0)
goto gen_xover;
if(crossover >= 1 && crossover <= 60)
xover(a,b,1);
else
mark = 1;
gen_mut:
mutation = random(1000) + 1;
if(mutation == 0)
goto gen_mut;
if(mutation == 1)
mutate(a,b,1);
else
mark2 = 1;
if(mark == 1 && mark2 == 1)
goto gen_xover;
a = a + 10;
b = b + 10;
}
correct_offspring();
migrate(1,ga); //migrate to tempop
migrate2(1,ga);
check_vacancy(1);
if(bilchrom < popsize)
goto selection;
gen++;
calc_power(2);
eval_fitness(2,ga);
geterr();
if(error < 0.0001)
{
marker = 1;
preserve(ga,2);
totalfit = totalfit + solution[ga].fitness;
preent2(ga);
goto here;
}
if(gen == 2000)
{
marker = 1;
preserve(ga,2);
totalfit = totalfit + solution[ga].fitness;
preent2(ga);
goto here;
}
preent2(ga);
setpop(2);
//migratelit(2);
selection2:
roulette(2);
a = 5;
b = 15;
for(m=1;m<=4;m++)
{
gen_xover2:
mark = 0; mark2 = 0;
crossover = random(100) + 1;
if(crossover == 0)
goto gen_xover2;
if(crossover >= 1 && crossover <= 60)
xover(a,b,2);
else
mark = 1;
gen_mut2:
mutation = random(1000) + 1;
if(mutation == 0)
goto gen_mut2;
if(mutation == 1)
mutate(a,b,2);
else
mark2 = 1;
if(mark == 1 && mark2 == 1)
goto gen_xover2;
a = a + 10;
b = b + 10;
}
correct_offspring();
migrate(2,ga);//migrate to initpop
migrate2(2,ga);
check_vacancy(2);
if(bilchrom < popsize)
goto selection2;
gen++;
calc_power(1);
eval_fitness(1,ga);
geterr();
if(error < 0.0001)
{
marker = 2;
preserve(ga,1);
totalfit = totalfit + solution[ga].fitness;
preent(ga);
goto here;
}
if(gen <= 2000)
goto reproduce;
here:
}//end for ga
end=time(NULL);
jeremy();
cout.setf( ios::fixed );
cout << setprecision(3);
gotoxy(26,22);
cout<<"Total Operating Cost: RM"<<totalfit;
gotoxy(26,23);
cout<<"Time consumed: "<<difftime(end,start)<<" second(s).";
getch();
return 0;
}
void intro()
{
gotoxy(7,3);
cout<<"-----------------------------------------------------------------";
gotoxy(7,5);
cout<<"A GENETIC ALGORITHM APPROACH TO SOLVE THE UNIT COMMITMENT PROBLEM";
gotoxy(7,7);
cout<<"-----------------------------------------------------------------";
gotoxy(7,9);
cout<<"The UC problem is solved using a GA under these parameters:";
gotoxy(7,11);
cout<<"Selection scheme : Roulette Wheel";
gotoxy(7,12);
cout<<"Population size : 18";
gotoxy(7,13);
cout<<"Crossover rate : 0.6";
gotoxy(7,14);
cout<<"Mutation rate : 0.001";
gotoxy(7,15);
cout<<"Constraint : 0 - 100MW of permitted power exceeding range.";
gotoxy(7,19);
cout<<"Press any key to start the GA...";
getch();
clrscr();
}
void roulette(int x)// initpop or tempop
{
//sum the fitness
sumfitness = 0.0;
for(i=1;i<=popsize;i++)
{
if(x == 1)
sumfitness = sumfitness + initpop[i].fitness;
if(x == 2)
sumfitness = sumfitness + tempop[i].fitness;
}
//for(i=1;i<=popsize;i++)
// cout<<initpop[i].fitness<<endl;
//cout<<"sumfitness: "<<sumfitness<<endl;
for(j=1;j<=popsize;j++)
{
//calculate new fitness ratio
if(x == 1)
initpop[j].ratio = sumfitness - initpop[j].fitness;
if(x == 2)
tempop[j].ratio = sumfitness - tempop[j].fitness;
}
//for(i=1;i<=popsize;i++)
// cout<<initpop[i].ratio<<endl;
//sum the ratio
sumratio1 = 0.0;
sumratio2 = 0.0;
for(j=1;j<=popsize;j++)
{
if(x == 1)
sumratio1 = sumratio1 + initpop[j].ratio;
if(x == 2)
sumratio2 = sumratio2 + tempop[j].ratio;
}
//cout<<"sumratio: "<<sumratio1<<endl;
//build wheel
int tmp = 0.0;
for(i=1;i<=popsize;i++)
{
if(x == 1)
{
tmp = tmp + initpop[i].ratio;
partition[i] = tmp;
}
if(x == 2)
{
tmp = tmp + tempop[i].ratio;
partition[i] = tmp;
}
}
//for(i=1;i<=popsize;i++)
// cout<<partition[i]<<endl;
//throw the dice
int dh = 0;
int dh2 = 0;
for(i=1;i<=2;i++)
{
if(x == 1)
{
sp:
ranum = random(sumratio1) + 1;
//cout<<"ranum: "<<ranum;
if(ranum==0)
goto sp;
//cout<<"\nranum: "<<ranum;
for(j=1;j<=popsize;j++)
{
if(dh == 0 && ranum <= partition[j])
{
dh = 1;
parent[i] = j;
goto aaa;
}
if(ranum > partition[j] && ranum <= partition[j+1])
parent[i] = j + 1;
//parent[] simpan index parent yg terpilih
aaa:
}
}
if(x == 2)
{
sp1:
ranum = random(sumratio2) + 1;
//cout<<"ranum: "<<ranum;
if(ranum==0)
goto sp1;
//cout<<"ranum: "<<ranum;
for(j=1;j<=popsize;j++)
{
if(dh2 == 0 && ranum <= partition[j])
{
dh2 = 1;
parent[i] = j;
goto aab;
}
if(ranum > partition[j] && ranum <= partition[j+1])
parent[i] = j + 1;
aab:
//parent[] simpan index parent yg terpilih
}
}
}
//cout<<"\nParent 1: "<<parent[1]<<" Parent 2: "<<parent[2];
}
//generate random population
void gen_rand_pop(int x)
{
for(i=1;i<=popsize;i++)
{
jom:
zero = 0;
//ada = 0;
initpop[i].sumpowgen = 0.0;
myran = 0;
ago:
myran = random(15000) + 1;
if(myran == 0 || myran < 1000)
goto ago;
dummy = myran;
//cout<<"\nmyran1:"<<myran<<endl;
dummy = dummy / 1000;
myran = myran / 1000;
//cout<<"dummy:"<<dummy<<endl;
//cout<<"myran1:"<<myran<<endl;
//getch();
do{
dummy = dummy - 1.0;
}while( dummy > 1);
if(dummy > 0.5)
myran = myran + 1;
//cout<<"dummy:"<<dummy<<endl;
//cout<<"myran1:"<<myran<<endl;
for(int a = 1;a<=4;a++)
initpop[i].chr[a] = 0;
int nomb = 4;
do{
initpop[i].chr[nomb] = myran % 2;
myran = myran / 2;
nomb--;
}while(myran != 0);
//for(int a = 1;a<=4;a++)
// cout<<initpop[i].chr[a];
//getche();
for(j=1;j<=4;j++)
{
//initpop[i].chr[j] = random(1);
if(j==1)
{
val1[i] = 0.0;
val2[i] = 0.0;
k = 0;
if(initpop[i].chr[j] == 0)
{
for(nomb=5;nomb<15;nomb++)
initpop[i].chr[nomb] = 0;
zero++;
//power1[i] = 0.0;
initpop[i].pow1 = 0.0;
}
else
{
for(nomb=5;nomb<15;nomb++)
{
initpop[i].chr[nomb] = random(2);
k++;
val1[i]=val1[i] + (initpop[i].chr[nomb] * (pow(2, (10 - k))));
val2[i]=val2[i] + pow(2,(10 - k));
}
//power1[i] = (((val1[i]/val2[i]) * 525) + 100);
//if(power1[i] >= 100 && power1[i] < 101)
// power1[i] = 0.0;
ada++;
initpop[i].pow1 = (((val1[i]/val2[i]) * 525) + 100);
if(initpop[i].pow1 == 100)
initpop[i].pow1 = 0.0;
}
}
if(j==2)
{
val1[i] = 0.0;
val2[i] = 0.0;
k = 0;
if(initpop[i].chr[j] == 0)
{
for(nomb=15;nomb<25;nomb++)
initpop[i].chr[nomb] = 0;
zero++;
//power2[i] = 0.0;
initpop[i].pow2 = 0.0;
}
else
{
for(nomb=15;nomb<25;nomb++)
{
initpop[i].chr[nomb] = random(2);
k++;
val1[i]=val1[i] + (initpop[i].chr[nomb] * (pow(2, (10 - k))));
val2[i]=val2[i] + pow(2,(10 - k));
}
//power2[i] = (((val1[i]/val2[i]) * 525) + 100);
//if(power2[i] >= 100 && power2[i] < 101)
// power2[i] = 0.0;
ada++;
initpop[i].pow2 = (((val1[i]/val2[i]) * 525) + 100);
if(initpop[i].pow2 == 100)
initpop[i].pow2 = 0.0;
}
}
if(j==3)
{
val1[i] = 0.0;
val2[i] = 0.0;
k = 0;
if(initpop[i].chr[j] == 0)
{
for(nomb=25;nomb<35;nomb++)
initpop[i].chr[nomb] = 0;
zero++;
//power3[i] = 0.0;
initpop[i].pow3 = 0.0;
}
else
{
for(nomb=25;nomb<35;nomb++)
{
initpop[i].chr[nomb] = random(2);
k++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -