ga优化之间共享变量约束条件和目标函数,以减少计算时间

11视图(30天)
我工作在一个使用遗传算法优化的优化问题。我有一个变量参与的目标函数与约束函数。这个变量是天,是约束问题以及导致成本,即目标函数。计算日子的函数变量是一个非常耗时的函数,并计算两次使程序需要近两倍。有什么方法我可以只有这个变量计算一次?
天涉及使用优化变量的计算,所以我不认为我可以计算它以外的功能,因为它变化作为优化变量的变化。
这是我的代码,有相当多的功能我没有分享,但我可以如果绝对必要。我不认为应该完全需要的代码工作,只是慢比我想要的,我相信这将减少。
据nvar = 2;
upperBounds = (10,10);
下界= [1];
intcon = 1:据nvar;
目录. . / HelperFunctions /
目录. . /焊接/
rng默认的%的再现性
全球输入unitCostLaborFile unitCostFile weldSpeedsFile;
输入= inputCaller ();
[unitCostLaborFile, unitCostLaborPath] = uigetfile (‘* .xlsx‘,选择文件与焊接单位劳动力成本的);
[unitCostFile, unitCostPath] = uigetfile (‘* .xlsx‘,“选择文件,焊接设备的单位成本”);
[weldSpeedsFile, weldSpeedsPath] = uigetfile (‘* .xlsx‘,“从WPS选择文件与焊接速度”);
%设置默认的解算器选项
选择= optimoptions (@ga,“PlotFcn”,{@gaplotbestf, @gaplotstopping});
选项。PopulationSize = 10;
%解决
有趣= @objectiveFcn;
(解决方案,objectiveValue exitflag、输出人口,分数)= ga(乐趣、据nvar[]、[][],[],下界,
upperBounds、@constraintFcn intcon选项);
%明显的变量
clearvars选项
填补=解决方案(1);
帽=解决方案(2);
成本= objectiveValue;
disp(人口(1:10,:));
disp(分数(1:10));
打印(填充、盖、成本投入,weldSpeedsFile);
函数f = objectiveFcn (optimInput)
% %的例子:
% %减少。海涅的功能
% % f = 100 * (y - x ^ 2) ^ 2 + (1 - x) ^ 2
%
% %编辑下面的线和你的计算
% x = optimInput (1);
% y = optimInput (2);
% f = 100 * (y - x ^ 2) ^ 2 + (1 - x) ^ 2;
全球输入unitCostLaborFile unitCostFile weldSpeedsFile;
%的输入变量
startDateInput = str2num(输入{1});
输入endDateInput = str2num ({2});
pipeSize = str2double(输入(3));
pipeThickness = str2double(输入(4));
焊缝= str2double(输入(5));
fillPasses = str2double(输入(6));
capPasses = str2double(输入(7));
workHours = str2double(输入(8));
走时= str2double(输入(9));
重量= str2double(输入(10));
过剩= str2double(输入(11));
进程= str2double(输入(12));
useTackRig = strcmp(输入(13),“真正的”);
paidHours =装天花板(workHours +走时);
startDateInput startDate可以= datetime (startDateInput (1), (2), startDateInput (3));
endDateInput endDate = datetime (endDateInput (1), (2), endDateInput (3));
formatIn =“dd-mmm-yyyy”;
最后期限= datenum (endDate)——datenum (startDate可以);
%成本变量
welderCost = calculateDailyWage (unitCostLaborFile,“PL_WELDR”,paidHours);
helperCost = calculateDailyWage (unitCostLaborFile,“PL_WH1”,paidHours);
laborerSkilledCost = calculateDailyWage (unitCostLaborFile,“PL_LAB1”,paidHours);
stabberCost = calculateDailyWage (unitCostLaborFile,“PL_ST”,paidHours);
spacerO16Cost = calculateDailyWage (unitCostLaborFile,“PL_SO16”,paidHours);
spacerU16Cost = calculateDailyWage (unitCostLaborFile,“PL_SU16”,paidHours);
operatorCost = calculateDailyWage (unitCostLaborFile,“PL_OP1”,paidHours);
foremanCost = calculateDailyWage (unitCostLaborFile,“PL_FM1”,paidHours);
strawBossCost = calculateDailyWage (unitCostLaborFile,“PL_SB1”,paidHours);
clampmanCost = calculateDailyWage (unitCostLaborFile,“PL_CL”,paidHours);
qaqcCost = calculateDailyWage (unitCostLaborFile,“QA_SR1”,paidHours);
pipelayerModel = determinePipelayer(重量、过剩);
equipmentMap = ExcelToMapObj (unitCostFile, 1:3);
pipelayerCost = workHours * equipmentMap (pipelayerModel) .UnitCost;
tackRigCost = workHours * equipmentMap (“RTCKRIG”).UnitCost;
truckPickupCost = paidHours * equipmentMap (“PU02”).UnitCost;
truckCrewCabDeckCost = paidHours * equipmentMap (“CC03”).UnitCost;
clampCost = workHours * equipmentMap (“RCLMP20”).UnitCost;
贷款= 175;
%确定所需的间距器/类型
如果(pipeSize < 16)
逆电流器= 1;
spacerCost = spacerU16Cost;
其他的
逆电流器= 2;
spacerCost = spacerO16Cost;
结束
%确定所需的预热劳动者数量
如果(月(startDate可以)> = 10 | |月(startDate可以)< = 4)
preheatLaborers = 3;
其他的
preheatLaborers = 1;
结束
如果(useTackRig = = true)
tackRig = 1;
管工= 1;
其他的
tackRig = 0;
管工= 2;
结束
otherCrew = 4 +逆电流器+管工+ tackRig +进程;%稻草,工头,锥子,clampman = 4
hoursWelding = paidHours - 1.75;% 1.75 = 0.5午餐,0.5咖啡,早上0.75设置/会议
averageTimeBetweenPasses = 3;%敏
%的优化变量
填补= optimInput (1);
帽= optimInput (2);
welderPairs =填补+帽子+ 2;%假设一对根部焊道和热传递
%变量依赖于焊工
助手= welderPairs * 2;
劳动者=圆(welderPairs * 2/3 + preheatLaborers);
船员= welderPairs * 4 +劳动者+ otherCrew;
%确定所需的卡车数量(注意焊工和船员
%帮手带自己的卡车和工头,strawboss进程和质量
%小4 x4卡车):P
crewNeedTruck = otherCrew - 2 -进程+劳动者;
crewCabTrucks =装天花板(crewNeedTruck / 3);
pickupTrucks = 2 +进程;%工头和strawboss
%的天量根据焊工的数量和速度
%会
天= (welderTimeCons(焊接、填充、帽子、fillPasses capPasses, averageTimeBetweenPasses, weldSpeedsFile, pipeThickness, pipeSize) / hoursWelding);
%成本函数和不平等
f =天* (welderPairs * 2 * welderCost +助手* helperCost +劳动者* laborerSkilledCost
+ foremanCost + strawBossCost + stabberCost +逆电流器* spacerCost +进程* qaqcCost
+ clampmanCost + clampCost +管工* pipelayerCost + tackRig * tackRigCost +(管工+ tackRig) * operatorCost
+船员*贷款+ crewCabTrucks * truckCrewCabDeckCost + pickupTrucks * truckPickupCost);
结束
函数测查[c] = constraintFcn (optimInput)
% %的例子:
% %限制的解决方案
% % x ^ 2 + y ^ 2 < = 5
% % x ^ 2 + y ^ 2 > = 2
% % y = x ^ 3
%
% %编辑下面的线和你的计算
% %注意,如果没有不等式约束,指定c = []
% %注意,如果没有等式约束,指定测查= []
% x = optimInput (1);
% y = optimInput (2);
% c (1) = x ^ 2 + y ^ 2 - 5;
% c (2) = 2 - x ^ 2 - y ^ 2;
测查% = y - x ^ 3;
填补= optimInput (1);
帽= optimInput (2);
全球输入unitCostLaborFile unitCostFile weldSpeedsFile;
%的输入变量
startDateInput = str2num(输入{1});
输入endDateInput = str2num ({2});
pipeSize = str2double(输入(3));
pipeThickness = str2double(输入(4));
焊缝= str2double(输入(5));
fillPasses = str2double(输入(6));
capPasses = str2double(输入(7));
workHours = str2double(输入(8));
走时= str2double(输入(9));
paidHours =装天花板(workHours +走时);
startDateInput startDate可以= datetime (startDateInput (1), (2), startDateInput (3));
endDateInput endDate = datetime (endDateInput (1), (2), endDateInput (3));
最后期限= datenum (endDate)——datenum (startDate可以);
hoursWelding = paidHours - 1.75;% 1.75 = 0.5午餐,0.5咖啡,早上0.75设置/会议
averageTimeBetweenPasses = 3;%敏
天= (welderTimeCons(焊接、填充、帽子、fillPasses capPasses, averageTimeBetweenPasses, weldSpeedsFile, pipeThickness, pipeSize) / hoursWelding);
c =天-期限;
测查= [];
结束
谢谢你!

接受的答案

沃尔特·罗伯森
沃尔特·罗伯森 2021年6月3日
注意,这是一个错误假设成本函数总是运行在执行之前的非线性约束函数相同的输入,也是一个错误假设的非线性约束函数总是运行之前执行的成本函数相同的输入。ga()和fmincon()被允许运行成本函数和约束函数在任何顺序他们照顾。
特别是,fmincon()运行成本函数N + 1次函数N变量,没有运行的非线性约束。它为了做一个最初的梯度估计。ga()不做梯度估计,但它仍然需要N + 1评估为了创建一个初始单纯形。
在最初的阶段,在任何时候ga()和fmincon()可能运行的非线性约束函数连续几次,试图找到非线性不等式约束的内部边界,并试图找到非线性等式约束边界的边缘。一旦决定理解边界,然后传递到目标函数的值不一定一样的最后一个值传递给非线性约束函数:函数被允许看看表面,如果他们认为他们是在一个安全的区域,只是懒得核对与非线性约束如果新的点附近是最好的N + 1分,所以可能有用的更新梯度估计…
因为这些因素,计算使用共享变量的风险比起初听起来,所以记忆而不是更安全。

答案(1)

肖恩·德Wolski
肖恩·德Wolski 2021年6月3日
你所有的约束是简单的算术。我认为你可以解决这个更迅速和有效地为一个混合整数线性规划问题 intlinprog 。看看这个例子: 工厂、仓库、销售分配模型:Solver-Based - MATLAB和Simulink (mathworks.com)万博1manbetx
1评论
米伦命名为
米伦命名为 2021年6月4日
谢谢肖恩,这是整个项目的第一阶段,我们知道还有其他更快、更有效的方法去做这个简单的事情,但我们打算大大复杂化方程在接下来的几个月里,以及在长期实现机器学习软件,因此遗传算法的使用

登录置评。

类别

找到更多的在开始使用优化工具箱帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!