⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucom_rw.cpp

📁 遗传算法解决机组组合问题的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#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 + -