Engee 文档
Notebook

优化员工之间的办公空间分配

导言

这个例子提出了一个解决问题的最佳分配有限的资源—办公空间—员工之间,考虑到一些组织的要求。 优化标准是员工的个人偏好,由他们的服务时间加权,以及两对从事联合项目的员工的工作邻接的先决条件。 该任务以整数线性规划模型的形式形式化,以便在观察所有既定约束的同时最大化偏好的总加权满意度。

楼宇分布

我们的任务是在六名员工中分配七个办公空间。

员工的名字是:AnnaArtyomAlyona,Anton,Andrey,Anastasia

每个员工得到一个办公室,每个办公室不能超过一个人。 因此,一个房间将不可避免地保持空。

员工可以表明他们选择工作的偏好,这些愿望是根据他们在公司的工作经验考虑的:一个人在公司工作的时间越长,他们的优先级就越高。

房间的布局是异质的:有些办公室有窗户,有些没有窗户,其中一个窗户明显小于其他窗户。 另一个复杂的问题是,Alyona和Anton经常成对工作,所以他们应该被放置在相邻的房间。 这同样适用于安德烈和阿纳斯塔西娅—他们的工作也应该是相邻的。

我们将添加必要的库和布局功能。

In [ ]:
using JuMP, HiGHS, LinearAlgebra
include("officeassign.jl")

楼宇的布局

办公室1,2,3和4位于大楼内-这些都是没有窗户的房间。 房间5,6和7有机会获得自然光,但重要的是要注意,在房间5的窗口比其他两个显着小。

办公室的布局:

In [ ]:
кабинеты = ["内阁1", "内阁2", "内阁3", "内阁4", "内阁5", "内阁6", "内阁7"];
办公室文件(办公室)

设置任务

让我们以数学模型的形式呈现问题。 让我们创建二进制变量,以指示办公室是否属于特定员工。

雇员名单:

In [ ]:
имена = ["安娜", "阿尔乔姆", "阿莱娜", "安东", "安德烈", "阿纳斯塔西娅"];

让我们创建由办公室号码和员工姓名索引的二进制变量。

In [ ]:
模型=模型()。优化器)
@变量(模型,占用[i在名称,j在办公室], 
          Int, lower_bound=0, upper_bound=1);

员工经验

有必要根据员工的服务年限为员工偏好分配权重因子。 因此,一个人在MathWorks工作的时间越长,他们的愿望就越重要。

员工的服务年限分布如下:

*安娜9岁

*Artyom—2岁

*阿廖娜-5岁

*安东—4岁

*安德烈-1.5岁

*阿纳斯塔西娅10岁

基于这些数据,需要构造加权系数的归一化向量。

In [ ]:
服务年限= [9, 2, 5, 4, 1.5, 10];
weight_vector=length of service/sum(服务长度);

员工偏好

让我们构建一个偏好矩阵,其中行对应于办公室,列对应于员工。 每个人都应该被要求对每个办公室进行评分,以便他们所有等级的总和(即列的总和)为100。 价值越高,这个办公室对员工来说就越理想。 每个人的偏好被表示为一个向量列。

In [ ]:
安娜= [1, 3, 3, 3, 10, 40, 40];
阿尔乔姆= [0, 0, 0, 0, 20, 40, 40];
阿廖娜= [0, 0, 0, 0, 30, 40, 30];
安东= [0, 0, 0, 10, 10, 40, 50]
安德鲁= [3, 4, 1, 2, 10, 40, 40];
阿纳斯塔西娅= [10, 10, 10, 10, 20, 20, 20];

每个员工的偏好向量的每个第i个元素显示了他们对第i个办公室的重视程度。

因此,最终的偏好矩阵如下所示:

In [ ]:
матрица_предпочтений = [Анна Артём Алёна Антон Андрей Анастасия]';

将首选项矩阵乘以权重向量,以根据年资缩放列。

In [ ]:
PM=零(长度(名称),长度(橱柜))
对于i in1:长度(名称)
    对于j in1:长度(橱柜)
        PM[i,j]=weight_vector[i]*表示矩阵[i,j]
    end
end

目标功能

这项任务的目标是根据员工的资历最大限度地提高员工的满意度。 现在,您需要创建一个优化任务,并在其中包含此目标函数。

In [ ]:
@objective(model,Max,sum(occas[i,j]*PM[findfirst(isequal(i),names),findfirst(isequal(j),names)] 
                          对于名字中的I,橱柜中的j));

限制

第一个条件确保每个员工得到一个办公室。 在数学上,这意味着对于每个人来说,变量的值之和是 занимает 它必须完全等于所有办公室的一个。

In [ ]:
@constraint(model,restriction1[i in names],sum(occasions[i,j]for j in cabinets)==1);

第二组条件由不等式表示。 这些限制确保每个办公室不超过一人。

In [ ]:
@constraint(model,restriction2[j in names],sum(occasions[i,j]for i in names)<=1);

要求Alyona和Anton位于办公室,之间的距离不超过一个办公室。 类似的情况适用于阿纳斯塔西娅和安德烈。

我们将设置限制,以确保阿廖娜和安东将不超过一个办公室远离对方。

In [ ]:
@constraint(модель, ограничение_Алёна_Антон_1, занимает["阿莱娜","内阁1"] + sum(занимает["安东", j] for j in кабинеты) - занимает["安东","内阁2"] <= 1);
@constraint(модель, ограничение_Алёна_Антон_2, занимает["阿莱娜","内阁2"] + sum(занимает["安东", j] for j in кабинеты) - занимает["安东","内阁1"] - занимает["安东","内阁3"] - занимает["安东","内阁5"] <= 1);
@constraint(модель, ограничение_Алёна_Антон_3, занимает["阿莱娜","内阁3"] + sum(занимает["安东", j] for j in кабинеты) - занимает["安东","内阁2"] - занимает["安东","内阁4"] - занимает["安东","内阁6"] <= 1);
@constraint(модель, ограничение_Алёна_Антон_4, занимает["阿莱娜","内阁4"] + sum(занимает["安东", j] for j in кабинеты) - занимает["安东","内阁3"] - занимает["安东","内阁7"] <= 1);
@constraint(модель, ограничение_Алёна_Антон_5, занимает["阿莱娜","内阁5"] + sum(занимает["安东", j] for j in кабинеты) - занимает["安东","内阁2"] - занимает["安东","内阁6"] <= 1);
@constraint(модель, ограничение_Алёна_Антон_6, занимает["阿莱娜","内阁6"] + sum(занимает["安东", j] for j in кабинеты) - занимает["安东","内阁3"] - занимает["安东","内阁5"] - занимает["安东","内阁7"] <= 1);
@constraint(модель, ограничение_Алёна_Антон_7, занимает["阿莱娜","内阁7"] + sum(занимает["安东", j] for j in кабинеты) - занимает["安东","内阁4"] - занимает["安东","内阁6"] <= 1);

现在,我们将设置限制,以确保阿纳斯塔西娅和安德烈将不超过一个办公室远离对方。

In [ ]:
@constraint(модель, ограничение_Андрей_Анастасия_1, занимает["安德烈","内阁1"] + sum(занимает["阿纳斯塔西娅", j] for j in кабинеты) - занимает["阿纳斯塔西娅","内阁2"] <= 1);
@constraint(модель, ограничение_Андрей_Анастасия_2, занимает["安德烈","内阁2"] + sum(занимает["阿纳斯塔西娅", j] for j in кабинеты) - занимает["阿纳斯塔西娅","内阁1"] - занимает["阿纳斯塔西娅","内阁3"] - занимает["阿纳斯塔西娅","内阁5"] <= 1);
@constraint(модель, ограничение_Андрей_Анастасия_3, занимает["安德烈","内阁3"] + sum(занимает["阿纳斯塔西娅", j] for j in кабинеты) - занимает["阿纳斯塔西娅","内阁2"] - занимает["阿纳斯塔西娅","内阁4"] - занимает["阿纳斯塔西娅","内阁6"] <= 1);
@constraint(модель, ограничение_Андрей_Анастасия_4, занимает["安德烈","内阁4"] + sum(занимает["阿纳斯塔西娅", j] for j in кабинеты) - занимает["阿纳斯塔西娅","内阁3"] - занимает["阿纳斯塔西娅","内阁7"] <= 1);
@constraint(модель, ограничение_Андрей_Анастасия_5, занимает["安德烈","内阁5"] + sum(занимает["阿纳斯塔西娅", j] for j in кабинеты) - занимает["阿纳斯塔西娅","内阁2"] - занимает["阿纳斯塔西娅","内阁6"] <= 1);
@constraint(модель, ограничение_Андрей_Анастасия_6, занимает["安德烈","内阁6"] + sum(занимает["阿纳斯塔西娅", j] for j in кабинеты) - занимает["阿纳斯塔西娅","内阁3"] - занимает["阿纳斯塔西娅","内阁5"] - занимает["阿纳斯塔西娅","内阁7"] <= 1);
@constraint(модель, ограничение_Андрей_Анастасия_7, занимает["安德烈","内阁7"] + sum(занимает["阿纳斯塔西娅", j] for j in кабинеты) - занимает["阿纳斯塔西娅","内阁4"] - занимает["阿纳斯塔西娅","内阁6"] <= 1);

决定

我们来解决优化问题。

In [ ]:
优化!(型号);
Running HiGHS 1.11.0 (git hash: 364c83a51e): Copyright (c) 2025 HiGHS under MIT licence terms
MIP  has 27 rows; 42 cols; 164 nonzeros; 42 integer variables (42 binary)
Coefficient ranges:
  Matrix [1e+00, 1e+00]
  Cost   [5e-02, 1e+01]
  Bound  [1e+00, 1e+00]
  RHS    [1e+00, 1e+00]
Presolving model
27 rows, 42 cols, 164 nonzeros  0s
27 rows, 42 cols, 174 nonzeros  0s
Objective function is integral with scale 441

Solving MIP model with:
   27 rows
   42 cols (42 binary, 0 integer, 0 implied int., 0 continuous, 0 domain fixed)
   174 nonzeros

Src: B => Branching; C => Central rounding; F => Feasibility pump; J => Feasibility jump;
     H => Heuristic; L => Sub-MIP; P => Empty MIP; R => Randomized rounding; Z => ZI Round;
     I => Shifting; S => Solve LP; T => Evaluate node; U => Unbounded; X => User solution;
     z => Trivial zero; l => Trivial lower; u => Trivial upper; p => Trivial point

        Nodes      |    B&B Tree     |            Objective Bounds              |  Dynamic Constraints |       Work      
Src  Proc. InQueue |  Leaves   Expl. | BestBound       BestSol              Gap |   Cuts   InLp Confl. | LpIters     Time

 J       0       0         0   0.00%   inf             19.0952381         Large        0      0      0         0     0.1s
 R       0       0         0   0.00%   25.06349206     19.52380952       28.37%        0      0      0        21     0.1s
 C       0       0         0   0.00%   24.63492063     20.0952381        22.59%       31      1      0        23     0.1s
 T       0       0         0 100.00%   24.63492063     24.63492063        0.00%       31      1      0        23     0.1s
         1       0         1 100.00%   24.63492063     24.63492063        0.00%       31      1      0        23     0.1s

Solving report
  Status            Optimal
  Primal bound      24.6349206349
  Dual bound        24.6349206349
  Gap               0% (tolerance: 0.01%)
  P-D integral      0.00197485656513
  Solution status   feasible
                    24.6349206349 (objective)
                    0 (bound viol.)
                    0 (int. viol.)
                    0 (row viol.)
  Timing            0.08 (total)
                    0.00 (presolve)
                    0.00 (solve)
                    0.00 (postsolve)
  Max sub-MIP depth 0
  Nodes             1
  Repair LPs        0 (0 feasible; 0 iterations)
  LP iterations     23 (total)
                    0 (strong br.)
                    2 (separation)
                    0 (heuristics)

In [ ]:
=值。(占用);
function_value=objective_value(模型);
退出status_status=termination_status(模型);
输出数据=raw_status(模型);

解决方案的可视化

我们将办公空间在员工之间的最佳分布可视化。

In [ ]:
教室数量=长度(教室);
cabinet=Vector{Vector{String}}(undef,机柜数);
对于i=1:橱柜的数量
    cabinet[i]=names[findall(x->x>0.5,[solution[name,cabinets[i]]for name in names])]
end

谁在教室=副本(教室);
对于i=1:橱柜的数量
    如果isempty(内阁[i])
        кто_в_кабинете[i] = " 空的  ";
    else
        谁在研究[i]=研究[i][1];
    end
end

officeassign(谁在内阁);
function_value,退出status_out_data
Out[0]:
(24.634920634920633, MathOptInterface.OPTIMAL, "kHighsModelStatusOptimal")

结论

作为求解优化问题的结果,获得了在充分观察指定条件的同时确保目标函数的最大值的柜分布。 该解决方案展示了应用数学建模方法在标准冲突和资源有限的情况下做出客观管理决策的有效性。 所使用的方法使得能够正式化和平衡主观的人类偏好和严格的操作要求。