一个均匀合理分配工作的算法

function cal($jobs, $persons) {
    // 将任务转换为包含id和时间的数组,并按时间降序排序
    $sortedJobs = [];
    foreach ($jobs as $id => $time) {
        $sortedJobs[] = ['id' => $id, 'time' => $time];
    }
    usort($sortedJobs, function ($a, $b) {
        return $b['time'] - $a['time'];
    });

    // 初始化员工数据
    $personData = [];
    foreach ($persons as $person) {
        $personData[$person] = [
            'total' => 0,
            'jobs' => []
        ];
    }

    // 分配任务给员工(贪心算法)
    foreach ($sortedJobs as $job) {
        // 找到当前总工时最少的员工
        $minTotal = PHP_INT_MAX;
        $selectedPerson = null;
        foreach ($personData as $person => $data) {
            if ($data['total'] < $minTotal) {
                $minTotal = $data['total'];
                $selectedPerson = $person;
            }
        }
        // 分配任务
        $personData[$selectedPerson]['total'] += $job['time'];
        $personData[$selectedPerson]['jobs'][] = $job;
    }

    // 将任务分配到天数(每天最多5小时)
    $result = [];
    foreach ($personData as $person => $data) {
        $jobsList = $data['jobs'];
        // 按任务耗时降序排序以优化天数分配
        usort($jobsList, function ($a, $b) {
            return $b['time'] - $a['time'];
        });

        $days = [];
        $currentDay = 1;
        $currentDayTime = 0;
        $currentJobs = [];
        foreach ($jobsList as $job) {
            $time = $job['time'];
            if ($currentDayTime + $time <= 5) {
                $currentDayTime += $time;
                $currentJobs[] = $job['id'];
            } else {
                $days[] = [
                    'day' => '第' . $currentDay . '天',
                    'jobs_id' => $currentJobs
                ];
                $currentDay++;
                $currentDayTime = $time;
                $currentJobs = [$job['id']];
            }
        }
        if (!empty($currentJobs)) {
            $days[] = [
                'day' => '第' . $currentDay . '天',
                'jobs_id' => $currentJobs
            ];
        }
        $result[$person] = $days;
    }

    return $result;
}


$jobs = [  // 工作key  => 工时
    "1423" => 1, 
    "1424" => 1,
    "1501" => 2,
    "1392" => 1,
    "1391" => 1,
    "1464" => 4,
    "1484" => 1,
    "1493" => 4, 
    "1403" => 1,
    "1395" => 1,
    "1399" => 2,
    "1402" => 1,
    "1489" => 2,
    "1490" => 1,
    "1491" => 1, 
];
$persons = ["superman", "batman", "heiguafu"];

$result = cal($jobs, $persons);
print_r($result);


//输出结果
λ php cal.php
Array
(
    [superman] => Array
        (
            [0] => Array
                (
                    [day] => 第1天
                    [jobs_id] => Array
                        (
                            [0] => 1464
                        )

                )

            [1] => Array
                (
                    [day] => 第2天
                    [jobs_id] => Array
                        (
                            [0] => 1489
                            [1] => 1484
                            [2] => 1402
                        )

                )

        )

    [batman] => Array
        (
            [0] => Array
                (
                    [day] => 第1天
                    [jobs_id] => Array
                        (
                            [0] => 1493
                            [1] => 1423
                        )

                )

            [1] => Array
                (
                    [day] => 第2天
                    [jobs_id] => Array
                        (
                            [0] => 1392
                            [1] => 1403
                            [2] => 1490
                        )

                )

        )

    [heiguafu] => Array
        (
            [0] => Array
                (
                    [day] => 第1天
                    [jobs_id] => Array
                        (
                            [0] => 1501
                            [1] => 1399
                            [2] => 1424
                        )

                )

            [1] => Array
                (
                    [day] => 第2天
                    [jobs_id] => Array
                        (
                            [0] => 1391
                            [1] => 1395
                            [2] => 1491
                        )

                )

        )

)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容