ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

自动排课思路

2019-06-21 08:48:57  阅读:303  来源: 互联网

标签:string int 排课 Length TSPDATA 自动 Lesson 思路 public


看了许多关于算法排课的文章,但是感觉都不是很友好。废话不多说,贴代码

1.首先创建一个数据

 1 public class TSPDATA
 2     {
 3 
 4         public static  int SPECIES_Num = 200; //种群数
 5         public static readonly int Develop_Num = 1000; //进化代数
 6         public static readonly float pcl = 0.7f, pch = 0.95f;//交叉概率
 7         public static readonly float pm = 0.4f; //变异概率
 8         public static readonly string[] Course= { "00150","00230","00340","00450","00560","00660","00760" };//课程集合
 9         public static readonly string[] Room= { "00150", "00230", "00340", "00450", "00560", "00660", "00760" }; //教室集合
10         public static  string[] Classm= {"001","002","003","004","005","006" }; //班级集合
11         public static readonly string[] Teacher= {"001","002","003","004" }; //教师集合
12         public static readonly string[] Time ={"11","12","13","14","21","22","31","41","43","51","52" }; //时间集合
13        public static readonly int LessonNum = Room.Length * Time.Length;
14     }
15 
16     public class Lesson:TSPDATA
17     {
18         public string course;
19         public string room;
20         public string classm;
21         public string time;
22         public string teacher;
23 
24         public string  Course { get => course; set => course = value; }
25         public string Room { get => room; set => room = value; }
26         public string Classm { get => @classm; set => classm = value; }
27         public string Time { get => time; set => time = value; }
28         public string Teacher { get => teacher; set => teacher = value; }
29 
30         
31     }

 简历基因序列,初始化种群

public class SpeciesIndividual
{
public string[,] genes;//基因序列
public int[] fitness;//适应度


public SpeciesIndividual()
{
//初始化
this.genes = new string[TSPDATA.SPECIES_Num, TSPDATA.LessonNum];
this.fitness = new int[TSPDATA.SPECIES_Num];

for (int i = 0; i < TSPDATA.SPECIES_Num; i++)
{

this.fitness[i] = 100;
}

}

//初始物种基因(随机)
public void CreateByRandomGenes()
{

int temp;
Random rand = new Random();
for (int i = 0; i < TSPDATA.SPECIES_Num; i++)
{
temp = 0;
for (int j = 0; j < TSPDATA.Time.Length; j++)
{
for (int k = 0; k < TSPDATA.Room.Length; k++)
{

Lesson lesson = new Lesson();

lesson.Classm = rand.Next(TSPDATA.Classm.Length);
lesson.Course = rand.Next(TSPDATA.Course.Length);
lesson.Room = k;
lesson.Teacher = rand.Next(TSPDATA.Teacher.Length);
lesson.Time = j;
genes[i, temp] = Lesson.Getstr(lesson);
temp++;
}

}
}
}

 

根据冲突得到适应度函数

public void CalFitness()
{

for (int j = 0; j < fitness.Length; j++)
{
fitness[j] = 100;
}

for(int i=0;i<TSPDATA.SPECIES_Num;i++)
{
for (int j = 0; j < TSPDATA.LessonNum-1;j++)
{

Lesson le = Lesson.GetLesson(genes[i, j]);
Lesson lec = Lesson.GetLesson(genes[i, j+ 1]);
if(le.Time.Equals(lec.Time)&&le.Course!=9)
{
if(le.Teacher.Equals(lec.Teacher)||le.Course.Equals(lec.Course)||le.Classm.Equals(lec.Classm))
{
fitness[i]--;

}
}

}
}

 

选择优秀物种(轮盘赌)
public void Select()
{
string[,] demogenes = new string[TSPDATA.SPECIES_Num, TSPDATA.LessonNum];//存储新的genes

int u = Convert.ToInt32(TSPDATA.SPECIES_Num * 0.7);
Random rand = new Random();
//最大适应度
int cal_temp = Convert.ToInt32(fitness[0]);
int cal_flag = 0;
double[] temp = new double[fitness.Length];
double sum = 0.0d;
for (int i = 0; i < fitness.Length; i++)
{
sum += fitness[i];
}
//由适应度计算概率
for (int j = 0; j < fitness.Length; j++)
{
//找到适应度最高
if (Convert.ToInt32(fitness[j]) > cal_temp)
{
cal_temp = Convert.ToInt32(fitness[j]);
cal_flag = j;
}
temp[j] = fitness[j] / sum;
}

 

交叉
public void Crossover()
{
Random rand = new Random();

for (int i = 0; i < TSPDATA.SPECIES_Num; i++)
{
float rate = (float)rand.NextDouble();
for (int j = 0; j < TSPDATA.LessonNum-1; j++)
{
if (rate > TSPDATA.pcl && rate < TSPDATA.pch)
{
//string str = genes[i+1, j];
Lesson le1 = Lesson.GetLesson(genes[i, j]);
Lesson le2 = Lesson.GetLesson(genes[i, j+1]);
if (le1.Time != -1 && le2.Time != -1)
{
int s, k, g;
s = le1.Teacher;
k = le1.Course;
g = le1.Classm;
le1.Teacher = le2.Teacher;
le1.Course = le2.Course;
le1.Classm = le2.Classm;
le2.Classm = g;
le2.Course = k;
le2.Teacher = s;
genes[i, j] = Lesson.Getstr(le1);
genes[i, j + 1] = Lesson.Getstr(le2);
}
}
}
}

}

变异
public void Mutate()
{
Random rand = new Random();
float rate = (float)rand.NextDouble();
for (int i = 0; i < TSPDATA.SPECIES_Num; i++)
{
for (int j = 0; j < TSPDATA.LessonNum - 1; j++)
{
if (rate < TSPDATA.pm)
{

Lesson l1 = Lesson.GetLesson(genes[i, j]);
l1.Teacher = rand.Next(TSPDATA.Teacher.Length);
l1.Course = rand.Next(TSPDATA.Course.Length);
l1.Classm = rand.Next(TSPDATA.Classm.Length);
genes[i, j] = Lesson.Getstr(l1);
}
}
}
}

 

最后赋值到新的种群,利用遗传算法排课,当然本人,有很多地方许要改进

标签:string,int,排课,Length,TSPDATA,自动,Lesson,思路,public
来源: https://www.cnblogs.com/lk2017/p/10107063.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有