Skip to content

分班代码

php
<?php

// 假设每个学生的成绩都在下面数组中
$scores = [70, 80, 90, 73, 82, 89, 75, 93, 85, 78, 97, 81, 83, 76, 91, 94, 84, 79, 74, 77, 71, 95, 88, 86, 72, 87, 92, 96, 69, 98, 77, 65, 67, 63, 69, 73, 71, 75, 89, 87, 79, 68, 79, 79, 74, 68, 90, 80, 68, 78, 93, 75, 65, 79, 83, 79, 74, 85, 75, 93, 80, 89, 90];

// 把分数从高到低排序
rsort($scores);

// 假设学生的性别都在下面数组中
$genders = [1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1];


// 计算学生人数
$studentCount = count($scores);

// 计算班级个数
$classCount = ceil(sqrt($studentCount / 2));

// 将学生分班
$classes = [];
for ($i = 0; $i < $classCount; $i++) {
    $classes[] = [];
}

// 将学生分配到班级,保证性别比例
foreach ($scores as $key => $score) {
    if ($genders[$key] == 1) {// 性别为男
        $classes[$key % $classCount][] = $score;
    } else {// 性别为女
        $classes[($key + 1) % $classCount][] = $score;
    }
}

// 计算各班级的平均分
$avgs = [];
foreach ($classes as $class) {
    $avgs[] = array_sum($class) / count($class);
}

// 计算多个班级平均分之间的最大差值
$diff = 0;
for ($i = 0; $i < $classCount - 1; $i++) {
    for ($j = $i + 1; $j < $classCount; $j++) {
        $diff = max($diff, abs($avgs[$i] - $avgs[$j]));
    }
}
//echo "多个班级的平均分之间的最大差值为:" . $diff;

//foreach ($classes as $class) {
//    var_dump(count($class));
//}

var_dump(count($classes));

可试用的步骤

  1. 首先,计算每个学生的总成绩和每个科目的成绩。通过计算,可以得出每个学生的成绩,总体的每科成绩平均分,总体的男女比例,以及每个班级的平均分和男女比例。

  2. 接下来,根据每个学生的总成绩,使用加权平均法分配学生到不同的班级。具体来说,把总成绩作为权重,把学生的总成绩除以总体的平均分,就可以得出每个学生的权重。

  3. 接下来,对所有学生的每科成绩加权,以保证每科的平均分和总体的平均分接近。

  4. 最后,根据每个班级的男女比例,以及总体的男女比例,重新调整学生的分班结果,以确保每个班级的男女比例和总体的男女比例相近。

AI 给出的示例代码

php
<?php

// 假设每个学生的成绩都在下面数组中
$scores = [70, 80, 90, 73, 82, 89, 75, 93, 85, 78, 97, 81, 83, 76, 91, 94, 84, 79, 74, 77, 71, 95, 88, 86, 72, 87, 92, 96, 69, 98, 77, 65, 67, 63, 69, 73, 71, 75, 89, 87, 79, 68, 79, 79, 74, 68, 90, 80, 68, 78, 93, 75, 65, 79, 83, 79, 74, 85, 75, 93, 80, 89, 90];

// 把分数从高到低排序
rsort($scores);

// 假设学生的性别都在下面数组中
$genders = [1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1];

//计算每个学生的总成绩
$totalScores = [];
foreach($students as $student){
    $totalScore = 0;
    foreach($scores as $score){
        $totalScore += $score;
    }
    $totalScore /= count($scores);
    $totalScores[$student] = $totalScore;
}

//使用加权平均法分配学生到不同的班级
$classNum = count($classes);
$maxScore = max($totalScores);
$scores = [];

foreach($totalScores as $student => $score){
    $avgScore = $score / $maxScore;
    $score = $avgScore * $classNum;
    $scores[$student] = $score;
}

//分配每一个学生到一个班级
$classes = [];
foreach($scores as $student => $score){
    for($i = 0; $i < $classNum; $i++){
        if($score >= $i && $score < ($i + 1)){
            $classes[$student] = $i;
        }
     }
}

//加权分配每科成绩
$scores = [];
foreach($students as $student){
    $totalScore = 0;
    foreach($scores as $score){
        $totalScore += $score;
    }
    $totalScore /= count($scores);
    $scores[$student] = $totalScore;
}

foreach($scores as $student => $score){
    $class = $classes[$student];
    $classScores = [];
    foreach($scores as $s => $sScore){
        if($classes[$s] == $class){
            $classScores[] = $sScore;
        }
    }
    $classAvgScore = array_sum($classScores) / count($classScores);
    $scores[$student] -= ($score - $classAvgScore);
}

//调整学生分班结果,使其符合男女比例和各科平均分
$totalMaleNum = 0;
$totalFemaleNum = 0;
foreach($students as $student){
    if($genders[$student] == 'male'){
        $totalMaleNum++;
    }else{
        $totalFemaleNum++;
    }
}

foreach($classes as $student => $class){
    $maleNum = 0;
    $femaleNum = 0;
    foreach($classes as $s => $sClass){
        if($sClass == $class){
            if($genders[$s] == 'male'){
                $maleNum++;
            }else{
                $femaleNum++;
            }
        }
    }

    if($maleNum > ($totalMaleNum / $classNum)){
        if($genders[$student] == 'male'){
            $classes[$student] = -1;
        }
    }

    if($femaleNum > ($totalFemaleNum / $classNum)){
        if($genders[$student] == 'female'){
            $classes[$student] = -1;
        }
    }
}

//将未分班的学生分配到另一个班
$classCount = array_fill(0, $classNum, 0);
foreach($classes as $student => $class){
    if($class == -1){
        $min = min($classCount);
        foreach($classCount as $index => $count){
            if($min == $count){
                $classes[$student] = $index;
                $classCount[$index]++;
                break;
            }
        }
    }
}

AI 借鉴代码

php
<?php

//定义班级平均分
$avgClassScore = array(
    '1' => 64,
    '2' => 65,
    '3' => 66,
    '4' => 67
);

//定义男女人数
$personNum = array(
    'man' => 24,
    'woman' => 25
);

//定义各科排名
$subjectRank = array(
    'math' => array(65, 64, 63, 62),
    'chinese' => array(67, 66, 65, 64),
    'english' => array(69, 68, 67, 66)
);

//定义班级
$class = array();

//计算男女人数
$manNum = $personNum['man'];
$womanNum = $personNum['woman'];

//定义最终学生名单
$studentList = array();

//根据男女人数计算每个班级分配人数
foreach ($avgClassScore as $clazz => $score) {
    //每个班级分配男生数量
    $manPerClassNum = round($manNum / 4);
    //每个班级分配女生数量
    $womanPerClassNum = round($womanNum / 4);
    // 把分配数量放入班级
    $class["man_num"] = $manPerClassNum;
    $class["woman_num"] = $womanPerClassNum;
    $class["score"] = $score;
    array_push($studentList, $class);
}

//计算学生名单
foreach ($studentList as $key => $value) {
    $manNum = $value['man_num'];
    $womanNum = $value['woman_num'];
    $score = $value['score'];
    //获取最近的男生成绩
    for ($i = 0; $i < $manNum; $i++) {
        $manScore = nearestScore($score, $subjectRank['math']);
        $subjectRank['math'] = delScore($manScore, $subjectRank['math']);
        $studentList[$key]['man_list'][] = $manScore;
    }
    //获取最近的女生成绩
    for ($j = 0; $j < $womanNum; $j++) {
        $womanScore = nearestScore($score, $subjectRank['chinese']);
        $subjectRank['chinese'] = delScore($womanScore, $subjectRank['chinese']);
        $studentList[$key]['woman_list'][] = $womanScore;
    }
    //判断英语成绩是否平均分
    $allScore = 0;
    for ($k = 0; $k < count($studentList[$key]['man_list']); $k++) {
        $allScore += $studentList[$key]['man_list'][$k];
    }
    for ($l = 0; $l < count($studentList[$key]['woman_list']); $l++) {
        $allScore += $studentList[$key]['woman_list'][$l];
    }
    $avgScore = $allScore / ($manNum + $womanNum);
    //获取最近的英语成绩
    $englishScore = nearestScore($avgScore, $subjectRank['english']);
    $subjectRank['english'] = delScore($englishScore, $subjectRank['english']);
    $studentList[$key]['english_score'] = $englishScore;
}

//根据最接近的数值获取成绩
function nearestScore($score, $arr)
{
    $nearestScore = 0;
    $temp = 0;
    foreach ($arr as $key => $value) {
        if (abs($score - $value) < $temp || $temp == 0) {
            $temp = abs($score - $value);
            $nearestScore = $value;
        }
    }
    return $nearestScore;
}

//根据成绩从数组中去除
function delScore($score, $arr)
{
    $arr1 = array();
    foreach ($arr as $key => $value) {
        if ($value != $score)
            $arr1[] = $value;
    }
    return $arr1;
}

//输出最终学生名单
print_r($studentList);
最近更新