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

如何防止matlab中的多变量优化只将一个变量最大化到上限,以最小化其他变量,matlab,optimization,minimization,cost-based-optimizer,Matlab,Optimization,Minimization,Cost Based Optimizer,我们目前正在进行一个项目,该项目要求通过优化项目所用的焊工数量以及项目所需的天数,将焊接项目的成本降至最低。我们目前遇到一个问题,即使用的焊工数量将是无限的,并且始终等于我们设定的上限。下面是我们正在优化的等式,以及约束和对fmincon()的调用 我们最希望该等式能够在天数和焊工之间找到最佳平衡,而不仅仅是尽可能增加焊工数量。我们是否以错误的方式进行优化,是否有更好的方法? 最理想的情况是,我们希望能够将这些变量设置为整数,就我所知,如果没有MATLABs全局优化工具箱,这是无法做到的,但我们

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

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天,这显然是不现实的),为了使天数尽可能小

解决
天数的约束
并代入目标函数,经过一些代数运算后,目标函数是
f=C1*(C2+1/焊工)
,其中常数C1和C2取决于您列出的所有成本。该函数随着焊接工的增加而单调减小,因此对于焊接工=inf,具有全局最小值
C1*C2
。如果焊工数量受到限制,则函数的最小值为焊工的最大值。@JAC您知道解决此问题的方法吗,或者您是否认为这将永远是此等式的固有问题。我们的目标是,该计划试图在合理的值内优化这两个变量。我们希望成本尽可能低,同时努力平衡天数/焊工(不是让他们相等,而是试图找到两者理论上最小化的点),但是,仅仅是最大限度地增加焊工并不是特别有用,因为焊接的回报是递减的,而我们并没有一个好的建模方法。@JadonLata问题是,无论是目标函数还是约束都没有显示增加更多焊工的回报递减。作为显示递减回报的示例:假设约束中的
eff
是焊工的效率,递减回报将显示该系数是否不是常数,而是随着焊工数量的增加而减少。@JAC相信我,我知道,我希望我能对递减回报建模,但是我们没有任何形式的效率数值。我们几乎不得不从我们公司完成的几个项目中得出一些平均值,但很难确定任何形式的递减回报,因为没有关于焊工多少会影响效率的实验/数据收集。所以我们希望我们能以平均效率优化它。也许我们使用了错误的优化形式来实现我们想要的?我不确定。