Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
197 changes: 0 additions & 197 deletions Record Maintenance.c

This file was deleted.

Binary file removed commodity.dat
Binary file not shown.
76 changes: 76 additions & 0 deletions crossover.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#include "evolution.h"
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
void jobshop::select(double* _q)
{
_q[0] = r1*exp(r2*decode(genes[0]));
for(int i=1;i<ps;i++) _q[i] = _q[i-1] + r1*exp(r2*decode(genes[i]));
double sum = _q[ps-1];
for(int i=0;i<ps;i++) _q[i]/=sum;
}

void jobshop::crossover()
{
double q[ps+1],p1,p2;
int n1,n2,m1,m2,cnt=0;
int tgenes[15][15*15];
srand((unsigned)time(0));
bool book1[15*15],book2[15*15];
memcpy(tgenes,genes,sizeof(genes));

select(q);

while(cnt<ps)
{
p1=rand()/double(RAND_MAX);
p2=rand()/double(RAND_MAX);
for(int i=0;i<ps;i++)
{
if(n1==-1 && q[i]>p1) n1=i;
if(n2==-1 && q[i]>p2) n2=i;
if(n1!=-1 && n2!=-1) break;
}

do
{
m1=rand()%len;
m2=rand()%len;
}while(m1==m2);
if(m1>m2) {int t;t=m1;m1=m2;m2=t;}

memset(book1,false,sizeof(book1));
memset(book2,false,sizeof(book2));

for(int i=m1;i<=m2;i++)
{
genes[cnt][i]=tgenes[n1][i];
for(int j=0;j<len;j++)
if(tgenes[n2][j]==tgenes[n1][i]) book2[j]=true;
genes[cnt+1][i]=tgenes[n2][i];
for(int j=0;j<len;j++)
if(tgenes[n2][j]==tgenes[n1][i]) book2[j]=true;
}

int j1=0,j2=0;
for(int i=0;i<m1;i++)
{
while(book2[j2]) j2++;
genes[cnt][i]=tgenes[n2][j2];
while(book1[j1]) j1++;
genes[cnt+1][i]=tgenes[n1][j1];
}
for(int i=m2+1;i<len;i++)
{
while(book2[j2]) j2++;
genes[cnt][i]=tgenes[n2][j2];
while(book1[j1]) j1++;
genes[cnt+1][i]=tgenes[n1][j1];
}

lsort(genes[cnt]);
lsort(genes[cnt+1]);
cnt+=2;
}
}
29 changes: 29 additions & 0 deletions decode.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
//
// Created by liuren on 18-5-14.
//

#include "evolution.h"
#include <cstring>

inline int max(int a, int b){if(a>=b) return a;return b;}

int jobshop::decode(int *g)
{
int d[15],p[15];
memset(TT,0,sizeof(TT));
memset(d,0,sizeof(d)); //对应机器上的最大完成时间
memset(p,0,sizeof(p)); //对应工件上的最大完成时间

for(int j=0;j<len;j++)
{
int k=g[j];
TT[pc[k].m][k] = max(d[pc[k].m], p[pc[k].i]) + pc[k].t;
d[pc[k].m] = p[pc[k].i] = TT[pc[k].m][k];
}

int maxt=0;
for(int i=0;i<m;i++)
maxt = max(maxt,d[i]);
ans = max(ans, maxt);
return maxt;
}
41 changes: 41 additions & 0 deletions evolution.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//
// Created by liuren on 18-5-14.
//
#ifndef JSP_EVOLUTION_H
#define JSP_EVOLUTION_H
//交叉概率,变异概率,种群数量,适值函数的两个参数
const int cr = 0.9;
const int mr = 0.1;
const int ps = 20;
const double r1=1;
const double r2=-0.5;

struct process{
int m,t,i,j; //分别表示对应机器,所需时间,对应工件,在对应工件中的相对工序
};

class jobshop
{
private:
int n,m,len; //工件数,机器数,工序数
int ans; //最小完成时间
int TMJ[15][15*15],TT[15][15*15]; //解码矩阵
process pc[15*15]; //工序数组
int genes[51][15*15]; //基因组,下标从0开始
int theBestGene[15]; //最优基因
int startpro[15]; //每个工件开始的工序号

public:
jobshop(int,int); //构造函数
int decode(int *); //解码
void lsort(int *);
void input(); //输入
void init(); //初始化种群基因组
void select(double *); //
void crossover(); //交叉
void mutate(); //变异
void output(); //输出
void test(); //测试
};

#endif //JSP_EVOLUTION_H
32 changes: 32 additions & 0 deletions init.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// Created by liuren on 18-5-14.
//

#include "evolution.h"
#include <cstring>
#include <cstdlib>
#include <ctime>
void jobshop::init()
{
int *fa;
fa=(int *)malloc(len*sizeof(int));
for (int i = 0; i < len; ++i) {
fa[i]=i+1;
}
for(int k=0;k<ps;k++)
{
memcpy(genes[k],fa,len*sizeof(int));
int t=len;
srand(time(0));
while(t--) {
int i = rand() % len;
int j = rand() % len;
if (pc[genes[k][i]].i!=pc[genes[k][j]].i)
{
int tmp = genes[k][i];
genes[k][i] = genes[k][j];
genes[k][j]=tmp;
}
}
}
}
Loading