2 u013599381 u013599381 于 2014.12.15 17:41 提问

有关VC++运行SGA程序出错,自动关闭程序的问题。

大家好,在用VC++(绿色版)运行SGA程序的时候,显示出现了“一个不能解决的问题”,即关闭。请大家帮帮忙,让程序能顺利运行~第一次进论坛,谢谢大家啦!

程序如下:(主要是后面的适应度函数)
(目标是对工序排列,使工人总的工资成本最低。每道工序时间不同,工人工资也不同)

#include
#include
#include
#include
#include

#define N 5

#define M 2 //5个工序,2个工人
#define POPSIZE 500

int u[N]={1,2,1,2,1}; //不同工序持续时间
int c[M]={2,5}; //工人每小时工作成本
int T[M]={3,2}; //每个工人参与工序的总次数
int J[M][N]; //记录工人在某个工序参加与否
int a[M][N]={{1,2,3},{3,4,5}}; //每个工人参加的工序集

int popsize ; //种群大小
int maxgeneration; //最大世代数
double pcross = 0.0; //交叉率
double pmutation = 0.0; //变异率
double sumfitness; //种群个体适应值累计

struct individual //定义染色体个体结构体
{
int chrom[N]; //定义染色体二进制表达形式
double fitness; //染色体的适应值
};

int generation; //当前执行的世代数
int best_index; //本世代最好的染色体索引序号

struct individual bestindividual; //最佳染色体个体
struct individual currentbest; //当前最好的染色体个体 currentbest
int bestgeneration; //当前最好染色体个体产生的代数
struct individual oldpop[POPSIZE];//种群数组
struct individual newpop[POPSIZE];//新种群数组

/* 随机数发生器使用的静态变量 */
static double oldrand[55];
static int jrand;
static double rndx2;
static int rndcalcflag;

//函数声明
void printline(FILE *);

void initialoldpop(FILE *ffp); //初始化当代种群

void generatenextpop(FILE *ffp); //产生下一代种群
void evaluateoldpop(); //评价种群
void calculateobjectfitness(); //计算种群适应度
void findbestindividual(); //寻找最好的染色体个体

int select(); //选择操作
//将p中移除掉q中位置在j1,j2之间的元素,其余元素前移,返回剩下元素的数量
int searchanddelete(int p,int q,int j1,int j2);
void crossover(int *,int *,int *,int *,FILE *ffp); //交叉操作
void mutation(int *); //变异操作
void input(); //输入接口
void outputtextreport(FILE *ffp); //每代输出文字报告
void report(FILE *ffp); //输出最终结果报告

//以下为一些随机数相关函数
void advance_random();
int flip(double);int rnd(int, int);
void randomize();
double randomnormaldeviate();
float randomperc();float rndreal(float,float);
void warmup_random(float);

void main() //主函数 (函数主体开始)
{

int i; 

FILE *fp;          //指针文件

                    //打开文本文件
if((fp= fopen("Result.txt","w+"))==NULL)
{
    printf("Can not open file!\n");
}
fprintf(fp,"本程序为使用基本SGA求解\n");  
generation=0;                   //初始化generation当前执行的代
input();                        //初始化种群大小、交叉率、变异率


randomize();           // 初始化随机数发生器
initialoldpop(fp);    //产生初始化种群
evaluateoldpop(); 
while(generation<maxgeneration) //小于最大世代数,执行循环体
{
    generation++;                   
    generatenextpop(fp);        //生成子代种群(A.选择; B.交叉; C.变异)
    for(i = 0 ; i < popsize ; i++)
    {
        oldpop[i]=newpop[i];     
    }
    evaluateoldpop();            //评价新生子代种群
    outputtextreport(fp);              //输出当前子代种群统计报告
}

report(fp);//输出最终报告
fclose(fp);                       //关闭fp指向的文件句柄,防止句柄泄露

printf("计算结果已输出到Result.txt文件中。");
getch();

}

void printline(FILE ffp)
{
fprintf(ffp,"\n
************************************************************\n");
}

void initialoldpop(FILE *ffp) //种群初始化,对种群中每条染色体,生成1-5的不重复序列
{

int i,j,p,q,r;
int l=0;
int a[N];
srand(   (unsigned)time(   NULL   )   );
for (i=0;i<popsize; i++)
{ 
    for(j=0;j<N;j++)
        a[j]=j;         //对oldpop[i]染色体生成随机序列                             
    p=N;  
    q=0;
    while(p> 0)   
    {   
        r=rand();                         
        r%=p;                            
        oldpop[i].chrom[l]=a[r]; 
        a[r]=a[p-1];     //  把后一个拷贝到刚生成的位置               
        q++;
        p--;
    }     
}   

}

void generatenextpop(FILE *ffp) //生成下一代
{
int mate1,mate2,j=0;
do{
//挑选交叉配对
mate1=select();
mate2=select();
crossover(oldpop[mate1].chrom,oldpop[mate2].chrom,newpop[j].chrom,newpop[j+1].chrom,ffp);
mutation(newpop[j].chrom);
mutation(newpop[j+1].chrom);
j=j+2;

}
while(j<(popsize-1));
}

void evaluateoldpop() //评价种群
{
calculateobjectfitness(); //计算种群个体的适应度
findbestindividual(); //找到最好和最差的染色体个体
}

void calculateobjectfitness() //计算染色体个体适应值
{

int i,j,k,l,r,x;
int p=0;
int temp=0;
int X[M];

for(i=0;i<popsize;i++)
{
oldpop[i].fitness=0.0;
for(l=0;l<N;l++)
{
r=oldpop[i].chrom[l];
temp=u[r];
u[r]=u[l];
u[l]=temp;
}
for(j=0;j<M;j++)
{
for(k=0;k<N;k++)
for(l=0;l<N;l++)
{
if(a[j][k]==oldpop[i].chrom[l])
J[j][l]=1;
else
J[j][l]=0; //记录各个工人在随机情景序列中的参与位置
}

    while(J[j][p]!=1)
    {
        p++;
    }
     x=1;
     X[j]=u[p];
     while(x<T[j])
     {
         p++;
         X[j]+=u[p];
         if(J[j][p]==1)
         x++;
     }
  }
  for(j=0;j<M;j++)
      oldpop[i].fitness+=X[j]*c[j];

}
}

void findbestindividual( ) //求最佳个体
{
int i;
sumfitness=0.0;
bestindividual=oldpop[0];
best_index=0;
sumfitness+=oldpop[0].fitness;
currentbest.fitness=oldpop[0].fitness;

for(generation=0;generation<maxgeneration;generation++)
 for (i=1;i<popsize; i++)
{
    if (oldpop[i].fitness<bestindividual.fitness)       //依次比较,找出最佳个体       
    {   bestindividual=oldpop[i];                       //(选适应值最小的)
        best_index=i;
    }

    sumfitness+=oldpop[i].fitness;                              // 存放种群总体适应值
}

if(bestindividual.fitness<currentbest.fitness)//第n代最好的,通过比较小于以往最好个体的话,暂时存放在currentbest
{ 
    currentbest=bestindividual;
    bestgeneration=generation;
}

}

谢谢大家~

1个回答

devmiao
devmiao   Ds   Rxr 2014.12.15 18:20

这个“绿色版”就不好说了,张三李四谁都可以精简几个文件做一个“绿色版”,天知道你的绿色版是哪里来的,精简和修改了什么。

建议使用原版。http://msdn.itellyou.cn上有

u013599381
u013599381 谢谢~成功安装了VS,但运行时还是出了问题,主要还是适应度函数那儿。能麻烦下,有空帮我看下程序好么,谢谢啊~
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!