matlab 任务分配粒子群算法

任务模型基于此篇论文

Xiaowei Jiang, Qiang Zhou, Ying Ye

Method of task assignment for UAV based on particle swarm optimization in logistics[P]

clear;clc;
%%
%    [ x    ,  y   , need  ,ai   , bi   ,service_time]
global T
T = [[0.00  , 0.00  , 0.00  , 6.00  , 12.0  ,   0  ]      %0分布矩阵
     [43.6  , 4.80  , 0.50  , 7.00  , 9.00  , 15/60]      %1
     [27.2  , 22.5  , 0.65  , 7.00  , 9.00  , 30/60]      %2
     [39.9  , 46.8  , 0.30  , 7.00  , 8+2/3 , 15/60]      %3
     [42.8  , 32.3  , 0.23  , 7+1/3 , 8.00  , 30/60]      %4
     [15.8  , 37.1  , 0.50  , 8.00  , 9.00  , 30/60]      %5
     [6.7   , 25.4  , 0.55  , 7.00  , 9+1/6 , 30/60]      %6
     [22.0  , 27.2  , 0.42  , 7.00  , 8.5   , 15/60]      %7
     [34.4  , 16.1  , 0.51  , 7.00  , 8.00  , 15/60]      %8
     [43.2  , 29.3  , 0.40  , 7.00  , 9.00  , 15/60]      %9
     [45.4  , 13.4  , 0.35  , 8.00  , 9+1/6 , 15/60]      %10
     ];
global demand   %uav总的搬运能力
demand = 2;  
global L_max    %uav行驶的最大距离
L_max = 1000000;
global L_c      %uav行驶的单位代价 yuan/km
L_c = 1;
global v        %uav飞行速度    km/h
v = 50;
global y        %迟到惩罚代价   yuan/h
y = 1.5;
n = 10;                         %n个任务
m = 3;                          %m个无人机 
dis = ones(n + 1, n + 1);           %记录无人机与任务两两之间欧式距离
for i = 1:n + 1
    for j = 1:n + 1
        dis(i, j) = ((T(i, 1) - T(j, 1))^2 + (T(i, 2) - T(j, 2))^2)^0.5;
    end
end
 
NP = 100;                   % 种群规模
w  = 0.5;                   % 惯性权重
c1 = 1.5;                   % 自我认知学习因子
c2 = 1.5;                   % 社会认知学习因子
g = ones(NP, n);            % 粒子群
best = 0;                   % 最佳迭代次数
num_max = 500;             % 最大进化代数
 
% 粒子初始化
for i = 1:NP
   % 粒子随机生成排序
    g(i, :) = randi([1,m],1,n);
end
 
gb = ones(1, 1);   %存储每次迭代得全局最优,用于plot        
num = 1;                % 进化代数
cost = zeros(NP,1);     % 存放个体的适应值
global_best_fit = 10^5;    % 存放全局最优值
global_best = g(1, :);        % 存放全局对应最优值的解
individual_best = g;    % 存放个体最优解
individual_best_fit = cost;   % 存放个体的最优适应值

for i = 1:NP            % 计算初始种群中的最优值和最优值对应的解
    individual_best_fit(i) = fitness(g(i, :), dis, n, m);
    if(individual_best_fit(i) <= global_best_fit)
        global_best_fit = individual_best_fit(i);
        global_best=g(i, :);
    end
end
doc save
%%
for time = 1:num_max
    for i = 1:NP
    % 惯性操作
        position_i = randperm(n,1);   %随机生成i
        position_j = randperm(n,1);   %随机生成j
    %置换粒子i,j位置处内容
        tmp = g(i, :);
        tmp(position_i) = g(i, position_j);
        tmp(position_j) = g(i, position_i);
    % 适应值更新
        tmp_cost = fitness(tmp, dis, n, m); % 计算新的适应度
        
        % 适应度值小于个体最优值对个体最优值进行更新;
        if tmp_cost < individual_best_fit(i)
            individual_best(i, :) = tmp;
            individual_best_fit(i) = tmp_cost;
        else        % 随机数小于w,也进行粒子更新
            if rand() < w
                g(i, :) = tmp;
            end
        end
        
        % 小于种群最优值对种群最优值进行更新
        if tmp_cost < global_best_fit
            global_best = tmp;
            global_best_fit = tmp_cost;
            best = time;
        end
    end
    
    % 自我认知
    K1 = randperm(NP,1);
    if fitness(individual_best(K1, :), dis, n, m) > global_best_fit
        g(K1, :) = individual_best(K1, :);  %第i个元素的内容替换为个体最优记录的第i个元素
    end
    if rand < c1
        g(K1, :) = individual_best(K1, :);  %第i个元素的内容替换为个体最优记录的第i个元素
    end
%     if fitness(individual_best(K1, :), dis, n, m) < global_best_fit
%         A=fitness(individual_best(K1, :), dis, n, m);
%         global_best_fit = fitness(individual_best(K1, :), dis, n, m);
%     end
    
    % 社会认知
    K2 = randperm(NP,1);
    if fitness(individual_best(K2, :), dis, n, m) > global_best_fit
        g(K2, :) = global_best;  %第i个元素的内容替换为个体最优记录的第i个元素
    end
    if rand < c2
        g(K2, :) = global_best;         %粒子个体第i个元素的内容替换为种群最优记录的第i个元素
    end
%     if fitness(individual_best(K2, :), dis, n, m) < global_best_fit
%         global_best_fit = fitness(individual_best(K1, :), dis, n, m);
%     end
    gb(time) = global_best_fit;
end

fprintf("最佳迭代次数:%d 次 \nThe Minimum Distribution cost  = %f \n", best, global_best_fit);
 
[bestvalue ,route_msg] = fitness(global_best, dis, n, m);
for i = 1:m
    j = 1;
    fprintf("机器人%d:", i);
    while(j <=  10 && route_msg(i, j) > 0)
        fprintf("--> %d ", route_msg(i, j));
        j = j + 1;
    end
    fprintf("\n");
end
%%
%绘图
f1 = figure;
plot(gb);
title('收敛曲线')
xlabel('迭代次数')
ylabel('适应值')
f2 = figure;
plot(T(:,1),T(:,2),"bo",'MarkerFaceColor',[0.4660 0.6740 0.1880],'MarkerSize',10 );
L = size(route_msg);
point_setx = zeros(10);
point_sety = zeros(10);
for i = 1:L(1)
    for j = 1:10
        if route_msg(i,j)==0
            break;
        else
            point_setx(i,j+1) = T(route_msg(i,j)+1,1);
            point_sety(i,j+1) = T(route_msg(i,j)+1,2);            
        end
    end
end
hold on
plot(point_setx(1,:),point_sety(1,:),'-','LineWidth',2);
plot(point_setx(2,:),point_sety(2,:),'--','LineWidth',2);
plot(point_setx(3,:),point_sety(3,:),':','LineWidth',2);

text(T(:,1)+1.5,T(:,2)+1.5,{'起点','1','2','3','4','5','6','7','8','9','10',},'Position',[50 50],'Color',[0.8500 0.3250 0.0980],'FontSize',14);
title('路线图')
xlabel('km')
ylabel('km')
%%
%适应度函数                              %n个任务10%m个无人机4
function [value, route_msg] = fitness(L, dis, n, m)
    global T
    global demand
    global L_max
    global L_c
    global v
    global y
    judge = 0;      %用于判断是否跳出循环
    route_msg = zeros(m, 10);
    value = 0.0;
    for i = 1:m
       %暂时存储全局最短路径
       tmp_best = 10000.0;
       %找到无人机i需要完成的任务j的集合
       mission_set = find(L(1:n) == i);
       total_demand=0;
       for t =  1:length(mission_set)
            total_demand = total_demand+T(mission_set(t)+1,3);
       end
       if total_demand > demand
           value = 10^5;
           break;
       end
       %全排列,计算无人机i完成任务的所有可能路径
       per_mission_range = perms(mission_set);    %将mission_set-向量所有排列列出
       temp_arry=size(per_mission_range);         %确定排列个数
       if temp_arry(2) == 0
           continue;  
       end           
       %计算每个uav每种排列方式得代价 选择最优作为路线
       for j = 1:temp_arry(1)
           T_cost = 0;     %初始时间代价  
           %创建储存到达每一个节点的时间 的向量
           arrive_time = zeros(1,length(mission_set) + 1);
       %计算路程成本
           %初始值设为从仓库出发,机器人第一个任务的距离
           L_temp = dis(1, per_mission_range(j,1)+1);
           %机器人按照任务顺序执行任务过程中得总距离
           for k = 1:length(mission_set) - 1
               L_temp = L_temp + dis(per_mission_range(j,k)+1, per_mission_range(j,k + 1)+1);
           end
           %机器人执行完任务回到仓库得总距离
           L_temp = L_temp + dis(per_mission_range(j,length(mission_set ))+1,1) ;
           if L_temp > L_max
                judge = 1;  
                break;
           end
           L_cost=L_c*L_temp;
       %计算时间成本
           %计算到达每一个节点的时间 
           T_temp = 6 + dis(1, per_mission_range(j,1)+1)/v;
           if T_temp <  T(per_mission_range(j,1)+1,4) %如果提前到达节点,将等待节点的开始时间
               T_temp = T(per_mission_range(j,1)+1,4);
           end
           arrive_time(1) = T_temp;
           for t = 1:length(mission_set)-1
                T_temp = T_temp + dis(per_mission_range(j,t)+1, per_mission_range(j,t + 1)+1)/v+ ...,
                                   T(per_mission_range(j,t)+1,6);
               if T_temp <  T(per_mission_range(j,t+1)+1,4) %如果提前到达节点,将等待到节点的开始时间
                   T_temp = T(per_mission_range(j,t+1)+1,4);
               end
               arrive_time(t+1) = T_temp;
           end
           T_temp = T_temp + dis(per_mission_range(j,length(mission_set))+1,1)/v+ ...,
                                   T(per_mission_range(j,length(mission_set ))+1,6);
           arrive_time(length(mission_set)+1) = T_temp;
           %计算时间代价
           for c = 1:length(arrive_time)
                if c==length(arrive_time)
                    bi=T(1,5);
                else
                    bi = T( per_mission_range (j,c)+1,5);                     
                end
                tmp_num=arrive_time(c) - bi;
                T_cost=T_cost + max([tmp_num,0])*y;
           end
        %计算总成本
           total_cost = L_cost + T_cost;
        
           if total_cost < tmp_best
               %记录下无人机i最短路径及其距离
               tmp_best = total_cost;
               route_msg(i, 1: length(mission_set)) = per_mission_range(j,:);
           end
       end
       if judge == 1
           value = 10^5;
           break;
       end
       value = value + tmp_best;
    end
end
  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值