问题描述

用户流在一条链路传输时,执行一些网络功能,并按照一定的顺序部署?

问题等价

1、一个企业生产一件产品共有M项任务需要完成,依次记为A、B、C…,任务的完成需要遵循一定的顺序,A任务完成后才能去完成B,B完成后才能去完成C,以此类推。

2、此时有N(N>=M)名员工可以完成这些任务,员工编号依次为1、2、3…,且每个员工只能固定完成一项任务,由于工作能力不同,每名员工完成不同任务耗费的时间不一样,如表1所示。
任务/时间 1 2 3 4 5
A 21 18 16 22 14
B 35 28 33 26 22
C 12 16 11 14 11

3、现按任务的顺序为各任务安排合适的员工,各员工按编号从小到大的顺序进行排队,对每一个员工可以做出同意或拒绝的选择,且只有一次机会,当选择同意时,按任务的先后顺序为此员工安排一项任务,当选择拒绝时,此员工离开队伍,后续不能再向其安排任务。
例如:

当前最新任务为A,1号员工到来,拒绝1号完成任务A,1号离开,2号员工到来,接受2号员工完成任务A

当前最新任务变为B,3号员工到来,拒绝3号完成任务B,3号离开,4号员工到来,接受4号员工完成任务B

当前最新任务变为C,5号员工到来,接受5号员工完成任务C

任务已分配完毕

因为条件3的限制,导致表1发生了一些变化,

1号员工不可能分配到任务B、C、…,因为这样就没有员工完成A了,同理有以下限制

2号员工不可能分配到任务C…

4号员工不可能分配到任务A…

5号员工不可能分配到任务A、B…

对于不可能分配到的任务,此员工完成时间记为无穷大,如下表2所示
任务/时间 1 2 3 4 5
A 21 18 16 ∞ ∞
B ∞ 28 33 26 ∞
C ∞ ∞ 11 14 11

% 文件名:example1.m
% 时间:2020年9月29日
% 作者:乐观的lishan
% 功能:遍历法计算顺序指派问题
clear,close,clc
warning off
tic%生成代价矩阵
d = [21   18   16   inf   inf;inf  28   33   26    inf;inf  inf  11   14    11]; M = size(d,1);    %任务数
N = size(d,2);    %员工数,员工应数大于或等于任务数C = nchoosek(1:N,M);  %求出所有的组合情况
n = size(C,1);
Sum = zeros(n,1);
for i = 1:nfor j = 1:M Sum(i) = Sum(i) + d(j,C(i,j)); end end
min_Sum = min(Sum);
min_plan = (C((Sum == min_Sum),:));
num_plan = size(min_plan,1);
toc%输出结果
fprintf('完成指派任务的方案总数为:%.0f\n',n)
fprintf('完成指派任务耗费的最短时间为:%.0f\n',min(Sum))
for i = 1:num_planfprintf('对应第%d种指派方案为:%s\n',i,num2str(min_plan(i,:)))
end
%绘制耗费时间坐标图
plot(Sum,'r','LineWidth',2)
%绘图说明
xlabel('组合编号')
ylabel('耗费时间')
title('不同组合方案下的时间耗费示意图')

求出结果为3号员工完成任务A,4号员工完成任务B,5号员工完成任务C,此时耗费时间最短,最短时间为53

但是这是数据量比较少的情况,一旦数据增大,就不能再使用遍历了,比如,任务数为27,员工数为35,组合方式就达两千三百万种之多,此时需要寻找一种更好的方法

使用蒙特卡洛加模拟退火算法解决一个离散的组合优化问题

算法步骤描述如下:

step1:使用蒙特卡洛方法生成随机选择一个最优的组合,作为初始解,并计算初始能量值(目标函数值)

step2:初始化模拟退火算法参数,初始温度T,终止温度e,温度衰减因子alf,马尔科夫链长度L,能量不再降低的次数上限cnt_limit

step3:马尔科夫链长度加1,判断是否达到上限,若是,算法结束,否则,开始step4

step4:当前温度下,在当前解的基础上进行扰动构造一个新解,本文中构造方法为:先将当前解的组合中随机去掉一个员工,再随机添加一个新员工。生成一个新解(一种组合),并计算能量值,即目标函数值(耗费总时间)

step5:计算与前一个解的能量之差

step6:根据能量差判断是否接受新解。若能量差小于0 ,说明新解的能量更低,接受新解;否则 ,说明新解的能量没有下降,以玻尔兹曼概率接受新解。同时记录最优解和对应的最低能量值(最小目标函数值)

step7:判断最低能量值是否保持不变,若是,计数器加1,否则,计数器清0。若计数器到达上限,算法结束。

step8:降低温度,判断温度是否达到下限,若是,算法结束,否则,转向step3

程序如下:

% 文件名:example2.m
% 时间:2020年9月29日
% 作者:乐观的lishan
% 功能:利用模拟退火算法计算有顺序约束的指派问题
clear,close,clc
warning off
tic%数据的生成
M = 27;       %任务数
N = 35;       %员工数,员工应数大于任务数
lb = 10;      %成本下限
ub = 35;      %成本上限%利用随机数生成代价矩阵
d = unifrnd (lb, ub, M, N);  %生成一个服从均匀分布的矩阵,数值范围[lb,ub],矩阵大小M×N
d = ceil(d); %朝正无穷大取整
for i = 2:Md(i,1:i-1) = inf;d(M-i+1,N-(i-1)+1:N) = inf;
end% 保存数据,可用于下一次用相同的数据实验
save data %运行一次后可将此行上面的所有代码注释,再次运行即可使用相同的数据
load data.mat  %初始化决策变量和函数值,即模拟退火中的状态和内能
S0 = sort(randperm(N,M));    %初始化分配策略,决策变量,即状态
Sum = inf;                   %初始化能量,目标函数值
H = 20;                      %蒙特卡洛生成组合数次数
%生成初始解,用蒙特卡洛方法随机生成H种组合,并选择其中一个较好的指派组合
for j = 1:H   S = sort(randperm(N,M));temp = 0; for i = 1:M temp=temp+d(i,S(i)); end if temp < Sum S0 = S;Sum = temp; end
end
%记录蒙特卡洛选优结果
sum = Sum;
s0 = S0;%模拟退火算法的参数设置
e = 0.1^30; %终止温度
L = 5000;    %Markov链长度
alf = 0.999; %温度衰减因子
T = 1;       %起始温度
cnt_limit = 300;        %最优值连续保持不变的次数上限all_people = 1:N;       %所有元素构成的集合
S0 = s0;
cnt = 0;record_solve(1,:) = S0;
record_value(1,:) = 0;
for i = 1:Mrecord_value = record_value + d(i,S0(i));
end%退火过程
for k=2:L %产生新解 original_solve = S0; %保留原解remain_people = setdiff(all_people,S0);    %求当前解在所有元素构成的集合中的补集index1 = randperm(N-M,1); index2 = randperm(M,1);add_num = remain_people(index1);   %随机添加一个新元素S0(index2) = [];                   %随机删除当前解的一个元素new_solve = sort([S0,add_num]);    %添加一个新元素并排序生成新解record_solve(k,:) = new_solve;%计算代价函数值,即当前时刻目标值(内能)减去前一时刻目标值(内能)d1 = 0;d2 = 0;for i = 1:Md1 = d1 + d(i,original_solve(i));        %交换前,目标函数值d2 = d2 + d(i,new_solve(i));             %交换后,目标函数值enddf = d2-d1; %内能差record_value(k,:) = d2;%接受准则 if df<0  %内能降低,此解与上一解比较更优S0 = new_solve;   if d2 < Sum(k-1)bset_solve = new_solve;Sum(k) = d2;elseSum(k) = Sum(k-1);endelseif exp(-df/T)>rand(1)  %内能增大,此解与上一解比较更差,以玻尔兹曼概率接受此解S0 = new_solve;      else    %内能增大,且不接受新解S0 = original_solve;endSum(k) = Sum(k-1);end%判断最优值是否不再变动if Sum(k) == Sum(k-1)cnt = cnt + 1;if cnt >= cnt_limitbreak;endelsecnt = 0;end%温度判断T=T*alf;  %降低温度,开始冷却if T<e   %温度小于临界值,算法提前结束break; end
endtoc%结果验证
d3 = 0;
for i = 1:Md3 = d3 + d(i,bset_solve(i));
end
if d3 == Sum(end)fprintf('结果验证【成功】\n')
elsefprintf('结果验证【失败】\n')
endbest_plan = (record_solve((record_value == Sum(end)),:));
[b,location]= unique(best_plan,'rows','first');
res = sortrows([location,b]);
new_best_plan=res(:,2:size(res,2));
%输出结果
fprintf('完成指派任务的方案总数为:%.0f\n',nchoosek(N,M))
fprintf('程序迭代次数为:%.0f\n',length(Sum))
fprintf('完成指派任务所需的最少成本为:%.0f\n',Sum(end))
for i = 1:size(new_best_plan,1)fprintf('对应第%d种指派方案为:%s\n',i,num2str(new_best_plan(i,:)))
end%绘制收敛坐标图
plot(Sum,'r','LineWidth',2)
%绘图说明
xlabel('收敛次数')
ylabel('成本值')
title(['收敛示意图:','第',num2str(length(Sum)),'次收敛'])

更改任务数、员工总数,程序也能很快的完成收敛。当然模拟退火每次运行结果不一样,可以多运行几次,记录一个较好的结果,这样能够在短时间内得到一个较好解方案

通过遍历法可以验证模拟退火算法结果的有效性,其结果保持一致,但模拟退火算法可以更快得出结果
本文对有顺序约束的任务指派问题进行了分析,有顺序约束即任务的完成有先后顺序之分,员工的选取也有先后顺序之分(只能向后选取),在这个限制条件下,本文先给出了遍历法的解决方法,并给出了Matlab代码和示例结果。然后提出在任务数和员工数增大的情况下遍历法不再适用,因为本质上这是一个离散的组合优化问题,由此引了蒙特卡洛算法加模拟退火算法的解决思路,并给出了算法步骤和Matlab代码以及示例结果。本文的模拟退火算法与一般退火算法不同,由于本文的组合情况有顺序约束,常规退火算法中的扰动方法不再适用,本文使用方法为:在当前解中随机删除一个元素,再随机加入一个新元素的方法构造新解,最终取得了比较好的效果。

感谢博主“乐观的Lishan”为本文提供了问题基础以及解决的思路
大佬链接
参考文献
[1] 李冰,徐杰,杜文.用模拟退火算法求解有顺序约束指派问题[J].系统工程理论方法应用,2002(04):330-335.

[2] 赵越.模拟退火算法求解指派问题新探[J].吉林建筑工程学院学报,2011,28(04):61-63.

模拟退火算法求解--顺序约束的路由部署问题相关推荐

  1. 模拟退火算法求解旅行商问题(python实现)

    模拟退火算法求解旅行商问题 文章目录 模拟退火算法求解旅行商问题 一.模拟退火算法原理 二.旅行商问题 1.求解思路 2.代码 总结 旅行商问题(TSP 问题).假设有一个旅行商人要拜访全国31个省会 ...

  2. 【TWVRP】基于matlab模拟退火算法求解带时间窗的车辆路径规划问题【含Matlab源码 160期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  3. 优化算法求解复杂约束问题策略(以粒子群算法为例讲解求解复杂约束问题的多种策略)

    优化算法求解复杂约束问题策略(以粒子群算法为例讲解求解复杂约束问题的多种策略)python实现     整个代码文字讲解共17页 提示:专栏解锁后,可以查看该专栏所有文章. 文章目录 策略1:在位置更 ...

  4. 模拟退火算法求解TSP问题

    前言:模拟退火(simulated annealing)技术,在每一步都以一定的概率接受比当前结果更差的结果,从而有助于"跳出"局部极小.在每次迭代过程中,接受"次优解& ...

  5. matlab算法大全 pdf_遗传模拟退火算法求解旅行商(TSP)问题

    hello大家好,很高兴又和大家见面了.在之前的遗传算法(GA)求解旅行商问题(TSP)MATLAB代码讲解和模拟退火(SA)算法求解旅行商 (TSP)问题MATLAB代码讲解这两篇推文中,分别讲解了 ...

  6. 用模拟退火算法求解TSP问题

    模拟退火算法是一种基于MonteCarlo迭代求解策略的一种随机寻优算法.该算法从某一较高初温出发,伴随温度参数的不断下降,结合概率的突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概 ...

  7. 爬山法和模拟退火算法求解选址问题

    选址问题 选址问题是运筹学中经典的问题之一.选址问题在生产生活.物流.甚至军事中都有着非常广泛的应用,如工厂.仓库.急救中心.消防站.垃圾处理中心.物流中心.导弹仓库的选址等. 基本问题: P-中位问 ...

  8. 【TWVRP】模拟退火算法求解带时间窗的多车型路径规划问题【含Matlab源码 913期】

    ⛄一.模拟退火算法简介 1 引言 模拟退火算法(Simulated Annealing,SA)的思想最早由Metropolis等人于1953年提出:Kirkpatrick于1983年第一次使用模拟退火 ...

  9. MATLAB语言实现模拟退火算法求解n维变量的最小值问题

    在给定定义域,对于求解函数对应的最优值问题.此处以模拟退火算法求解30维变量函数最小值问题举例(最大值问题也可转化成求解最小值问题). 其中,. 一.模拟退火算法简介 模拟退火算法(SA)来源于固体退 ...

  10. 模拟退火算法求解旅行商问题

    模拟退火算法求解旅行商问题 文章目录 模拟退火算法求解旅行商问题 旅行商(TSP)问题 一.TSP问题分析 二.模拟退火算法 1.一秒理解算法 2.算法原理 3. 算法流程 三.伪代码 四.运行结果 ...

最新文章

  1. 只因为离职报告多写这三个字,员工竟然倒赔公司2.9万!
  2. 元宇宙大热后将陷低潮, 虚实互联网更准确, 2030前后才可能全面热启
  3. Oracle 并行原理与示例总结
  4. 初识JavaScript(二)
  5. 使用批处理执行sql 语句
  6. 每天进步一点点《ML - 感知机》
  7. sparseTM的公式理解
  8. STM32F407之常识
  9. 一笔没有问题的数据 误操作成汇总和结算不一致的情况的处理方式
  10. 新手学习嵌入式需要掌握的几点知识点
  11. 点击单选按钮 实现表格的隔行变色
  12. 第三代计算机硬件特点是,第三代计算机的特征.doc
  13. maven更新总结与tomcat发布方法总结
  14. linux基本命令示例_Linux中带示例的sort命令
  15. [处理数据的心得][1]--相关矩阵的可视化
  16. 《善用佳软:高效能人士的软件应用之道》一导读
  17. python 拟合线,拟合函数
  18. 基于GIS技术的智慧城市数字底盘(时空大数据平台)
  19. 每日一题冲刺大厂第十五天 终于结束的起点
  20. oracle ndb,NDB语法 - ivaneeo's blog - BlogJava

热门文章

  1. 记一次网站漏洞修复经历
  2. nacos 默认 namespace: public 拿不到数据
  3. Pytorch Gradient Checkpoint使用示例
  4. 程序员博客html模板,程序员技术博客WordPress主题
  5. 牛熊分界点?技术指标择时 在当前A股指数效果解密
  6. C语言 十进制转换为二进制
  7. 中国黑客VS外国黑客,5分钟让你明白谁更技高一筹
  8. stc12c5a60s MQ系列传感器及报警
  9. Console 接口介绍及电路设计
  10. raft2020年更新_Raft6月1日更新了什么 Raft6月1日更新内容介绍