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

📄 form1.cs

📁 遗传算法求解大学考试时间表问题
💻 CS
📖 第 1 页 / 共 2 页
字号:
							//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 + -