Clear Filters
Clear Filters

Optimization FlowShop Problem- Error Received

3 views (last 30 days)
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);
++

Accepted Answer

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

Sign in to comment.

More Answers (0)

Categories

Find more on Mathematics and Optimization in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!