%% 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