RGV调度算法(三)--遗传算法

1、基于时间窗

https://wenku.baidu.com/view/470e9fd8b4360b4c2e3f5727a5e9856a57122693.html?_wkts_=1741880736197&bdQuery=%E7%8E%AF%E7%A9%BF%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95

2.2019年MathorCup高校数学建模挑战赛B题

2019-mathorcupB题-环形穿梭机调度模型(思路篇)_环形调度算法-优快云博客

2019年MathorCup数学建模B题环形穿梭车系统的设计与调度解题全过程文档及程序_2019-mathorcupb题-环形穿梭机调度模型-优快云博客

 

基于遗传算法的穿梭车调度主函数

function [time]=GA()
N=3;num=10;%每次迭代一个口货物的数量,染色体携带的基因个数
popsize=20; %初始种群大小
Generationnmax=20; %最大代数
pcrossover=0.8; %交配概率
pmutation=0.1;%变异概率
fitness=zeros(1,popsize);%%产生初始种群,两个矩阵
A_2=xlsread('A.xlsx');A_2(:,1)=A_2(:,1)+A_2(:,2);A_2(:,2)=A_2(:,1)-A_2(:,2);
A_2(:,1)=A_2(:,1)-A_2(:,2);A_2_ini=A_2;
population=[ceil(4+3*rand(100,4,popsize)),ceil(N*rand(100,6,popsize))];
for i=1:popsize
 population(52:100,2,i)=0;
 population(72:100,3,i)=0;
 population(52:100,8,i)=0;
 population(72:100,9,i)=0;
end%%迭代的时候用到的 population 信息,ini 为所有信息,raise 随着迭代不断上升,
best 为最优种群
population_ini=population;population_raise=[];scnew=zeros(num,10,popsize);
smnew=zeros(num,10,popsize);handle_waitbar=waitbar(0,'Please wait...');%%每次迭代10个
货物
for s=1:10
 start=10*s-9;
 the_end=10*s;%%每次迭代取 ini 对应的 10 行,population_part 的值每次都在变
 population_part_s=population_ini(start:the_end,:,:);
 A_2_part=A_2_ini(1:the_end,:);Generation=0;
while Generation<Generationnmax
 Generation=Generation+1;%%算 raise 后的适应度 
for i=1:popsize 
 fitness(i)=simulation([population_raise;population_part_s(:,:,i)],A_2_part,N);
end%给适应度函数加上一个大小合理的数以便保证种群适应值为正数
fitness=fitness';
valuemax=max(fitness);
fitness=(valuemax-fitness);
fsum=sum(fitness);
Pperpopulation=fitness/fsum;
cumsump=cumsum(Pperpopulation);
cumsump=cumsump';%%只对 part 进行交叉等操作
for j=1:2:popsize %选择操作
 seln=selection(cumsump); %交叉操作
 scro=crossover(population_part_s,seln,pcrossover);
 scnew(:,:,j)=scro(:,:,1);scnew(:,:,j+1)=scro(:,:,2); 
 smnew(:,:,j)=mutation(scnew(:,:,j),pmutation,N);
 smnew(:,:,j+1)=mutation(scnew(:,:,j+1),pmutation,N);
end%产生了新的种群,part
population_part_s=smnew;
end%%计算 raise 后的适应度
for i=1:popsize
 fitness(i)=simulation([population_raise();population_part_s(:,:,i)],A_2_part,N);
end
 [~,index]=min(fitness); population_raise(start:the_end,:)=population_part_s(:,:,index);
 waitbar(s/20,handle_waitbar)
end
close(handle_waitbar);time=simulation(population_raise,A_2_ini,N);
xlswrite('task.xlsx',population_raise);
end

 环形穿梭车调度过程

function 
[port_state,vehicle_state]=Fnc_update_state(task_assignment,task_information,port_state,veh
icle_state,vehicle_coordinate,in_coordinate,out_coordinate,N)
% vehicle_state 第一行代表 N 个运输车的状态,
%0 表示空闲%1 代表正在装货%2 代表正在运货%3 代表正在卸货
% 第二行代表货物来源于哪个进货口(编号 1-6),从开始装货到开始卸货此数值不为
0
% 第三行代表需要将货物送到哪个出货口(编号 1-7),从开始装货到开始卸货此数值
不为 0
% 第四行在运输车不处于 flag=1 或 3 时为 0,当 flag==1 或 3 时其数字代表装卸货剩余
的时间,本程序中由于取了 h=0.01
% 因为浮点数的判定条件问题所以取这个数字的范围为 0-100,每当进行一个 whlie 循
环 t 增加 0.1, 10s 对应 100 次循环
%%port_state 口的状态,列数为 6,6 个进货口
%%第一行代表每一个口下一个有待装箱的货物编号%%第二行代表这个货物由哪个运
输车负责%%第三行代表这个货物要送到哪个口
for i=1:N%%如果空闲则满足一定条件变成装货
 if(vehicle_state(1,i)==0) 
 %%检测第 i 个车是否到达对应进货口,如果已经到达进货口则进行装箱,
 %%并将小车状态改为正在装货,记录起始地和目的地,并将等待时间置 100.
 %%0.15=0.1*1.5,代表进货出货区间
 delta=vehicle_coordinate(i)-in_coordinate;%index 代表哪个进货口
 index=find((0<delta)&(delta<=0.15));%有空闲的运输车到达进货口
 if(~isempty(index))
 if port_state(2,index)==i
 vehicle_state(1,i)=1; vehicle_state(2,i)=index;
 vehicle_state(3,i)=port_state(3,index); vehicle_state(4,i)=100; 
 end
 end
%%如果在装货,则时间减一,如果减一后为 0,变为运货状态,此时进货口的状态进行
更新,
 %%货物信息进行移位
 elseif(vehicle_state(1,i)==1)
 vehicle_state(4,i)=vehicle_state(4,i)-1;
 if(vehicle_state(4,i)==0)
 vehicle_state(1,i)=2;index=vehicle_state(2,i); %%当有一个货物完成装货后,对应 port 货物编号+1,并更新对应 port 信息
 port_state(1,index)=port_state(1,index)+1;
 port_state(2,index)=task_assignment(port_state(1,index),index);
 port_state(3,index)=task_information(port_state(1,index),index);
 end
%%处于运货状态时,检测第 i 个车是否到达对应出货口,如果已经到达出货口进行卸货
%%小车状态改为卸货,并将时间置 1000
 elseif(vehicle_state(1,i)==2)
 delta=vehicle_coordinate(i)-out_coordinate;
 index=find((0<delta)&(delta<=0.15));
 if(~isempty(index))
 if vehicle_state(3,i)==index
 vehicle_state(1,i)=3; vehicle_state(4,i)=100; 
 end
end%%如果在卸货,则时间减一,如果减一后为 0,变为空闲状态,并清空该
车的进货口和出货口信息
 elseif(vehicle_state(1,i)==3)
 vehicle_state(4,i)=vehicle_state(4,i)-1;
 if(vehicle_state(4,i)==0)
 vehicle_state(1,i)=0; vehicle_state(2,i)=0; vehicle_state(3,i)=0; 
 end 
 end
end
end

《餐馆点餐管理系统——基于Java和MySQL的课程设计解析》 在信息技术日益发达的今天,餐饮行业的数字化管理已经成为种趋势。本次课程设计的主题是“餐馆点餐管理系统”,它结合了编程语言Java和数据库管理系统MySQL,旨在帮助初学者理解如何构建个实际的、具有基本功能的餐饮管理软件。下面,我们将深入探讨这个系统的实现细节及其所涉及的关键知识点。 我们要关注的是数据库设计。在“res_db.sql”文件中,我们可以看到数据库的结构,可能包括菜品表、订单表、顾客信息表等。在MySQL中,我们需要创建这些表格并定义相应的字段,如菜品ID、名称、价格、库存等。此外,还要设置主键、外键来保证数据的致性和完整性。例如,菜品ID作为主键,确保每个菜品的唯性;订单表中的顾客ID和菜品ID则作为外键,与顾客信息表和菜品表关联,形成数据间的联系。 接下来,我们来看Java部分。在这个系统中,Java主要负责前端界面的展示和后端逻辑的处理。使用Java Swing或JavaFX库可以创建用户友好的图形用户界面(GUI),让顾客能够方便地浏览菜单、下单。同时,Java还负责与MySQL数据库进行交互,通过JDBC(Java Database Connectivity)API实现数据的增删查改操作。在程序中,我们需要编写SQL语句,比如INSERT用于添加新的菜品信息,SELECT用于查询所有菜品,UPDATE用于更新菜品的价格,DELETE用于删除不再提供的菜品。 在系统设计中,我们还需要考虑些关键功能的实现。例如,“新增菜品和价格”的功能,需要用户输入菜品信息,然后通过Java程序将这些信息存储到数据库中。在显示所有菜品的功能上,程序需要从数据库获取所有菜品数据,然后在界面上动态生成列表或者表格展示。同时,为了提高用户体验,可能还需要实现搜索和排序功能,允许用户根据菜品名称或价格进行筛选。 另外,安全性也是系统设计的重要。在连接数据库时,要避免SQL注入攻击,可以通过预编译的PreparedStatement对象来执行SQL命令。对于用户输入的数据,需要进行验证和过滤,防止非法字符和异常值。 这个“餐馆点餐管理系统”项目涵盖了Java编程、数据库设计与管理、用户界面设计等多个方面,是个很好的学习实践平台。通过这个项目,初学者不仅可以提升编程技能,还能对数据库管理和软件工程有更深入的理解。在实际开发过程中,还会遇到调试、测试、优化等挑战,这些都是成长为专业开发者不可或缺的经验积累
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值