代码

本文详细介绍了一种基于蚁群算法的任务调度与资源分配策略,适用于复杂制造流程中多个子任务的高效处理。通过随机生成任务参数,如类型、成本、时间等,构建了一个6x100的矩阵,用于模拟不同类型的子任务。随后,采用数据处理技术对子任务进行分类,并通过属性归一化,为后续的蚁群算法应用奠定了基础。在蚁群算法部分,定义了关键参数,如蚂蚁数量、信息素挥发因子等,并通过迭代过程不断优化制造流程,最终找到最佳的资源分配方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

%% II. 导入数据
A = 30;%前三个任务的数量
Task = zeros(6,100);
for j = 1:A
type1 = round(rand(1,1)*2)+1;
cost1 = round(rand(1,1)*9)+11;
time1 = round(rand(1,1)*9)+51;
place = round(rand(1,1)*9)+1;
quality = round(rand(1,1)*4)+1;
service = round(rand(1,1)*4)+1;
Task(:,j) = [type1 place  time1 quality cost1 service];  % 6个元素
end

最后任务Task结果为:6x30大小的矩阵

>> 
%% II. 导入数据
A = 30;%前三个任务的数量
B = 30;%中间三个任务的数量
C = 40;%后四个任务的数量
Task = zeros(6,100);
for i = 1:3
if i == 1
for j = 1:A
type1 = round(rand(1,1)*2)+1;
cost1 = round(rand(1,1)*9)+11;
time1 = round(rand(1,1)*9)+51;
place = round(rand(1,1)*9)+1;
quality = round(rand(1,1)*4)+1;
service = round(rand(1,1)*4)+1;
Task(:,j) = [type1 place  time1 quality cost1 service];
end
end

if i == 2
for j = 1:B
type2 = round(rand(1,1)*2)+4;
cost2 = round(rand(1,1)*9)+31;
time2 = round(rand(1,1)*9)+71;
place = round(rand(1,1)*9)+1;
quality = round(rand(1,1)*4)+1;
service = round(rand(1,1)*4)+1;
Task(:,A+j) = [type2 place  time2 quality cost2 service];
end
end

if i == 3
for j = 1:C
type3 = round(rand(1,1)*3)+7;
cost3 = round(rand(1,1)*9)+51;
time3 = round(rand(1,1)*9)+91;
place = round(rand(1,1)*9)+1;
quality = round(rand(1,1)*4)+1;
service = round(rand(1,1)*4)+1;
Task(:,A+B+j) = [type3 place  time3 quality cost3 service];
end
end
end

任务有前三个任务,中间三个任务,最后四个任务。每个任务有10个子任务

type = Task(1,:) % 得到的是Task矩阵中的任务类型,大小为1x100


A = 30;%前三个任务的数量
B = 30;%中间三个任务的数量
C = 40;%后四个任务的数量
Task = zeros(6,100);
for i = 1:3
if i == 1
for j = 1:A
type1 = round(rand(1,1)*2)+1;
cost1 = round(rand(1,1)*9)+11;
time1 = round(rand(1,1)*9)+51;
place = round(rand(1,1)*9)+1;
quality = round(rand(1,1)*4)+1;
service = round(rand(1,1)*4)+1;
Task(:,j) = [type1 place  time1 quality cost1 service];
end
end

if i == 2
for j = 1:B
type2 = round(rand(1,1)*2)+4;
cost2 = round(rand(1,1)*9)+31;
time2 = round(rand(1,1)*9)+71;
place = round(rand(1,1)*9)+1;
quality = round(rand(1,1)*4)+1;
service = round(rand(1,1)*4)+1;
Task(:,A+j) = [type2 place  time2 quality cost2 service];
end
end

if i == 3
for j = 1:C
type3 = round(rand(1,1)*3)+7;
cost3 = round(rand(1,1)*9)+51;
time3 = round(rand(1,1)*9)+91;
place = round(rand(1,1)*9)+1;
quality = round(rand(1,1)*4)+1;
service = round(rand(1,1)*4)+1;
Task(:,A+B+j) = [type3 place  time3 quality cost3 service];
end
end
end
%% III. 数据处理
num = 0;
sl = zeros(1,10);
subtasknum = zeros(1,10);
type = Task(1,:);
juzhen = zeros(6,1);
subtask = [];
for j = 1:10   %对子任务进行分类,结果在subtask1中  %%子任务总共有10类
for i = 1:100   
if type(i) == j  
num = num + 1;   % 类型相同的子任务数量 num
order = linspace(1,num,num);
subtask = [subtask,juzhen]; % 矩阵的横向合并
subtask(:,num) = Task(:,i);                     
subtask1 = [order;subtask]; % 矩阵的纵轴向合并
end
end
end

得到的结果中,subtask将10个任务中,子任务类型相同的放在一起,总共大小6x100。

总代吗:

%% II. 导入数据
A = 30;%前三个任务的数量
B = 30;%中间三个任务的数量
C = 40;%后四个任务的数量
Task = zeros(6,100);
%place = round(rand(1,1)*9)+1;
%type1 = round(rand(1,1)*2)+1;
%type2 = round(rand(1,1)*2)+4;
%type3 = round(rand(1,1)*3)+7;
%quality = round(rand(1,1)*4)+1;
%cost1 = round(rand(1,1)*9)+11;%单位:元
%cost2 = round(rand(1,1)*9)+31;
%cost3 = round(rand(1,1)*9)+51;
%time1 = round(rand(1,1)*9)+51;%单位:分钟
%time2 = round(rand(1,1)*9)+71;
%time3 = round(rand(1,1)*9)+91;
for i = 1:3
if i == 1
for j = 1:A
type1 = round(rand(1,1)*2)+1;
cost1 = round(rand(1,1)*9)+11;
time1 = round(rand(1,1)*9)+51;
place = round(rand(1,1)*9)+1;
quality = round(rand(1,1)*4)+1;
service = round(rand(1,1)*4)+1;
Task(:,j) = [type1 place  time1 quality cost1 service];
end
end
if i == 2
for j = 1:B
type2 = round(rand(1,1)*2)+4;
cost2 = round(rand(1,1)*9)+31;
time2 = round(rand(1,1)*9)+71;
place = round(rand(1,1)*9)+1;
quality = round(rand(1,1)*4)+1;
service = round(rand(1,1)*4)+1;
Task(:,A+j) = [type2 place  time2 quality cost2 service];
end
end
if i == 3
for j = 1:C
type3 = round(rand(1,1)*3)+7;
cost3 = round(rand(1,1)*9)+51;
time3 = round(rand(1,1)*9)+91;
place = round(rand(1,1)*9)+1;
quality = round(rand(1,1)*4)+1;
service = round(rand(1,1)*4)+1;
Task(:,A+B+j) = [type3 place  time3 quality cost3 service];
end
end
end
%% III. 数据处理
num = 0;
sl = zeros(1,10);
subtasknum = zeros(1,10);
type = Task(1,:);
juzhen = zeros(6,1);
subtask = [];
for j = 1:10   %对子任务进行分类,结果在subtask1中
for i = 1:100
if type(i) == j
num = num + 1;
order = linspace(1,num,num);
subtask = [subtask,juzhen];
subtask(:,num) = Task(:,i);
subtask1 = [order;subtask];
end
end
sl(j) = num;
end
for i = 2:10   %获取每个子任务的数量
subtasknum(1) = sl(1);
subtasknum(i) = sl(i) - sl(i-1);
end
w = [0.18 0.46 0.29 0.07];
normalized = zeros(1,100);
for i = 1:100    %属性归一化
normalized(i) = w*subtask(3:6,i);
end
%% IV. 初始化参数
m = 15;                              % 蚂蚁数量
alpha = 1;                           % 信息素重要程度因子
beta = 5;                            % 启发函数重要程度因子
rho = 0.01;                          % 信息素挥发因子
T = 1;                               % 常系数
Eta = 1./normalized;                 % 启发函数
%Tau = ones(10,10);                  % 信息素矩阵
Table = zeros(15,10);                % 路径记录表
iter = 1;                            % 迭代次数初值
iter_max = 1000;                      % 最大迭代次数
Path = ones(2,10);
PATH = zeros(2,11);
lujingjihe = [];
for i = 1:10
tau = ones(1,subtasknum(i));
dlmwrite(sprintf('%s%d','tau',i),tau);
load (sprintf('%s%d','tau',i));
end
%% V. 迭代寻找最佳制造流程
while iter <= iter_max
% 固定各个蚂蚁的起点
start = zeros(m,1);
for i = 1:15
start(i) = 0;
end
%为每个子任务选择资源
i = 1;
for j = 1:15   % 逐个蚂蚁路径选择
allow = linspace(1,subtasknum(i),subtasknum(i));
for k = 1:subtasknum(i)  %计算每个资源的转移概率
Tau = load (sprintf('%s%d','tau',i));
P(k) = Tau(1,k)^alpha * Eta(1,k)^beta;
end
P = P/sum(P);
% 轮盘赌法选择执行子任务的资源
Pc = cumsum(P);
target_index = find(Pc >= rand);
target = allow(target_index(1));
Table(j,1) = target;
end
P = [];
%建立子任务之间的概率转移矩阵
for i = 2:10
allow = linspace(1,subtasknum(i),subtasknum(i));
for j = 1:subtasknum(i-1)
for k = 1:subtasknum(i)
Tau = load (sprintf('%s%d','tau',i));
P(j,k) = Tau(1,k)^alpha * Eta(1,k+subtasknum(i-1))^beta;
end
end
dlmwrite(sprintf('%s%d','P',i-1),P);
load (sprintf('%s%d','P',i-1));
for h = 1:15
Q = P(Table(h,i-1),:)/sum(P(Table(h,i-1),:));
Pc = cumsum(Q);
target_index = find(Pc >= rand);
target = allow(target_index(1));
Table(h,i) = target;
end
P = [];
end
%信息素更新
%建立信息素更新矩阵
for j = 1:10
update_tau = zeros(1,subtasknum(j));
dlmwrite(sprintf('%s%d','update_tau',j),update_tau);
load (sprintf('%s%d','update_tau',j));
end
%计算每只蚂蚁所走路径释放的信息素浓度
free_tau = zeros(1,15);
path=[];%计算所走过得路径
for i = 1:15
j = 1;
path(i,j) = Table(i,j);
for j = 2:10
path(i,j) = sl(j-1)+Table(i,j);
end
end
%计算释放的信息素浓度
Length = [];
length = [];
for i = 1:15
for j = 2:10
length = normalized(path(i,j-1)) + normalized(path(i,j));
end
Length(i) = length;
length = [];
free_tau(i) = T/Length(i);
end
for i = 1:10
update_Tau = load (sprintf('%s%d','update_tau',i));
TAU = load (sprintf('%s%d','tau',i));
for j = 1:15
update_Tau(Table(j,i)) = update_Tau(Table(j,i)) + free_tau(j);
end
update_Tau = TAU*(1-rho) + update_Tau;
dlmwrite(sprintf('%s%d','tau',i),update_Tau);
load (sprintf('%s%d','tau',i));
end
lujingjihe = [lujingjihe;path];
for i = 1:15
a = path(i,:);
[logical, hangshu] = ismember(a,Path,'rows');
if logical == 0
Path = [ Path; path(i,:)];
a = [lujingjihe((iter-1)*15+i,:),free_tau(i)];
PATH = [PATH;a];
else
PATH(hangshu,11) = PATH(hangshu,11) + free_tau(i);
end
end
iter = iter + 1;
Table = zeros(15,10);
end
jieguo = PATH(:,11);
[m,p] = max(jieguo);
zhizaoliucheng = PATH(p,1:10)

zhizaoliucheng =

 5    19    29    31    35    56    61    65    86   100
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值