排课表代码--初步模型

2024-04-19 14:32
文章标签 代码 模型 初步 课表

本文主要是介绍排课表代码--初步模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

初步模型,并没有实现换教练的。

import copy 
class student():def __init__(self,studentID,isAgent,leftNumsOfCourse,coach2id,coach3id):self.studentID = studentIDself.isAgent = isAgentself.leftNumsOfCourse = leftNumsOfCourseself.coach2id = coach2idself.coach3id = coach3iddef minusLeftNumsOfCourse(self,num):self.leftNumsOfCourse = self.leftNumsOfCourse - numdef addLeftNumsOfCourse(self,num):self.leftNumsOfCourse = self.leftNumsOfCourse + num
#测试建立学生
student1 = student('u201010187',0,23,'c232','c432')
#print(student1.leftNumsOfCourse)
student1.minusLeftNumsOfCourse(3)
#print(student1.leftNumsOfCourse)class coach():def __init__(self,coachid,teamID,coursesid,askForWeek):self.coachid = coachidself.teamID = teamIDself.coursesid = coursesid    #listself.askForWeek = askForWeek   #listdef isAbleToWork(self,day):self.askForWeek.append(day)coach1 = coach('c2232','e33',[2,0,3],[])
#print(coach1.coursesid,coach1.askForWeek)
coach1.isAbleToWork('friday')
#print(coach1.askForWeek)class schedule():def __init__(self,totalSchedule=[],query={}):#   self.coachid = coachidself.totalSchedule = totalScheduleself.query =query   #表索引字典def createBlankSchedule(self,numsOfCourseOneDay=17):  #创建一个新空的一个周期的空表daySchedule = [0 for i in range(numsOfCourseOneDay)]       weekSchedule = [copy.deepcopy(daySchedule) for i in range(7)]return weekScheduledef addCoachSchedule(self,coach,coachSchedule):#添加一个教练表到总教练表中# print(type(coach),coach.coachid)coachSchedule = copy.deepcopy(coachSchedule)numOfCoach = len(self.totalSchedule)self.query['%s'%coach.coachid] = numOfCoach #建立索引self.totalSchedule.append(coachSchedule)def scrapeSchedule(self,son_scheduleIndex=[]):#son_scheduleIndex = ['张三','李四','王五']#则返回的是张三李四王五教练的课表res = []newQuery ={}for coachID in son_scheduleIndex:index = self.query[coachID]numOfCoach = len(newQuery)newQuery[coachID] = numOfCoachres.append(self.totalSchedule[index])return res,newQuerydef isCoachScheduleFull(self,coachname):coachindex = self.query(coachname)coachSchedule = self.totalSchedule[coachindex] #得到这个表for i in range(7):for j in range(17):if coachSchedule[i][j] ==0:return Falsereturn Truedef searchContinuousNumsOfCourse(self,coachname,day):coachindex = self.query(coachname)coachSchedule = self.totalSchedule[coachindex]dayslice = coachSchedule[day]res = []for i in range(17):if dayslice[i]==0:res.append(i)return res  #输出的是[1,2,4,5,6,10,11,12,13,14...]def getScheduleOfCoach(self,coachname): #coachname就是coachidcoachindex = self.query[coachname]coachSchedule = self.totalSchedule[coachindex] #得到这个表return coachScheduledef changeScheduleOfCourse(self,coachname,day,newslice):coachindex = self.query[coachname]print('要改变的coach在教练表中的索引是:',coachindex)# print('教练的某一天的表:',self.totalSchedule[coachindex][day])self.totalSchedule[coachindex][day] = newslice# print(self.totalSchedule)'''每个学员每天的上课数有下限,比如2,每个学员每个上课有上限,比如5'''
def canSatisfyRequirement12(dayslice):count = 0for i in range(17):if i ==0:count =1continueif dayslice[i] ==dayslice[i-1]:count += 1elif count <2:return Falseelif count >5:return Falseelse:count = 1return True'''外地学员的开始和结束课节有限制,我们令限制为Beginninglimit,Endinglimit'''
def canSatisfyRequirement34(dayslice,student,Beginninglimit,Endinglimit):for i in range(Beginninglimit):if dayslice[i] == student.studentID:return Falsefor j in range(Endinglimit,17):if dayslice[j] == student.studentID:return Falsereturn True#schedule1 = schedule()#print(schedule1.createBlankSchedule(17))#def fitcoaches(student,totalschedule):#   coachID = student.coach2id#  '''得到这个教练的教练组,这个教练组的所有教练,是一个list# '''#teamCoach = ['张三','李四','王五']#scrapeSchedule = totalschedule.scrapeSchedule(teamCoach)# return student,scrapeSchedule
'''模拟排课的,输出是模拟排出的课,满足条件才会输出1,第一步判断是不是拆玩后学生的课表满足,要判断是不是超出了学生的接受范围2,检查填进去的slice是不是满足要求,逐个检测,报错就不行的,如果可以的话,就要写进入表了2.x检查临时表是不是时间段冲突,这需要定义一个函数
'''
def choice(student,schedule,coachname,day,studentArrangedSchedule):numsOfCourse = [5,4,3,2]slice1 = schedule.getScheduleOfCoach(coachname)[day]# print('+++no.1+++')# print('进入循环',slice1)preparedslice =[]for num in numsOfCourse:#   print('++++++no.%s+++++++'%num)#  print(slice1)if  num>student.leftNumsOfCourse:           continue  #循环进入下一个student.minusLeftNumsOfCourse(num) #修改进行判断if not isSuitableToStudent(student):student.addLeftNumsOfCourse(num)continuestudent.addLeftNumsOfCourse(num)  #修改回来#2的检测preparedslice = fullslice(slice1,num,student)if not canSatisfyRequirement12(preparedslice):#   print(slice1)print('没有满足条件12......')continueif student.isAgent ==1:            if not canSatisfyRequirement34(preparedslice,student,1,1):print('没有满足条件34.......')continueif isRepeat(studentArrangedSchedule,day,preparedslice):print('没有满足条件,跟已知学生课程时间冲突')continue#如果上面的条件都满足,就把这个数据写到schedule中,也就是原始表中改变slice1#学生的信息也改变,比如课时数'''这里还缺少一个维护学生上课是不是重复的表,考虑到学生是一个个进去选课的,所以这个可以用一个@@@@临时表@@@@维护,当学生选择上某课了,那么这个临时表就得更新'''schedule.changeScheduleOfCourse(coachname,day,preparedslice)student.minusLeftNumsOfCourse(num)print('更新前的表是:',studentArrangedSchedule)updateSchedule(studentArrangedSchedule,day,preparedslice)print('更新后的表是:',studentArrangedSchedule)return Truebreak#  print("this slice is suitable")# print(preparedslice)return False    '''填完课表后,学生的剩余课时数不能为1'''
def isSuitableToStudent(student):if student.leftNumsOfCourse ==1:return Falseelse:return True'''个人的课程是不是重复
schedule1----个人的历史课表
slice1----要检测的某天课程
'''
numsOfCourseOneDay =17
daySchedule = [0 for i in range(numsOfCourseOneDay)]
weekSchedule = [copy.deepcopy(daySchedule) for i in range(7)]
studentSchedule1 = weekSchedule
def isRepeat(studentSchedule1,day,slice1):for i in range(len(slice1)):  #追个检查是不是有重复安排的if (slice1[i] != 0 and studentSchedule1[day][i] !=0):return Truereturn False
def updateSchedule(studentSchedule1,day,slice1):for i in range(len(slice1)):if slice1[i] !=0:studentSchedule1[day][i] = 1
'''
排列出一些位置选择
1,以学员角度,还是以课程为角度。
。。。。以课程的话,选择2,3,5优先选择多的,也就是5的,先检测5,然后检测3,再检测2
。。。。函数f(参数1,参数2,参数3)参数1,slice参数2,填的课,把0填成2或3或5参数3,学生对象
。。。。返回的是排好的slice1,或者返回0,表示本身课不行的
'''
def fullslice(slice1,numOfCourse,student):slice2 = copy.deepcopy(slice1)for i in range(17):if slice2[i]==0:slice2[i]=student.studentIDnumOfCourse = numOfCourse-1if numOfCourse ==0:breakif numOfCourse ==0:return slice2else:return 0schedule1 = schedule()
#print(schedule1.totalSchedule)
newtable = schedule1.createBlankSchedule(17)
coach1 = coach('c102','i234',1,[])
#print(coach1.teamID)
schedule1.addCoachSchedule(coach1,newtable)
#print(schedule1.totalSchedule)
coach2 = coach('c101','i234',1,[])
newtable = schedule1.createBlankSchedule(17)
schedule1.addCoachSchedule(coach2,newtable)
schedule1.changeScheduleOfCourse('c102',2,[2,2,1,1,0,0,1,1,1,0,0,0,5,5,0,0,0])
c = schedule1.totalSchedule
print('原始表:',schedule1.totalSchedule)
#print(schedule1.totalSchedule)
#print(schedule1.query)
#创建几个学生 studentID,isAgent,leftNumsOfCourse,coach2id,coach3id
student1 = student('s001',0,15,'c102','c232')
student2 = student('s002',0,3,'c102','c232')
for i in range(7):print('教练的第%s天'%i)    choice(student1,schedule1,'c102',i,studentSchedule1)print('学生剩余课数:',student1.leftNumsOfCourse)if student1.leftNumsOfCourse <2:break
print('后来表:',schedule1.totalSchedule)

这篇关于排课表代码--初步模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/917807

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU