BC中无法初始化绘图(DOS下的)
用BC++5。0编的DOS程序,我已经写了initgraph函数,但每次运行都显示
BGI Error Graphic not initialized.
为什么?
源代码如下
#define MAXCN 400 //最大群体规模
#define MAXVN 2 //最大变量数
#define PI 3.1415926
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
//#include "time.h"
#include "graphics.h"
//void far _BGIENTRY putpixel(int __x, int __y, int __color);
float Gauss(int i,int j)
{
return 0;
}
class Colony
{
private:
float Chromosome[MAXCN][MAXVN]; //染色体,第一维是群体规模,第二维是染色体值
int n; //群体规模
int vn; //变量数
float value[MAXCN]; //适应值
int p; //联赛选择规模
float pc; //杂交率
float pm; //变异率
float scope; //变量范围
public:
Colony( int n_v, int vn_v, int p_v,float pc_v,float pm_v,float scope_v);
//~Colony();
//void cal_val( float( *function)(int i) );
void choice();
void intercross(); //交叉
void variation(); //变异
//void f1();
void f2();
//void f3();
//void f4();
void f5();
void draw();
void setpc(float pc_v);
void setpm(float pm_v);
};
Colony::Colony(int n_v,int vn_v,int p_v,float pc_v,float pm_v,float scope_v)
{
int i,j;
float random; //0-1之间的随机数
n=n_v;
vn=vn_v;
p=p_v;
pc=pc_v;
pm=pm_v;
scope=scope_v;
//srand( (unsigned)time( NULL ) );
for (i=0;i<n;i++)
{
for(j=0;j<vn;j++)
{
//随机产生一个变量
random=rand()/(float)RAND_MAX;
Chromosome[i][j]=-scope+2*scope*random;
}
}
}
void Colony::setpc(float pc_v)
{
pc=pc_v;
}
void Colony::setpm(float pm_v)
{
pm=pm_v;
}
void Colony::choice()
{
int i,j;
float random; //0-1之间的随机数
int max; //适应值最高的染色体位置
int num;
float next_chromosome[MAXCN][MAXVN];
//srand( (unsigned)time( NULL ) );
for (i=0;i<n;i++)
{
max=0;
for (j=0;j<p;j++)
{
//随机选择一个染色体
random=rand()/(float)RAND_MAX;
num=(int)(random*n);
if (value[num]>value[max])
max=num;
}
for(j=0;j<vn;j++)
next_chromosome[i][j]=Chromosome[max][j];
}
for(i=0;i<n;i++)
for(j=0;j<vn;j++)
Chromosome[i][j]=next_chromosome[i][j];
}
void Colony::intercross()
{
int i,j;
float random;
int internum=0;
int locatex,locatey,interlocate;
float temp;
//srand( (unsigned)time( NULL ) );
for (i=0;i<n;i++)
{
//产生0-1之间的随机数
random=rand()/(float)RAND_MAX;
if (random<pc)
{
internum++;
if(internum==1)
locatex=i;
if(internum==2)
{
internum=0;
locatey=i;
random=rand()/(float)RAND_MAX;
interlocate=(int)(random*vn);
for(j=interlocate;j<vn;j++)
{
temp=Chromosome[locatex][j];
Chromosome[locatex][j]=Chromosome[locatey][j];
Chromosome[locatey][j]=temp;
}
}
}
}
}
void Colony::variation()
{
int i;
int vlocate;
float random;
float vvalue;
//srand( (unsigned)time( NULL ) );
for(i=0;i<n;i++)
{
random=rand()/(float)RAND_MAX;
if (random<pm)
{
random=rand()/(float)RAND_MAX;
vlocate=(int)(random*vn);
random=rand()/(float)RAND_MAX;
vvalue=-scope+2*scope*random;
Chromosome[i][vlocate]=vvalue;
}
}
}
void Colony::f2()
{
int i;
float val;
float x1,x2;
for (i=0;i<n;i++)
{
x1=Chromosome[i][0];
x2=Chromosome[i][1];
val=100*pow(x1*x1-x2,2)+pow(1-x1,2);
value[i]=val;
}
}
void Colony::f5()
{
int i;
float val;
float x,y;
for(i=0;i<n;i++)
{
x=Chromosome[i][0];
y=Chromosome[i][1];
val=4+x*x+y*y-8*cos(2*PI*x)-8*cos(2*PI*y);
value[i]=-val;
}
}
void Colony::draw()
{
int i;
float maxv=0;//最大适应值
float x,y;
int maxnum;//最大适应值的染色体位置;
for(i=0;i<n;i++)
{
if(value[i]>maxv)
{
maxv=value[i];
maxnum=i;
}
}
x=Chromosome[maxnum][0];
y=Chromosome[maxnum][1];
putpixel(x,y,WHITE);
}
void main(void)
{
int eranum=200;//指定代数
int gen;//当前代数
int cn=400;//群体规模
float pcv=0.6;//交叉率
float pmv=0.01;//变异率
int pv=100;//联赛规模
int gdriver,gmode;
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver,&gmode,"...\\bgi");
Colony *ex2=new Colony(cn,2,pv,pcv,pmv,2.048);
Colony *ex5=new Colony(cn,2,pv,pcv,pmv,1.00);
printf("只使用选择算子:\n");
printf("Fuction 2:\n");
for(gen=0;gen<eranum;gen++)
{
ex2->f2();
ex2->choice();
ex2->draw();
}
printf("按任意键继续:");
getch();
printf("Function 5:\n");
for(gen=0;gen<eranum;gen++)
{
ex5->f5();
ex5->choice();
ex5->draw();
}
printf("按任意键继续:");
getch();
printf("只使用交叉算子(pc=%f):\n",pcv);
printf("Fuction 2:\n");
for(gen=0;gen<eranum;gen++)
{
ex2->f2();
ex2->intercross();
ex2->draw();
}
printf("按任意键继续:");
getch();
printf("Function 5:\n");
for(gen=0;gen<eranum;gen++)
{
ex5->f5();
ex5->intercross();
ex5->draw();
}
printf("按任意键继续:");
getch();
printf("只使用变异算子(pm=%f)\n",pmv);
printf("Fuction 2:\n");
for(gen=0;gen<eranum;gen++)
{
ex2->f2();
ex2->variation();
ex2->draw();
}
printf("按任意键继续:");
getch();
printf("Function 5:\n");
for(gen=0;gen<eranum;gen++)
{
ex5->f5();
ex5->variation();
ex5->draw();
}
printf("按任意键继续:");
getch();
pcv=0.2;
ex2->setpc(pcv);
ex5->setpc(pcv);
printf("改变交叉算子(pc=%f)\n",pcv);
printf("Fuction 2:\n");
for(gen=0;gen<eranum;gen++)
{
ex2->f2();
ex2->intercross();
ex2->draw();
}
printf("按任意键继续:");
getch();
printf("Function 5:\n");
for(gen=0;gen<eranum;gen++)
{
ex5->f5();
ex5->intercross();
ex5->draw();
}
printf("按任意键继续:");
getch();
pmv=0.1;
ex2->setpm(pmv);
ex5->setpm(pmv);
printf("改变变异算子(pm=%f)\n",pmv);
printf("Fuction 2:\n");
for(gen=0;gen<eranum;gen++)
{
ex2->f2();
ex2->variation();
ex2->draw();
}
printf("按任意键继续:");
getch();
printf("Function 5:\n");
for(gen=0;gen<eranum;gen++)
{
ex5->f5();
ex5->variation();
ex5->draw();
}
printf("按任意键继续:");
getch();
}