吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 830|回复: 16
收起左侧

[求助] Python算法思路求解

[复制链接]
夜雨微澜 发表于 2023-12-13 13:50
我们班级要重新排一下座位,40人,俩人一组为同桌,分成二十组。
现在有每人的姓名和成绩。老师要求,组与组之间,平均成绩需要尽可能差异小。即平均成绩最高的组的平均成绩减去平均成绩最低的组的平均成绩最低。
需要输出排座位的方案(谁和谁一组),多种方案(如有)均要输出。
我自认为会一点Python,自告奋勇报名了。但是回家坐到电脑前,发现毫无头绪。
求论坛里各路大神帮帮忙,看一下大致思路怎么样,不胜感激,不然我要丢死人了。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

T4DNA 发表于 2023-12-13 13:59
你的描述非常仔细,再加上你会一些python,完全可以使用gpt辅助,并不需要复杂算法,40个人而已,遍历所有可能也没多少时间
火之国 发表于 2023-12-13 14:02
以下是一个基本的思路:
  • 首先,将所有学生按照成绩从高到低进行排序。
  • 创建一个二维列表,用来存储学生座位的分配方案。每行代表一组,每列代表同桌的学生。
  • 从第一个学生开始遍历,按顺序将学生分配给每一组,直到所有学生都被分配完为止。你可以采用"逐行填充"的方式,即从第一组开始,依次往后分配。
  • 在分配学生的过程中,需要实时计算每个组的平均成绩,并记录最高和最低平均成绩以及对应的组。
  • 完成整个分配后,输出所有平均成绩差异最小的方案。
下面是一个示例的 Python 代码实现:


[Python] 纯文本查看 复制代码
import itertools

# 假设学生姓名和成绩按照相同的顺序存储在两个列表中,分别为names和scores
names = ['A', 'B', 'C', 'D', 'E', ...]  # 学生姓名列表
scores = [90, 85, 95, 80, 70, ...]  # 学生成绩列表

# 对学生按照成绩排序
sorted_students = sorted(zip(names, scores), key=lambda x: x[1], reverse=True)

# 组数和每组学生数
num_groups = 20
students_per_group = 2

# 存储最佳方案的相关信息
min_diff = float('inf')  # 初始化最小差异
best_arrangement = []  # 存储最佳座位方案的列表

# 生成所有可能的座位排列组合
all_combinations = itertools.combinations(sorted_students, students_per_group * num_groups)

# 遍历每个座位排列组合并计算平均分差异
for arrangement in all_combinations:
    groups = [arrangement[i:i + students_per_group] for i in range(0, len(arrangement), students_per_group)]
    group_avg_scores = [sum([student[1] for student in group]) / students_per_group for group in groups]
    diff = max(group_avg_scores) - min(group_avg_scores)
    
    # 如果当前差异小于最小差异,更新最小差异并记录最佳方案
    if diff < min_diff:
        min_diff = diff
        best_arrangement = groups

# 输出最佳方案
for i, group in enumerate(best_arrangement):
    print(f"Group {i + 1}:")
    for student in group:
        print(student[0], end=" ")
    print("\n")



这段代码会输出根据成绩平均差异最小的座位方案。请替换 names 和 scores 列表为实际的学生姓名和成绩列表。你还可以根据需要调整 num_groups 和 students_per_group 的值。需要注意的是,如果学生人数无法整除成组人数,可能会有一些学生无法被分到组中。你可以根据实际情况选择如何处理这些情况。
以上是本人使用AI生成,如有违规请删帖,不求给予最佳解决方案,只是帮着回复一下,版主勿怪!

免费评分

参与人数 3吾爱币 +3 热心值 +3 收起 理由
yiwai2012 + 1 + 1 热心回复!
1101170728 + 1 + 1 谢谢@Thanks!
夜雨微澜 + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| 夜雨微澜 发表于 2023-12-13 14:12
火之国 发表于 2023-12-13 14:02
以下是一个基本的思路:
  • 首先,将所有学生按照成绩从高到低进行排序。
  • 创建一个二维列表,用来存储 ...

  • 您的回答很有帮助,很感谢!
    1101170728 发表于 2023-12-13 14:21
    火之国 发表于 2023-12-13 14:02
    以下是一个基本的思路:
  • 首先,将所有学生按照成绩从高到低进行排序。
  • 创建一个二维列表,用来存储 ...

  • 最近在学习Python,学习了
    devilpanama 发表于 2023-12-13 14:32
    用数学思维来算的话,是不是把成绩最低和最高放一起,然后依次是第二和倒二…
    jyjjf 发表于 2023-12-13 14:39
    排座位不是还有身高,还有几乘几排列么?这个是假设案例?
    sakura32 发表于 2023-12-13 14:42
    把分组问题转换为顺序排列问题
    假设40人排列,固定第1和2为一组,34为一组,以此类推,那么只需要考虑排列即可(itertools.permutations)
    for-in遍历获取到的元组,计算每组的平均值,在汇总计算最大最小差值
    最后找到最小差值对应的排列组合

    免费评分

    参与人数 1吾爱币 +1 热心值 +1 收起 理由
    夜雨微澜 + 1 + 1 谢谢@Thanks!

    查看全部评分

    sakura32 发表于 2023-12-13 14:55
    sakura32 发表于 2023-12-13 14:42
    把分组问题转换为顺序排列问题
    假设40人排列,固定第1和2为一组,34为一组,以此类推,那么只需要考虑排列 ...

    这样排有815915283247897734345611269596115894272000000000种排列组合,结果基本上是分数第一和倒数第一排,第二和倒数第二排,以此类推
     楼主| 夜雨微澜 发表于 2023-12-13 15:07
    本帖最后由 夜雨微澜 于 2023-12-13 15:08 编辑
    jyjjf 发表于 2023-12-13 14:39
    排座位不是还有身高,还有几乘几排列么?这个是假设案例?

    初三了,比较看重成绩。成绩就是一切。
    老师搞了个什么排行榜,,,分组之后每组同桌对比进退步情况,有相应的奖励或者惩罚。
    大概是分好组后位置再决定吧
    您需要登录后才可以回帖 登录 | 注册[Register]

    本版积分规则

    返回列表

    RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

    GMT+8, 2024-11-24 18:56

    Powered by Discuz!

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表