求大神指导一下,matlab线性规划指派问题,任务数大于人数不会写代码

有n个人,m个任务,m>n,一个任务只能配分配给一个人,但是一个人最多可以被分配五个任务,要使用时最短。怎么用matlab写代码

function [x,min_fval,exitflag] = myTaskArrange2(f)%% 程序功能说明%求解不平衡任务指派问题%====输入参数====%f m行n列的效益矩阵,m个任务,n个人,%====输出参数====%x 目标函数取最小值时的自变量值%min_fval 目标函数的最小值% exitflag 退出标识符%程序编写时间:2019年09月%% 程序主体[m,n] = size(f); % 获取效益矩阵中任务的个数和人的个数% 按行拉成一列向量f = f';
F = f(:);% 构造等式约束(每一行加起来等于1,即每个任务必须分配一人)Aeq = cell(m,m);
Aeq(:) = {zeros(1,n)};
Aeq(eye(m,m)==1) = {ones(1,n)};
Aeq = cell2mat(Aeq);
Beq = ones(m,1);% 取整变量地址intcon = 1:m*n;% 变量取值范围(大于0小于1)LB = zeros(m*n,1);
UB = ones(m*n,1);if m == n % 如果任务数等于人数
% 构造等式约束(每个人一定会被安排)
Aeq2 = repmat(eye(n,n),1,m);
Beq2 = ones(n,1);
Aeq = [Aeq;Aeq2];
Beq = [Beq;Beq2];
% 整数规划求解
[x,min_fval, exitflag] = intlinprog(F,intcon,[],[],Aeq,Beq,LB,UB);
elseif m < n % 如果任务数小于人数
% 构造不等式约束(每一列加起来大于0小于1,即每个人可能被安排也可能不被安排一个任务)
A = repmat(eye(n,n),1,m);
B = ones(n,1); % 利用整数规划函数求解
[x,min_fval, exitflag] = intlinprog(F,intcon,A,B,Aeq,Beq,LB,UB);
elseif m > n % 如果任务数大于人数
% 构造不等式约束(每一列加起来大于1小于m,即每个人可能被安排一个或者多个任务,最多不超过任务数m)
A = repmat(eye(n,n),1,m);
B = ones(n,1)*m; % 利用整数规划函数求解
[x,min_fval, exitflag] = intlinprog(F,intcon,A,B,Aeq,Beq,LB,UB);end%% 将结果还原成效益矩阵对应形式x = reshape(x,n,m)';
温馨提示:答案为网友推荐,仅供参考
相似回答