实验类型:◆验证性实验 ◇综合性实验 ◇设计性实验
实验目的:学会使用Matlab求解指派问题。
实验内容:利用Matlab编程实现枚举法求解指派问题。
实验例题:有5人分别对应完成5项工作,其各自的耗费如下表所示,求最优指派方案;若最优方案不唯一,请给出所有的最优方案。
人员 | 任务 | ||||
A | B | C | D | E | |
甲 | 7 | 5 | 9 | 8 | 11 |
乙 | 9 | 12 | 7 | 11 | 9 |
丙 | 8 | 5 | 4 | 6 | 8 |
丁 | 7 | 3 | 6 | 9 | 6 |
戊 | 4 | 6 | 7 | 5 | 11 |
实验原理:
1.perms命令:
作用:产生所有可能的排列
语法:
P = perms(v)
P =perms(v),这里v是一个长度为n的行向量,此函数产生v中这n个元素的全排列矩阵,每行为一个排列。矩阵P包含有n!行和n列。
2.sort 命令:
B = sort (A) 按升序对 A 的元素进行排序。 如果 A 是向量,则 sort (A) 对向量元素进行排序。 如果 A 是矩阵,则 sort (A) 会将 A 的列视为向量并对每列进行排序。 如果 A 是多维数组,则 sort (A) 沿大小不等于 1 的第一个数组维度计算,并将这些元素视为向量。
具体的用法如下:
1)Y=sort(X)
sort()的参数可以是向量,矩阵,数组等等。当X是向量时,sort(X)对X的元素进行升序排序;当X是矩阵时,sort(X)对X的每一列进行升序排序;(ascend是升序排列descend是降序排列)
2)Y=sort(X,DIM,MODE)
参数DIM表示对哪一个维数进行排序,例如当X是一个二维矩阵,当DIM=1时表示对X的每一列进行排序,当DIM=2时表示对X的每一行进行排序。
参数MODE表示按哪一种模式进行排序,当MODE=‘ASCEND’的时进行升序排序,当MODE=‘DESCEND’时,进行降序排序。Y返回已经排好序的X。
3)[Y,I] = sort(X,DIM,MODE),I返回索引序列,它表示Y中的元素与X中元素的对应。
实验步骤:
1. 上机实验前先编写出程序代码
2. 录入、编辑程序
3. 调适程序至正确运行
4. 记录运行时的输入和输出
5. 对程序做进一步完善
程序代码:
方法一:
C=input('程序与分配问题有关,请输入成本矩阵C:');
n=size(C);
weishu=(1:n);
Lie=perms(weishu);
[m,n]=size(Lie);
cost=zeros(m,1);
for i=1:m
for k=1:n
cost(i)=cost(i)+C(k,Lie(i,k));
end
end
[a,~]=min(cost);
[Y,W]=sort(cost,1,'ascend');i=1;b=[];
while Y(i)==a
b=[b;W(i)];
i=i+1;
end
[bs,bss]=size(b(:,1));
x=zeros(n,n,bs);
for j=1:bs
for i=1:n
x(i,Lie(b(j),i),j)=1;
end
end
a
x
方法二:
% 定义成本矩阵
C = [7 5 9 8 11;
9 12 7 11 9;
8 5 4 6 8;
7 3 6 9 6;
4 6 7 5 11];
% 初始化最小总成本和最优分配方案
min_cost = inf;
best_assignments = [];
best_costs = [];
% 枚举所有可能的分配方案
n = size(C, 1);
perms_assignments = perms(1:n);
% 计算每种分配方案的总成本,并找出最优方案
for i = 1:size(perms_assignments, 1)
assignments = perms_assignments(i, :);
total_cost = sum(C(sub2ind(size(C), 1:n, assignments)));
if total_cost < min_cost
min_cost = total_cost;
best_assignments = assignments;
best_costs = total_cost;
elseif total_cost == min_cost
best_assignments = [best_assignments; assignments];
best_costs = [best_costs; total_cost];
end
end
% 输出所有最优方案及其总成本
fprintf('所有最优分配方案及其总成本为:\n');
for j = 1:size(best_assignments, 1)
fprintf('方案%d:', j);
for i = 1:n
fprintf(' 将工作%d分配给人员%d', i, best_assignments(j, i));
end
fprintf(',总耗费:%d\n', best_costs(j));
end
实验程序录入界面及程序运行结果界面:
方法一:
方法二:
实验总结:
本次实验使用了一些Matlab的函数和语法,如perms、size、min、sort等,用于处理矩阵和计算。通过本次实验,学会了perms命令和sort命令的使用,并成功利用Matlab编程实现枚举法求解指派问题。(对于方法一)
这个实验旨在使用Matlab编程解决指派问题,并输出所有最优解的分配方案及其总成本。指派问题是一类组合优化问题,通常涉及将若干任务分配给若干资源,以最小化总成本或最大化总利润。实验中,首先定义了一个成本矩阵C,其中C(i, j)表示将任务i分配给资源j的成本。然后利用枚举法,遍历所有可能的分配方案,并计算每种方案的总成本。最后找出所有最优方案,并输出每种最优方案的分配方案及其总成本。(对于方法二)
本实验通过编写Matlab代码,成功实现了指派问题的求解,并输出了所有最优解的分配方案及其总成本。这个实验有助于加深对指派问题的理解,以及对Matlab编程的应用能力。