2401_84607680 2024-05-20 01:48 采纳率: 0%
浏览 19
已结题

要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果

img

img

img

现在学校需要从st1,st2, ……, st14的14名同学中,选出10名同学到西和、礼县、武都和容昌的十所小学参加教育实习,每所学校需要一人。由于实习学校的需求和条件不同,学生的专业背景
不同等因素,实习学校能够为学生每周提供的生活补贴和课时安排也不尽相同,见附件1和附件
2。参加选拔的实习学生对实习也有不同的要求:
1、st1和st2两名同学不能同时参加实习;
2、st3和st4两名同学要么同时参加,要么同时不参加;
3、st5同学不去西和县;
4、st6同学要去就只去武都。
如何选择实习学校,才能使学生每个学生的课时尽可能均衡?
要完整版的 数学建模代码python能允许出结果 做出这个代码结果 有偿

  • 写回答

24条回答 默认 最新

  • 关注
    获得0.60元问题酬金

    上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    问题分析:

    这是一个选人问题,要求选择10名同学参加教育实习,每所学校需要一人,但是每个学生的教育实习条件不同。因为实习学校的需求和条件不同,学生的专业背景、每周提供的生活补贴和课时安排也各不相同,所以需要建立数学模型来解决以下问题:

    1.如何选择实习学校,才能使学生的总生活补贴最多?

    2.如何选择实习学校,才能使学生每个学生的课时尽可能均衡?

    3.从学生的角度讲,总希望能到课时少、生活补贴高的学校去实习,试给出这样的一种选择方案。

    解决方案:

    1. 总生活补贴最多方法:

    通过对附件1和附件2的观察,我们可以得出一个规律:学生的选择顺序最好和实习学校的补贴排名相反,也就是说,学生选择的第一所实习学校应该是补贴排名最后一名的学校,第二所实习学校是补贴排名倒数第二名的学校,以此类推。这样,每个学生都有可能得到更高的生活补贴。

    1. 学生课时尽可能均衡方法:

    我们可以通过贪心算法来达到学生课时尽可能均衡的目标。

    具体实现方法如下:

    (1)将学生按照希望实习的先后顺序进行排列。

    (2)对于每个学生,从优先级最高的实习学校开始,如果该学校的课时安排量还未满,则将该学生分配到该学校,并将该学校的课时数+1。

    (3)如果所有学校的课时都已满,则将该学生分配到课时数最少的学校,并将该学校的课时数+1。

    (4)重复(2)和(3),直到所有学生都被分配到实习学校为止。

    1. 选择方案:

    为了实现学生希望去到课时少、生活补贴高的学校去实习,我们可以采用以下方法:

    (1)首先按照第1点的方法,让学生逐一选择补贴排名倒数的实习学校。

    (2)对于被分配到同一所实习学校的学生,根据他们的课时安排量进行调整。如果两个学生的课时安排量相差较大,那么尝试将他们分配到不同的实习学校。

    (3)如果不能完全满足学生的要求,那么尝试让他们的课时安排量相差尽可能小。同时,尽量让他们去到生活补贴高、课时少的学校。

    代码实现:(用Python实现)

    -- coding:utf-8 --

    import copy

    stu_num = 14 # 学生数量,14 school_num = 10 # 学校数量,10

    读取每个学生教育实习要求和每所学校的生活补贴和课时安排

    with open('data.txt', 'r') as f: data = f.readlines()

    stu_req = [] # 存放每个学生的实习要求 for i in range(stu_num): req = [int(x) for x in data[i].strip().split()] stu_req.append(req)

    school_subsidy = [] # 存放每所学校的生活补贴 for i in range(stu_num, stu_num + school_num): subsidy = [int(x) for x in data[i].strip().split()] school_subsidy.append(subsidy)

    school_hours = [] # 存放每所学校的课时安排 for i in range(stu_num + school_num, stu_num + school_num * 2): hours = [int(x) for x in data[i].strip().split()] school_hours.append(hours)

    实现第1点的方法,得到每个学生的实习分配

    def assign_school_by_subsidy(stu_req, school_subsidy): stu_assign = [0] * stu_num # 存放每个学生被分配的学校编号

    # 按照学生要求的先后顺序逐一分配学校
    for i in range(stu_num):
        min_subsidy = min(school_subsidy)
        idx = school_subsidy.index(min_subsidy)
        while stu_req[i][idx] == 0:  # 如果学生不能选择该学校,那么选择次低的学校
            school_subsidy[idx] = float('inf')
            min_subsidy = min(school_subsidy)
            idx = school_subsidy.index(min_subsidy)
        stu_assign[i] = idx
        school_subsidy[idx] = float('inf')
    return stu_assign
    

    实现第2点的方法,得到每个学生的课时安排

    def assign_hours(stu_assign, school_hours): school_hours = copy.deepcopy(school_hours) stu_hours = [0] * stu_num

    # 对每个学生,将其分配到课时量最少的学校
    for i in range(stu_num):
        idx = stu_assign[i]
        min_hours = min(school_hours[idx])
        while stu_req[i][idx] == 0 or stu_hours[i] + min_hours > 17:  # 如果学生不能选择该学校,那么选择课时量次低的学校
            school_hours[idx][school_hours[idx].index(min_hours)] = float('inf')
            min_hours = min(school_hours[idx])
            if stu_hours[i] + min_hours <= 17:
                break
        stu_hours[i] += min_hours
        school_hours[idx][school_hours[idx].index(min_hours)] += 1
    return stu_hours
    

    实现第3点的方法,得到每个学生的最终分配

    def assign_school_by_balance(stu_req, school_subsidy, school_hours): # 首先按照第1点的方法,让学生逐一选择补贴排名最后的实习学校 stu_assign = assign_school_by_subsidy(stu_req, school_subsidy)

    # 然后,根据实习学校的课时数量,对学生进行重新分配
    stu_hours = assign_hours(stu_assign, school_hours)
    
    # 如果两个学生的课时差距较大,那么尝试将他们分配到不同的实习学校
    for i in range(stu_num):
        if stu_hours.count(stu_hours[i]) > 1:
            for j in range(i + 1, stu_num):
                if stu_hours[i] == stu_hours[j] and stu_assign[i] == stu_assign[j]:
                    # 找到一所课时较少的实习学校
                    min_hours = min(school_hours[stu_assign[i]])
                    min_idx = school_hours[stu_assign[i]].index(min_hours)
                    # 如果学生不能选择该学校,那么选择课时量次低的学校
                    while stu_req[i][min_idx] == 0 or stu_req[j][min_idx] == 0 or stu_hours[i] + min_hours > 17 or stu_hours[j] + min_hours > 17:
                        school_hours[stu_assign[i]][min_idx] = float('inf')
                        min_hours = min(school_hours[stu_assign[i]])
                        min_idx = school_hours[stu_assign[i]].index(min_hours)
                    # 将学生i分配到该学校
                    stu_hours[i] += min_hours
                    stu_assign[i] = stu_assign[j] = school_hours[stu_assign[i]].index(min_hours)
                    school_hours[stu_assign[i]][min_idx] += 1
    return stu_assign
    

    最终结果

    stu_assign_balance = assign_school_by_balance(stu_req, school_subsidy, school_hours) stu_hours_balance = assign_hours(stu_assign_balance, school_hours)

    print('学生最终分配情况:', stu_assign_balance) print('学生最终课时安排:', stu_hours_balance)

    评论

报告相同问题?

问题事件

  • 系统已结题 5月28日
  • 创建了问题 5月20日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵