从今天起我们队伍开始正式准备国赛啦,今天队伍学习的第一篇是 2017年D题:巡检线路的排班
这样的生产调度问题会使用到规划模型,那么就要按照规划模型的组成,确定优化目标,从而确定模型的目标函数和约束条件。
优化目标:
1. 每一班人员数量尽可能少。 原论文的处理是:所用工人最少,其实就是完成巡检任务所用时间之和最小。将其写为目标函数。
2.每位工作人员的工作时间应该平均。论文将工作人员的工作时间差异控制在10分钟以内,将其写为约束条件。全文的基本思路是这样的:
整个调度的核心是对工作人员巡检的场所进行调度,即哪个人应该巡检哪个地方,我们很容易看出这是一个指派问题,采用0-1规划。
那么巡检的路线怎么确定?当我们通过上一步得到对工作人员的场所分派后,我们再按照最短路(无向加权路)算法来确定巡检路线。
当我们确定好巡检路线后,巡检时间表也就确定了。由此我们可以总结出:对于复杂调度模型,我们可以挖掘调度的各个方面,找到核心调度,然后以此为基础,递进式的解决其他调度任务。
然后文章的细节部分我就不讲了,这里就给大家勾个轮廓,想看文章的在这里(积分我设置为0了,大家可以自由下载):
我主要讲讲我是怎么复现代码的:我的复现过程模拟了一下它的数据与约束条件,能够跑通,若欲完全复现修改添加真实数据即可。
注释中提到的处理关系: , i,j的起始索引为1。
test=randi(7,5,5);
constte=randi(7,5,5);
% test和constte都是模拟论文中的稀疏矩阵
x = optimvar('x',15,1,'Type','integer','LowerBound',0,'UpperBound',1);
% 在我的假设下,一共有3位工作人员,5个巡检点
obj = fcn2optimexpr(@objfunx,x,test);
%由于是目标函数和约束条件都不是基本初等函数,在写进模型之前需要用fcn2optimexp函数转化为优化表达
prob = optimproblem('Objective',obj,'ObjectiveSense','max');
%我这里约束条件只写了一组,只是示范用
con1=fcn2optimexpr(@cons_fun,x,2,constte)
prob.Constraints.cons1=con1>=4;
prob.Constraints.cons1=con1<=9;
x0.x =zeros(15,1); %%在使用solve函数求解模型之前,需指定x的初始值,否则报错
[sol,fval,exitflag,output] = solve(prob,x0)
fval
sol
function f = objfunx(x,test)
sum=0;
for k=1:3
for i=1:5
for j=1:5
sum=sum+test(i,j)*x(5*(k-1)+j)*x(5*(k-1)+i); %%这里有一个将二维坐标处理成一维
%%索引的处理
end
end
end
f=sum;
end
function f = cons_fun(x,k,constte) %%k代表第几个工作人员
k=1;
sum=0;
for i=1:4
for j=1:4
sum=sum+constte(i,j)*x(5*(k-1)+j)*x(5*(k-1)+i);
end
end
f=sum;
end