首页 > 编程知识 正文

matlab例题代码,指派矩阵matlab求解

时间:2023-05-03 16:07:58 阅读:35062 作者:150

分配问题的基本内容

一般来说,分配问题的解决方法是如何将任务分配给人,以使任务完成的利润最大化(成本型利润求最小值,利润型利润求最大值)。 上述问题是0 - 1整数规划问题。

问题以任务和人为中心展开,即有m个任务和n个。 每个人处理各自的任务都有相应的利益,把每个人的情况放在一起,构成了一个m*n的利益矩阵。

m=n时,即此时任务数和人数相等时,每个人都处理任务,有以下制约

对任务来说,各项任务必须指派一个人;

对人来说,每个人都要分配一个任务。

同样,对于m n,如果任务数少于人数,则存在以下限制:

对任务来说,各项任务必须指派一个人;

对人来说,每个人可能被分配到一个任务,也可能没有被分配到。

对于m n,如果任务数多于人数,则有以下限制:

对任务来说,各项任务必须指派一个人;

每个人可以被分配到一个或多个任务,但不会超过任务总数。

模型调用格式

[x,min_fval,exitflag]=mytaskarrange2(f ) ]

呼叫说明:

变量输入m*n的利益矩阵。 其中,m行是m个任务,n列是n个。

输出变量x是与利益矩阵相同类型的0-1矩阵,其中1表示放置,0表示不放置; min_fval是最佳目标值exitflag是结束标识符,通常等于1表示解收敛。

模型代码

function [x,min_fval,exitflag]=mytaskarrange2(f ) )

%%程序的功能说明

求解%不平衡任务分配问题

%====输入参数=====

%f m行n列利润矩阵、m个任务、n个、

%====输出参数=====

%x目标函数取最小值时的自变量值

%min_fval目标函数的最小值

%退出标志退出标识符

%方案编制时间: 2019年09月

%%程序主体

[m,n]=size(f; 获取%利润矩阵中的任务数和人数

每%行画一列向量

f=f ';

f=f(3360;

%结构方程的约束(每行加起来等于1。 也就是说,必须为每个任务分配一个人) )。

aeq=cell(m,m );

aeq(3360 )={Zeros(1,n ) };

aeq(eye(m,m )==1)={Ones(1,n ) };

aeq=小区2 mat (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 );

结束

%%将结果恢复为利润矩阵感知格式

x=reshape(x,n,m ) ';

测试算例

为了验证本模型的效果,给出以下测试算例进行验证。

% 4个任务,4个人完成最佳解: 8

f1=[ 6,1,3,8;

六、三、五、二;

1,1,1,4;

7、2、5、2;

% 4项任务,5人完成最佳解: 127.8

f2=[37.7、32.9、38.8、37、35.4;

43.4、33.1、42.2、34.7、41.8;

33.3、28.5、38.9、30.4、33.6;

29.2、26.4、29.6、28.5、31.1];

% 5个任务,3人完成最佳解: 116

F3=[ 25,39,34;

29、38、27;

31、26、28;

4、20、40;

37、18、32 );

[x,min_fval,exit flag ]=修改mytaskarrange2(f1 ) %输入测试的效果

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。