0

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

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

4

0 回答 0