bei meiner Aufgabe handelt es sich um einen Supermarkt:
derzeit 2 Kassen für alle Kunden
• Geschäftsführung am überlegen, eine Expresskasse einzuführen
• Expresskasse für Kunden mit weniger als 5 Artikel
• Ankunftsrate
für normale Kunden exponentialverteilt mit Erwartungswert 3 Minuten
von ‚Expresskunden‘ ist exponentialverteilt mit Erwartungswert 5 Minuten
• Bedienzeit:
von normalen Kunden exponentialverteilt mit Erwartungswert 5 Minuten
von ‚Expresskunden‘ ist exponentialverteilt mit Erwartungswert 3 Minuten
• wie verändern sich die mittleren Schlangenlängen der einzelnen Kassen
bei den unterschiedlichen Strategien?
Ich als Anfänger hab leider einen einen sehr umfangreichen Code geschrieben und würde diesen irgendwie gerne vereinfachen und kürzen.
Vielleicht kann mir ja jemand helfen und vll sieht auch jemand einen Fehler, den ich übersehen habe.
Danke für eure Hilfe.
LG
Code:
% definition of the variables
openTime = 7:19; % open from 7:00 - 19:00 clock
simulationsTime = (openTime(end)-openTime(1))*60; % in minutes
expressCustomers_cum = 0; % cumulated arriving time of express customers
normalCustomers_cum = 0; % cumulated arriving time of normal customers
finalEndTimeCustomer_Cash1 = []; % end time of customers from cash 1
finalEndTimeCustomer_Cash2 = []; % end time of customers from cash 2
tempQueueEndTime_Cash1 = []; % end time of customers in the queue in front of cash 1
tempQueueEndTime_Cash2 = []; % end time of customers in the queue in front of cash 2
queue_Cash1 = 0; % queue cash 1, strategy without express cash
queue_Cash2 = 0; % queue cash 2, strategy without express cash
finalEndTimeCustomer_Cash1_Way2 = []; % end time of customers from cash 1, strategy 2, with express cash
finalEndTimeCustomer_Cash2_Way2 = []; % end time of customers from cash 2, strategy 2
finalEndTimeCustomer_CashExpress_Way2 = []; % end time of customers from express cash, strategy 2
tempQueueEndTime_Cash1_Way2 = []; % end time of customers in the queue in front of cash 1, strategy 2
tempQueueEndTime_Cash2_Way2 = []; % end time of customers in the queue in front of cash 2, strategy 2
tempQueueEndTime_CashExpress_Way2 = []; % end time of customers in the queue in front of express cash, strategy 2
queue_Cash1_Way2 = 0; % queue cash 1, strategy with express cash
queue_Cash2_Way2 = 0; % queue cash 2, strategy with express cash
queue_CashExpress_Way2 = 0; % queue express cash
ii = 0;
jj= 0;
isNormalCustomerTimeReady = 0; % variable if normal customer is ready
isExpressCustomerTimeReady = 0; % variable if express customer is ready
while(isNormalCustomerTimeReady == 0) || (isExpressCustomerTimeReady == 0) % calculation of the arrival times of the customers if isNormalCustomerTimeReady == 0 if(normalCustomers_cum(end) < simulationsTime)% while arrival time of normal customers is under simulation time
ii=ii+1; % index + 1
normalCustomers = (-3)*log(rand(1,1)); % arrival time of normal customers if ii == 1% if index = 1
normalCustomers_cum(ii,1) = normalCustomers; % cumulated arrival time of normal customer is the first arrival time else
normalCustomers_cum(ii,1) = (normalCustomers_cum(ii-1) + normalCustomers); % else we sum up the normal arrival times end else
isNormalCustomerTimeReady = 1; % normal customers have achieved the simulation time end end if isExpressCustomerTimeReady == 0 if(expressCustomers_cum(end) < simulationsTime)% while arrival time of express customers is under simulation time
jj=jj+1; % index + 1
expressCustomers = (-5)*log(rand(1,1)); % arrival time of express customers if jj == 1% if index = 1
expressCustomers_cum(jj,1) = expressCustomers; % cumulated arrival time of express customer is the first arrival time else
expressCustomers_cum(jj,1) = (expressCustomers_cum(jj-1) + expressCustomers); % else we sum up the express arrival times end else
isExpressCustomerTimeReady = 1; % express customers have achieved the simulation time end end end
% in the first coluum are the arrival times, in the second coluum are % the values 0 or 1
normalCustomers_cum(:,2) = zeros(length(normalCustomers_cum),1); % 0 for normal customers
expressCustomers_cum(:,2) = ones(length(expressCustomers_cum),1); % 1 for express customers
customersMatrix = [normalCustomers_cum;expressCustomers_cum]; % arrival time of both types of customers
customersMatrix = Function_Sort(customersMatrix); % sorting of the arrival times, with a function for sorting
% simulation for ii = 1:length(customersMatrix(:,1))% for 1 to length of custumers (all rows, so all arrival times) if customersMatrix(ii,2) == 1% if the incomming customer is an express customer
durationCash = (-3)*log(rand()); % calculation of the duration of the service time else% if the incomming customer is a normal customer
durationCash = (-5)*log(rand()); % calculation of the duration of the service time end % -------------------------------------------------------------------------------------------- % strategy without express cash % -------------------------------------------------------------------------------------------- % if new customer arrives, how many customers have now been serviced [queue_Cash1,tempQueueEndTime_Cash1] = Function4FlushQueue(customersMatrix(1:ii,1),queue_Cash1,tempQueueEndTime_Cash1);
[queue_Cash2,tempQueueEndTime_Cash2] = Function4FlushQueue(customersMatrix(1:ii,1),queue_Cash2,tempQueueEndTime_Cash2);
% choose the cash if queue_Cash1 <= queue_Cash2 % the customer choose the cash with the shorter queue, when both queues have the same length the customer choose cash 1 % cash 1 [finalEndTimeCustomer_Cash1,queue_Cash1,tempQueueEndTime_Cash1] = Function4CashWaitTime(customersMatrix(1:ii,1),finalEndTimeCustomer_Cash1,durationCash,queue_Cash1,tempQueueEndTime_Cash1);
else% queue at cash 2 is shorter % cash 2 [finalEndTimeCustomer_Cash2,queue_Cash2,tempQueueEndTime_Cash2] = Function4CashWaitTime(customersMatrix(1:ii,1),finalEndTimeCustomer_Cash2,durationCash,queue_Cash2,tempQueueEndTime_Cash2);
end
numbersQueue_Cash1(ii) = queue_Cash1; % length of queue cash 1 by customer ii
numbersQueue_Cash2(ii) = queue_Cash2; % length of queue cash 2 by customer ii
% -------------------------------------------------------------------------------------------- % strategy with express cash % -------------------------------------------------------------------------------------------- % if new customer arrives, how many customers have now been serviced [queue_Cash1_Way2,tempQueueEndTime_Cash1_Way2] = Function4FlushQueue(customersMatrix(1:ii,1),queue_Cash1_Way2,tempQueueEndTime_Cash1_Way2);
[queue_Cash2_Way2,tempQueueEndTime_Cash2_Way2] = Function4FlushQueue(customersMatrix(1:ii,1),queue_Cash2_Way2,tempQueueEndTime_Cash2_Way2);
[queue_CashExpress_Way2,tempQueueEndTime_CashExpress_Way2] = Function4FlushQueue(customersMatrix(1:ii,1),queue_CashExpress_Way2,tempQueueEndTime_CashExpress_Way2);
% choose the cash if customersMatrix(ii,2) == 0% normal customer if queue_Cash1_Way2 <= queue_Cash2_Way2 % the normal customer choose the cash with the shorter queue, when both queues have the same length the normal customer choose cash 1
chosenCash = 1; % cash 1 else% queue at cash 2 is shorter
chosenCash = 2; % cash 2 end else% express customer if(queue_CashExpress_Way2 <= queue_Cash1_Way2) && (queue_CashExpress_Way2 <= queue_Cash2_Way2)% is the shortest queue at the express cash, the express customer choose the expres cash
chosenCash = 3; % express cash elseif queue_Cash1_Way2 <= queue_Cash2_Way2 % is the queue at cash 1 shorter the express customer choose cash 1
chosenCash = 1; % cash 1 else% queue at cash 2 is shorter
chosenCash = 2; % cash 2 end end
if chosenCash == 1% if the choosen cash is cash 1 [finalEndTimeCustomer_Cash1_Way2,queue_Cash1_Way2,tempQueueEndTime_Cash1_Way2] = Function4CashWaitTime(customersMatrix(1:ii,1),finalEndTimeCustomer_Cash1_Way2,durationCash,queue_Cash1_Way2,tempQueueEndTime_Cash1_Way2);
elseif chosenCash == 2% if the choosen cash is cash 2 [finalEndTimeCustomer_Cash2_Way2,queue_Cash2_Way2,tempQueueEndTime_Cash2_Way2] = Function4CashWaitTime(customersMatrix(1:ii,1),finalEndTimeCustomer_Cash2_Way2,durationCash,queue_Cash2_Way2,tempQueueEndTime_Cash2_Way2);
else% if the choosen cash is the express cash [finalEndTimeCustomer_CashExpress_Way2,queue_CashExpress_Way2,tempQueueEndTime_CashExpress_Way2] = Function4CashWaitTime(customersMatrix(1:ii,1),finalEndTimeCustomer_CashExpress_Way2,durationCash,queue_CashExpress_Way2,tempQueueEndTime_CashExpress_Way2);
end
numbersQueue_Cash1_Way2(ii) = queue_Cash1_Way2; % length of queue cash 1 by customer ii
numbersQueue_Cash2_Way2(ii) = queue_Cash2_Way2; % length of queue cash 2 by customer ii
numbersQueue_CashExpress_Way2(ii) = queue_CashExpress_Way2; % length of queue express by customer ii end
fprintf('\n ------------------------------------------------------------------------------------------------------') fprintf('\nDie Simulationszeit beträgt %g Stunden, in dieser Zeit wurden %g Kunden bedient',simulationsTime/60,length(customersMatrix));
fprintf('\n\n1. Strategie: Zwei Kassen');
fprintf('\nDie durchschnittliche Länge der Warteschlange der ersten Kassa beträgt %.2g Personen',sum(numbersQueue_Cash1)/length(numbersQueue_Cash1));
fprintf('\nDie durchschnittliche Länge der Warteschlange der zweiten Kassa beträgt %.2g Personen',sum(numbersQueue_Cash2)/length(numbersQueue_Cash2));
fprintf('\n\n2. Strategie: Drei Kassen, eine nur für Expresskunden' );
fprintf('\nDie durchschnittliche Länge der Warteschlange der ersten Kassa beträgt %.2g Personen',sum(numbersQueue_Cash1_Way2)/length(numbersQueue_Cash1_Way2));
fprintf('\nDie durchschnittliche Länge der Warteschlange der zweiten Kassa beträgt %.2g Personen',sum(numbersQueue_Cash2_Way2)/length(numbersQueue_Cash2_Way2));
fprintf('\nDie durchschnittliche Länge der Warteschlange der express Kassa beträgt %.2g Personen\n',sum(numbersQueue_CashExpress_Way2)/length(numbersQueue_CashExpress_Way2));
end
function[finalEndTimeCustomer_Cash,queue_Cash,tempQueueEndTime_Cash] = Function4CashWaitTime(customersArrivalTime,finalEndTimeCustomer_Cash,durationCash,queue_Cash,tempQueueEndTime_Cash) % calculates the end time of the customer and increases the queue % input parameters: % customersArrivalTime --> vector of customer arrival times, only the first column % finalEndTimeCustomer_Cash --> vector of end times % durationCash --> duration of the cash % queue_Cash --> queue of the cash % tempQueueEndTime_Cash --> end time of customers in the queue in front of cash
% output parameters: % finalEndTimeCustomer_Cash --> vector of end times % queue_Cash --> queue of the cash % tempQueueEndTime_Cash --> end time of customers in the queue in front of cash
indexCash = length(finalEndTimeCustomer_Cash) + 1; % calculation of index if indexCash == 1% first customer
finalEndTimeCustomer_Cash(indexCash) = customersArrivalTime(end) + durationCash; % end time of customer = incomming time of customer + duration time of customer
waitTime_Customer_Cash = 0; % waiting time is 0 else% else (further customers)
finalEndTimeCustomer_Cash(indexCash) = max(finalEndTimeCustomer_Cash(indexCash-1),customersArrivalTime(end)) + durationCash; % maximum of end time(previous customer) or incomming time customer + duration time
waitTime_Customer_Cash = max((finalEndTimeCustomer_Cash(indexCash-1)-customersArrivalTime(end)),0); % waiting time is maximum of end time (previous customer) - incomming time customer or 0 end if waitTime_Customer_Cash > 0% is there a waiting time
queue_Cash = queue_Cash + 1; % queue + 1
tempQueueEndTime_Cash(queue_Cash) = finalEndTimeCustomer_Cash(indexCash-1); % remember the end time of the previous customer to know when the next customer starts end end
function[queue_Cash,tempQueueEndTime_Cash] = Function4FlushQueue(customersArrivalTime,queue_Cash,tempQueueEndTime_Cash) % deletes customers from the queue using the end times of the customers on the waiting list and the arrivals of new customers % input parameters: % customersArrivalTime --> vector of customer arrival times, only the first column % queue_Cash --> queue of the cash % tempQueueEndTime_Cash --> end time of customers in the queue in front of cash
% output parameters: % queue_Cash --> queue of the cash % tempQueueEndTime_Cash --> end time of customers in the queue in front of cash
if queue_Cash > 0% someone is in the queue
idxCustomerIsReadyInQueue = (customersArrivalTime(end) >= tempQueueEndTime_Cash); % what customers in queue are ready when the next customer arrives
queue_Cash = queue_Cash - sum(idxCustomerIsReadyInQueue); % all ready customers leave the queue
tempQueueEndTime_Cash(idxCustomerIsReadyInQueue) = []; % we set the time of the customer on the queue empty end end
function[Matrix2Sort] = Function_Sort(Matrix2Sort) % Sorting, sort by values in the first column % input parameter: % Matrix2Sort --> matrix with n rows and 2 columns (nx2)
% output parameter: % Matrix2Sort --> sorted matrix with n rows and 2 columns (nx2)
for hh = 1:length(Matrix2Sort)-1 for jj = length(Matrix2Sort):-1:hh+1% from the end of length of matrix sort, in one steps to hh + 1 if Matrix2Sort(jj,1) < Matrix2Sort(hh,1)% compare the arrival times of the last customer with the arrival times of the first customer
helpvar = Matrix2Sort(hh,:); % if the arrival time of the first customer is higher than the arrival time of the last customer put the first customer on the helpvariable that we do not lose the first customer
Matrix2Sort(hh,:) = Matrix2Sort(jj,:);% and the last customer put on the first position
Matrix2Sort(jj,:) = helpvar; % now take the customer which was the first customer before from the helpvariable and put it on the last position end end end end
Ich würde kürzere Namen für die Variablen verwenden. Bei "tempQueueEndTime_CashExpress_Way2" gruselt es mich. Ich würde "isNormalCustomerTimeReady" durch "readyNormal" ersetzen, denn es unterscheidet bereits deutlich "readyExpress".
In
Code:
function[Matrix2Sort] = Function_Sort(Matrix2Sort) % Sorting, sort by values in the first column % input parameter: % Matrix2Sort --> matrix with n rows and 2 columns (nx2)
% output parameter: % Matrix2Sort --> sorted matrix with n rows and 2 columns (nx2)
for hh = 1:length(Matrix2Sort)-1 for jj = length(Matrix2Sort):-1:hh+1% from the end of length of matrix sort, in one steps to hh + 1 if Matrix2Sort(jj,1) < Matrix2Sort(hh,1)% compare the arrival times of the last customer with the arrival times of the first customer
helpvar = Matrix2Sort(hh,:); % if the arrival time of the first customer is higher than the arrival time of the last customer put the first customer on the helpvariable that we do not lose the first customer
Matrix2Sort(hh,:) = Matrix2Sort(jj,:);% and the last customer put on the first position
Matrix2Sort(jj,:) = helpvar; % now take the customer which was the first customer before from the helpvariable and put it on the last position end end end end
wäre "M" genauso hilfreich wie "Matrix2Sort", aber es würde den Text viel einfacher lesbar machen. Man kann allerdings auch gleich Matlabs
sort
Funktion verwenden:
Code:
function M = SortColumn1(M) [~, index] = sort(M(:,1));
M = M(index, :);
end
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.