Optimization FlowShop Problem- Error Received

3 次查看(过去 30 天)
I have the following code for a flow shop problem.
In the following part
[optimalSequence, minMaxTardiness] = fmincon(objectiveFunction, initialSequence, A, b, Aeq, beq, lb, ub, [], options);
I get the following error. But the lb is basically a matrix on 1x20 with "1" and ub is the same with "20".
These are also reflected in the matlab data. Thanks for the help.
ERROR
Initial point X0 is not between bounds LB and UB;
FMINCON shifted X0 to strictly satisfy the bounds.
Unrecognized function or variable 'numJobs'.
completionTimes = zeros(numMachines, numJobs);
objectiveFunction = @(sequence) calculateMaxTardinessWithSequence(sequence, processingTimes, dueTimes, sequenceDependentSetupTimes, numMachines);
Error in fmincon (line 563)
initVals.f = feval(funfcn{3},X,varargin{:});
Caused by:
Failure in initial objective function evaluation. FMINCON cannot continue.
CODE
++
clc; clear all; close all;
% Number of machines and jobs
numMachines = 5;
numJobs = 20;
% Generate random processing times for jobs on machines
processingTimes = randi([1, 10], numMachines, numJobs);
% Generate random due times for each job
dueTimes = randi([20, 30], 1, numJobs);
% Generate random sequence-dependent setup times between products
sequenceDependentSetupTimes = randi([1, 5], numJobs-1, 1);
% Objective function for fmincon
objectiveFunction = @(sequence) calculateMaxTardinessWithSequence(sequence, processingTimes, dueTimes, sequenceDependentSetupTimes, numMachines);
% Initial guess (random permutation of jobs)
initialSequence = randperm(numJobs);
% Bounds for the decision variables (permutations of jobs)
lb(1: numJobs) = 1;
ub(1: numJobs) = numJobs;
% Constraints (none in this case)
A = [];
b = [];
Aeq = [];
beq = [];
% Use fmincon to minimize the objective function
options = optimoptions('fmincon', 'Display', 'iter', 'MaxIterations', 1000);
[optimalSequence, minMaxTardiness] = fmincon(objectiveFunction, initialSequence, A, b, Aeq, beq, lb, ub, [], options);
% Display the results
disp(['Optimal Sequence: ', num2str(optimalSequence)]);
disp(['Minimum Max Tardiness: ', num2str(minMaxTardiness)]);
% Function to calculate max tardiness with given sequence
function maxTardiness = calculateMaxTardinessWithSequence(sequence, processingTimes, dueTimes, setupTimes, numMachines)
completionTimes = zeros(numMachines, numJobs);
lostTimeDueToSetups = 0;
% Calculate completion times for each job on each machine based on the given sequence
for j = 1:numJobs
for i = 1:numMachines
currentJob = sequence(j);
if j == 1
if i == 1
completionTimes(i, currentJob) = processingTimes(i, currentJob);
else
completionTimes(i, currentJob) = completionTimes(i - 1, currentJob) + processingTimes(i, currentJob) + setupTimes(currentJob - 1);
lostTimeDueToSetups = lostTimeDueToSetups + setupTimes(currentJob - 1);
end
else
if i == 1
completionTimes(i, currentJob) = completionTimes(i, sequence(j - 1)) + processingTimes(i, currentJob);
else
completionTimes(i, currentJob) = max(completionTimes(i, sequence(j - 1)), completionTimes(i - 1, currentJob)) + processingTimes(i, currentJob);
end
end
end
end
% Calculate tardiness for each job
tardiness = zeros(1, numJobs);
for j = 1:numJobs
tardiness(j) = max(0, completionTimes(numMachines, j) - dueTimes(j));
end
% Calculate maximum tardiness
maxTardiness = max(tardiness);
++

采纳的回答

Alan Weiss
Alan Weiss 2024-2-15
You don't pass numJobs into your calculateMaxTardinessWithSequence function:
function maxTardiness = calculateMaxTardinessWithSequence(sequence, processingTimes, dueTimes, setupTimes, numMachines)
Alan Weiss
MATLAB mathematical toolbox documentation
  1 个评论
Fatih
Fatih 2024-2-16
Thanks, it is my mistake. I also had another file with the same name and I was amending it. Now it works. thanks.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Mathematics and Optimization 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by