📄 form1.cs
字号:
//e=1/Math.Pow(Math.E,200/(1+t));
if(e>rand.NextDouble())
{
sfitness=stfitness;
}
else
{
chroms[p,a1]=a3;
}
}
sn++;
}while(sn<param.sendn);
if(b.fitness>sb.fitness)
{
b.fitness=sb.fitness;
for(int i=0;i<param.coursenum ;++i)
b.chrom[i]=sb.chrom[i];
}
for(int i=0;i<param.coursenum ;++i)//写回遗传算法群
chroms[p,i]=sb.chrom[i];
fitness[p]=sb.fitness;
}
t*=param.sdownt;
if(((n+1)%10)==0)
{
avg=0.0;
for(int i=0;i<param.gpn;++i)
avg+=fitness[i];
avg/=param.gpn;
str+=n.ToString()+"@"+ avg.ToString()+"-->";
}
}
b.fitness=count.cfitness(ref param,b.chrom);
//view.showchrom(b.chrom);
MessageBox.Show(str,"avgfitness run");
if(param.check==true)
MessageBox.Show("success, no hard clash"+b.fitness.ToString(),"result");
else MessageBox.Show("fail,have hard clash"+b.fitness.ToString(),"result");
}
private void menu_timetabling_Click(object sender, System.EventArgs e)
{
switch(arith)
{
case enumarith.GA:
gatimetabling(ref b);
break;
case enumarith.SA:
satimetabling(ref b);
break;
case enumarith.HY:
hytimetabling(ref b);
break;
}
}
private void menuItem2_Click(object sender, System.EventArgs e)
{
this.Text="自动生成时间表系统---遗传算法";
arith=enumarith.GA;
}
private void menuItem4_Click(object sender, System.EventArgs e)
{
this.Text="自动生成时间表系统---混合遗传算法";
arith=enumarith.HY;
}
private void menuItem3_Click(object sender, System.EventArgs e)
{
this.Text="自动生成时间表系统---模拟退火算法";
arith=enumarith.SA;
}
private void menu_spacetabling_Click(object sender, System.EventArgs e)
{
if(param.check==false)
MessageBox.Show("There have clash,pls schedule the time","notice!");
else
{
exam [][]result=new exam[param.coursenum][];
for(int i=0;i<param.coursenum;++i)
result[i]=new exam[param.D[i,i]];
for(int i=0;i<param.coursenum;++i)
{
int a=i+1;
for(int j=0;j<param.D[i,i];++j)
{
result[i][j].course="考试科目"+a.ToString();
result[i][j].time="时间"+b.chrom[i].ToString();
result[i][j].banji="班级"+param.course[i,j+1].ToString();
}
}
for(int t=1;t<=param.TimeSolt;++t)
{
int e1;
e1=0;
for(;e1<param.coursenum;++e1)
if(b.chrom[e1]==t) break;
if(e1==param.coursenum) continue;
int e2;
e2=0;
for(int i=0;i<param.room[2];++i)
{
for(int j=0;j<4;++j)
{
result[e1][e2].room="C0"+i.ToString();
e2++;
if(e2==param.D[e1,e1])//如果这一考试科目已排满,则排下一在此时间考试的科目
{
e2=0;
for(++e1;e1<param.coursenum;++e1)
if(b.chrom[e1]==t) break;
}
if(e1==param.coursenum) break;
}
if(e1==param.coursenum) break;
}
if(e1==param.coursenum) continue;
for(int i=0;i<param.room[1];++i)
{
for(int j=0;j<2;++j)
{
result[e1][e2].room="B0"+i.ToString();
e2++;
if(e2==param.D[e1,e1])//如果这一考试科目已排满,则排下一在此时间考试的科目
{
e2=0;
for(++e1;e1<param.coursenum;++e1)
if(b.chrom[e1]==t) break;
}
if(e1==param.coursenum) break;
}
if(e1==param.coursenum) break;
}
if(e1==param.coursenum) continue;
for(int i=0;i<param.room[0];++i)
{
result[e1][e2].room="A0"+i.ToString();
e2++;
if(e2==param.D[e1,e1])//如果这一考试科目已排满,则排下一在此时间考试的科目
{
e2=0;
for(++e1;e1<param.coursenum;++e1)
if(b.chrom[e1]==t) break;
}
if(e1==param.coursenum) break;
}
}
FileStream strm;
try//保存编排结果
{
strm=new FileStream("result.txt",FileMode.OpenOrCreate,FileAccess.Write);
strm.SetLength(0);
StreamWriter sr=new StreamWriter (strm);
string str=param.coursenum.ToString();
sr.WriteLine(str);
for(int i=0;i<param.coursenum;++i)
{
sr.WriteLine(param.D[i,i]);
foreach(exam res in result[i])
{
str=res.time+"\r\n"+res.room+"\r\n"+res.banji+"\r\n"+res.course;
sr.WriteLine(str);
}
}
sr.WriteLine("end");
sr.Flush();
//MessageBox.Show("create about file have finished!","congradulation");
strm.Flush();
strm.Close();
}
catch(Exception ee)
{
MessageBox.Show(ee.Message,"erro");
MessageBox.Show("不能打开文件,请重新设置参数","erro");
}
}
}
private void menuItem6_Click(object sender, System.EventArgs e)
{
switch(arith)
{
case enumarith.GA:
gatimetabling(ref b);
break;
case enumarith.SA:
satimetabling(ref b);
break;
case enumarith.HY:
hytimetabling(ref b);
break;
}
}
}
public class view
{
public static void showchrom(int [] chrom)
{
string str="";
foreach(int t in chrom)
{
str+=t.ToString()+" ";
}
MessageBox.Show(str,"showchrom");
}
public static void showchrom(int [,]chroms, int j,int t)//j表示第几行,t表示有多少列;
{
string str="";
for(int i=0;i<t;i++)
{
str+=chroms[j,i].ToString()+" ";
}
MessageBox.Show(str,"showchrom");
}
public static void showfitness(float [] fitness)
{
string str="";
int i=1;
foreach(float t in fitness)
{
str+="//"+i.ToString()+":"+t.ToString()+" ";
++i;
}
MessageBox.Show(str,"showfitness");
}
public static void showavgfitness(float [] fitness)
{
string str="";
int i=1;
double avg=0.0;
foreach(float t in fitness)
{
avg+=t;
++i;
}
avg=avg/i;
str+="avgfitness="+avg.ToString();
MessageBox.Show(str,"show avgfitness");
}
}
public class count
{
public static float cfitness( ref PARAMETER param,int[] chroms)
{
float f1;
float f2;
float f4;
float f3;
float f;
int t;
f1=0;f2=0;f3=0;f4=0;
param.check=true;
for(int i=0;i<(param.coursenum-1);i++)//软约束1 任意学生不希望连续参加两门考试
{
for(int j=i+1;j<(param.coursenum);j++)
{
t=Math.Abs (chroms[i]-chroms[j]);
if((t<3)&&(t>0))//这里的3为参数,由每天考试的时间数决定
{
if(param.D[i,j]>0) f1+=(float)Math.Pow(2,t);//这里2为参数
}
}
}
for(int i=0;i<param.coursenum /3;i++)//软约束2 公共科目(参加人数较多的科目)编排在头几天,主要是为了评分的考虑
{
if(param.D[i,i]>param.cms)
if(chroms[i]>(param.TimeSolt/2)) f2+=1;//公共课没有排到前几个时间段;
}
for(int i=0;i<(param.coursenum-1);i++)//硬约束1 同一时间段同一学生不能参加两门以上不同的考试科目
{
for(int j=i+1;j<(param.coursenum-1);j++)
{
if(chroms[i]==chroms[j])
{
if(param.D[i,j]!=0)
{
f3+=param.D[i,j];
param.check=false;
}
}
}
}
for(int i=1;i<(param.TimeSolt+1);i++)//硬约束2. 同一时间段所有科目参加的人数和不能超过所有教室容量
{
t=0;
for(int j=0;j<(param.coursenum-1);j++)
{
if(i==chroms[j])
{
t+=param.D[j,j];
}
}
if(t>param.nroom)
{
f4+=t-param.nroom;
param.check=false;
}
}
f=f1+f2+500*f3+300*f4;
return f;
}
public static float cfitness( ref PARAMETER param,int[,] chroms,int p)
{
float f1;
float f2;
float f4;
float f3;
float f;
int t;
f1=0;f2=0;f3=0;f4=0;
param.check=true;
for(int i=0;i<(param.coursenum-1);i++)//软约束1 任意学生不希望连续参加两门考试
{
for(int j=i+1;j<(param.coursenum);j++)
{
t=Math.Abs (chroms[p,i]-chroms[p,j]);
if((t<3)&&(t>0))//这里的3为参数,由每天考试的时间数决定
{
if(param.D[i,j]>0) f1+=(float)Math.Pow(2,t);//这里2为参数
}
}
}
for(int i=0;i<param.coursenum /3;i++)//软约束2 公共科目(参加人数较多的科目)编排在头几天,主要是为了评分的考虑
{
if(param.D[i,i]>param.cms)
if(chroms[p,i]>(param.TimeSolt/2)) f2+=1;//公共课没有排到前几个时间段;
}
for(int i=0;i<(param.coursenum-1);i++)//硬约束1 同一时间段同一学生不能参加两门以上不同的考试科目
{
for(int j=i+1;j<(param.coursenum-1);j++)
{
if(chroms[p,i]==chroms[p,j])
{
if(param.D[i,j]!=0)
{
f3+=param.D[i,j];
param.check=false;
}
}
}
}
for(int i=1;i<(param.TimeSolt+1);i++)//硬约束2. 同一时间段所有科目参加的人数和不能超过所有教室容量
{
t=0;
for(int j=0;j<(param.coursenum-1);j++)
{
if(i==chroms[p,j])
{
t+=param.D[j,j];
}
}
if(t>param.nroom)
{
f4+=t-param.nroom;
param.check=false;
}
}
f=f1+f2+500*f3+300*f4;
return f;
}
public static int[,] crossover(float[] fitness,int[,] chroms,PARAMETER param,Random seed)
{
int [,] tchroms=new int [param.gpn,param.coursenum];//存放中间过渡染色体群
int[] t1=new int [param.coursenum];//存放中间过渡染色体
int [] t2=new int [param.coursenum];//存放中间过渡染色体
int t3;
int n;
float rpc;
Random rand=new Random(seed.Next());
for(int i=0;i<param.gpn;i+=2)
{
t1=select(fitness,chroms,param,seed.Next());
t2=select(fitness,chroms,param,seed.Next());
rpc=(float)rand.NextDouble();
if(rpc<=param.gpc)//开始交叉
{
n=rand.Next(param.coursenum)+1;
if(rand.Next(2)==1)
{
for(int j=n;j<param.coursenum;j++)
{
t3=t1[j];t1[j]=t2[j];t2[j]=t3;
}
}
else
{
for(int j=0;j<n;j++)
{
t3=t1[j];t1[j]=t2[j];t2[j]=t3;
}
}
}//交叉完成;
for(int j=0;j<param.coursenum;j++)//写入临时染色体
{
tchroms[i,j]=t1[j];
tchroms[i+1,j]=t2[j];
}
}
return tchroms;
}
private static int[] select(float []fitness,int[,] chroms,PARAMETER param,int seed)
{
/// <summary>
///锦标赛选择法,随机从群里选择三个染色体,适应度高的生存
/// </summary>
int []t=new int [param.coursenum];
int n;
int m;
Random rand=new Random(seed);
n=rand.Next()%(param.gpn);
for(int i=1;i<2;i++)//锦标赛选择,从3个里选择最大,地一个在循环外选择;
{
m=rand.Next()%(param.gpn);
if(fitness[n]>fitness[m]) n=m;
}
for(int i=0;i<param.coursenum;i++) t[i]=chroms[n,i];
return t;
}
public static int[,] mutation(int [,] chroms,PARAMETER param,Random seed)
{
Random rand =new Random(seed.Next());
int t;
for(int i=0;i<param.gpn;i++)
{
if(rand.NextDouble()>(double)param.gpm) break;
t=rand.Next()%param.coursenum;
chroms[i,t]=rand.Next(param.TimeSolt)+1;
}
return chroms;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -