【指派问题】基于matlab遗传算法求解指派优化问题【含Matlab源码 2292期】

⛄一、遗传算法求解指派优化问题简介

1 遗传算法
1.1 遗传算法简介

遗传算法是模拟生物在自然环境中的遗传和进化过程而形成的一种自适应全局优化概率搜索算法,它是一种多学科融合交叉的产物。遗传算法通过合理的编码机制和进化机制,广泛应用于近似最优化、生产调度、图形分割及自动控制等领域。

1.2 遗传算法基本步骤
(1)初始化。设置初始种群、最大迭代次数及迭代计数器。
(2)适应度评价。对当前种群计算其个体适应度。
(3)进化操作。主要是通过选择、交叉、变异、倒位等算子作用产生下一代群体。
(4)终止条件判断。如果已经求得最优解,则终止;否则重复以上两个步骤。

2 指派问题的遗传算法实现
2.1 指派问题模型描述

人们日常生活和工作中,经常会遇到这类问题:有n个任务需要n个人去完成,每个人完成每个任务的效率不尽相同,要求一个人只能完成其中一个任务,一个任务只能由一个人完成。要求合理分配之后,所达到的总体效率最好,这就是指派问题。

那么,根据优化模型理论,当目标为极大值时,指派问题的数学模型[3]如下:

其中,当指派第i个人去完成第j个任务时,xij=1;否则xij=0。cij表示第i个人去完成第j个任务的效率;约束条件(2)表示:第i个人只能完成一项任务;约束条件(3)表示:第j个任务只能由一个人完成。

2.2 指派问题的遗传算法设计
遗传算法设计是完成遗传运算的具体方法,涵盖了决策变量的基因型与表现型之间的编码和解码,个体适应度函数构造,遗传算子构建,控制参数设置等过程。

2.2.1 指派问题适应度函数
针对指派问题在求解目标函数为极大值时的情况和考虑指派问题可行解的非负性前提下,其个体适应度与目标函数值是成正比。因此,指派问题的适应度函数构建为如下所示:
在这里插入图片描述
其中,xij表示第i个人是否去做第j个任务。cij表示第i个人完成第j个任务的效率。

F越大,表示个体适应度越好,其可行解越好,能够以较大概率遗传到下一代。当F取值最大时,则表示已经达到最优解。

2.2.2 指派问题染色体编码
染色体[编码质量是影响遗传算法计算效率和准确度的重要因素。考虑到指派问题的特殊约束性质:即每人只能完成其中一个任务且每个任务只能由一人完成。针对决策变量xij的取值,其基因型编码不采取通常的0-1二进制编码,而采用常用的十进制编码。并且,每个基因块只有两个基因位,分别表示决策变量的行下标取值和列下标取值。当问题规模为n时,则指派问题决策变量染色体编码表示为:
在这里插入图片描述
在这种染色体编码十进制表示方式下,对于每个个体,其染色体的n个基因块在处理时按照如下规则进行:

(1)各代群体每个染色体中各基因块第一位分别赋予固定值:范围为0到n-1,即R11=0,R21=1,…Rn1=n-1。其目的是保证决策变量选取位于不同行。

(2)各代群体每个染色体中各基因块第二位分别赋予无重复随机值:范围为0到n-1,即R12、R22…Rn2每次取0到n-1的随机全排列值。目的是保证决策变量选取位于不同列。

通过这种方式进行指派问题染色体编码,可以只对基因块中第二位编码进行随机产生,提高了搜索效率。同时,由于是十进制编码,各个基因块的值组合可以直接定位于效率矩阵中的对应元素位置,加快运算效率。

2.2.3 指派问题遗传算子改进策略
一般情况下,遗传算法遗传过程和进化过程主要是通过选择、交叉、变异及倒位等遗传算子组合运算完成群体迭代。考虑指派问题组合优化的特殊性:即可行解必须位于不同行不同列,已在决策变量染色体编码中进行了约束限制,那么,在遗传进化过程中,无需再对种群群体进行变异操作和倒位操作。

因此,通过优化染色体编码,在遗传进化过程中仅通过选择和交叉策略实现种群迭代,有效地提高了运算效率,加快了最优解的获得。

⛄二、部分源代码

clc
clear all
n=input(‘请输入任务数’);
m=input(‘请输入工人数’);%可用人员数
maxgen=input(‘请输入最大代数’);
pop=10;%初始种群规模
pc=0.8;%发生交叉的概率
pm=0.8;%变异的概率
gen=0;
A=xiaolv(n,m);
C=chushi(pop,m);
pop1=jiaohuan(C,pop,m,pc);
popnew=bianyi2(pop1,pop,m,pm);
J1=zeros(2,maxgen);
J2=zeros(maxgen,m);
while gen<maxgen
gen=gen+1;
D=fitness(A,m,popnew);
[FY,JY]=xunyou(D,popnew);%找出最优解
J1(1,gen)=gen;
J1(2,gen)=JY;
J2(gen,:)=FY;
C=sel(pop,D,popnew);
pop1=jiaohuan(C,pop,m,pc);
popnew=bianyi2(pop1,pop,m,pm);
end
F=find(J1(2,:)==min(J1(2,:)));
fprintf(‘最小费用%d\n’,min(J1(2,:)))
disp(‘指派方案’)
Z=J2(F(1)😅;
for i=1:m
if i<=n
fprintf(‘第%d个人完成第%d个任务\n’,Z(1,i),i)
else
fprintf(‘第%d个人无任务\n’,Z(1,i))
end
end
X=J1(1,:);
Y=J1(2,:);
scatter(X,Y,‘.b’)
xlabel(‘代数’)
ylabel(‘最小费用之和’)
title(‘指派问题收敛图’)

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]齐安智.一种遗传算法求解指派问题的改进策略[J].价值工程. 2013,32(04)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
指派问题是一种优化问题,旨在找到一个最佳的分配方案,使得总体成本或者总体收益最大化。在Matlab中,可以使用线性规划函数linprog来求解指派问题。下面是一个示例的Matlab代码,用于求解0-1规划的指派问题: ```matlab function \[y,fval\]=zhipai(C) % C为指派n*n系数矩阵 C=C'; f=C(:); % 生成一个列向量,作为目标函数系数,Matlab默认以列排序 \[m,n\]=size(C); Aeq=zeros(2*n,n*n); % 2*n个等式约束,n*n个变量 % 生成后四个等式约束的左端项 for i=1:n Aeq(1:n,1+(i-1)*n:i*n)=eye(n,n); end % 生成前四个等式约束的左端项 for i=1:n Aeq(i+n,1+(i-1)*n:i*n)=ones(1,n); end beq=ones(2*n,1); lb=zeros(n*n,1); ub=ones(n*n,1); % 使用线性规划函数求解 x=linprog(f',\[\],\[\],Aeq,beq,lb,ub); % 将求解结果转换为n阶矩阵 y=reshape(x,n,n); y=y'; % 生成的是按列排列的,所以转置一下 y=round(y); % 对y元素取整,生成匹配矩阵 sol=zeros(n,n); for i=1:n for j=1:n if y(i,j)==1 sol(i,j)=C(j,i); % 匹配矩阵 end end end fval=sum(sol(:)); % 极小值的目标函数值 end ``` 这段代码实现了一个0-1规划的指派问题求解函数。你可以将指派问题的系数矩阵作为输入参数传递给这个函数,它将返回最优的分配方案和目标函数值。 #### 引用[.reference_title] - *1* [matlab 0-1规划求解指派问题](https://blog.csdn.net/ouzuosong/article/details/52236152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海神之光

有机会获得赠送范围1份代码

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值