如何防止matlab中的多变量优化只是将一个变量最大化到上限以最小化其他变量

问题描述

我们目前正在开展一个项目,该项目需要通过优化用于项目的焊工数量以及项目所需的天数来最大限度地降低焊接项目的成本。我们目前遇到了一个问题,即所使用的焊工数量将达到无穷大,并且将始终等于我们设置的任何上限。这是我们正在优化的方程,以及约束和对 fmincon() 的调用 我们最希望通过方程找到天数和焊工之间的最佳平衡,而不仅仅是尽可能增加焊工数量。我们是否以错误的方式进行这种优化,有没有更好的方法? 最佳情况下,我们希望能够将这些变量设置为整数,据我所知,如果没有 MATLAB 全局优化工具箱就无法做到这一点,但我们不确定我们正在做的其他方面是否可行在该工具箱的范围内。遗憾的是,由于项目资金,我们很可能只能永久访问 2 个工具箱之一,因此我们想知道什么是可能的,以及我们如何最适合进行这项工作。

clear;
clc;

x0 = [0 0];

% Possible Inputs %
deadline = 30;

upperBounds = [15 deadline];

% Set nondefault solver options
options = optimoptions('fmincon','PlotFcn','optimplotfvalconstr');

% Solve
[solution,objectiveValue] = fmincon(@objectiveFcn,x0,[],...
    zeros(size(x0)),upperBounds,@constraintFcn,options);

% Clear variables
clearvars options

clc;
disp(solution);
disp(objectiveValue);

function f = objectiveFcn(optimInput)
% inputs but for Now temp values
workHours = 10;
paidHours = 11;
weight = 15000;
overhang = 6;
qaqc = 2; 

welderCost = 523.41;
helperCost = 467.32;
laborerSkilledcost = 467.32;
stabberCost = 450.87;
spacerO16Cost = 450.87;
operatorCost = 576.98;
foremanCost = 756.76;
strawBossCost = 643.35;
clampmanCost = 450.87;
qaqcCost = 678.24;


pipelayerCost = workHours * 124.54;
LOA = 175;

welders = optimInput(1);
days = optimInput(2);
constcrew = 8; % straw,foreman,2spacers,stabber,clampman,2operators
f = days*(welders * welderCost + welders * helperCost + (welders/3) * laborerSkilledcost...
    + foremanCost + strawBossCost + stabberCost + 2*spacerO16Cost + qaqc*qaqcCost...
    + clampmanCost + 2*pipelayerCost + 2*operatorCost + (welders*2 + constcrew + (welders/3) + qaqc)*LOA);
end

function [c,ceq] = constraintFcn(optimInput)
% Note,if no inequality constraints,specify c = []
% Note,if no equality constraints,specify ceq = []
eff = 5; 
welds = 1000;

welders = optimInput(1);
days = optimInput(2);
c = [];
ceq = (welders*days*eff) - welds;
end

运行此程序将始终为您提供最多 15 名焊工,同时尽可能缩短天数(在本场景中为 13.3333)。如果我们解除对焊工的限制,它会将其放入 10000 名焊工中(将永远运行,我们可以将下限设置为 1 天,但它只会将天数最小化为 1,这显然不接近现实),只是为了尽可能缩短日子

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)