You are on page 1of 4

clear all; close all; clc;

% PrevN = maxNumCompThreads
% LASTN = maxNumCompThreads(2);
% CurrN = maxNumCompThreads

fileID = fopen('./e_high_bonus.in','r');

formatSpec = '%c';
A = fgetl(fileID);
Firstline=str2num(A);
NumRows = Firstline(1);
NumCols = Firstline(2);
NumVehicles = Firstline(3);
NumRides = Firstline(4);
PerRideBonusPoints = Firstline(5);
NumSteps = Firstline(6);

Rides = struct('StartRow', [], 'StartCol',[],...


'FinishRow', [], 'FinishCol',[], 'EarliestStart', [], 'LatestFinish',[],...
'Distance' , [], 'RideIndex', []);
Distance= [];
for i = 1: NumRides
A = str2num(fgetl(fileID));
Rides(i).StartRow = A(1);
Rides(i).StartCol = A(2);
Rides(i).FinishRow = A(3);
Rides(i).FinishCol = A(4);
Rides(i).EarliestStart = A(5);
Rides(i).LatestFinish = A(6);
Rides(i).Distance = abs((Rides(i).FinishRow - Rides(i).StartRow) + ...
(Rides(i).FinishCol - Rides(i).StartCol));
Rides(i).RideIndex = i-1;
Distance = [Distance Rides(i).Distance];
end

VehicleStatus = struct('CurrentRow', [], 'CurrentCol',[], 'availability', [],...


'TimetoFree', []);

for i=1:NumVehicles
VehicleStatus(i).CurrentRow = 0;
VehicleStatus(i).CurrentCol = 0;
VehicleStatus(i).availability = 1;
VehicleStatus(i).TimetoFree = 0;
end

RideAssignment =struct('RidesAssigned', []);


for i=1 : NumVehicles
RideAssignment(i).RidesAssigned =0;
end

for i = 1: length(Rides)
RideStartTime(i) = Rides(i).EarliestStart;
end
[SortedRideStart , Index] = sort(RideStartTime, 'ascend');
RidesSorted = Rides(Index);
Rides = RidesSorted;

RideIndex=0;
for step = 0: NumSteps

for VehicleIndex = 1: NumVehicles


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%update the vehicle status
if (VehicleStatus(VehicleIndex).TimetoFree ~=0)
VehicleStatus(VehicleIndex).TimetoFree =
VehicleStatus(VehicleIndex).TimetoFree -1;
if(VehicleStatus(VehicleIndex).TimetoFree ==0)
VehicleStatus(VehicleIndex).availability = 1;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if(~isempty(Rides))
if(VehicleStatus(VehicleIndex).availability)
RideIndex = RideIndex +1;
RidesNotAssigned =1;
Rides(RideIndex).StartRow;
Rides(RideIndex).StartCol;
Rides(RideIndex).FinishRow;
Rides(RideIndex).FinishCol;
Rides(RideIndex).EarliestStart;
Rides(RideIndex).LatestFinish;
TimeNow = step;
%Time to arrive at the ride start
TimetoArriveatRideStart = abs((Rides(RideIndex).StartRow-
VehicleStatus(VehicleIndex).CurrentRow))...
+ abs((Rides(RideIndex).StartCol-
VehicleStatus(VehicleIndex).CurrentCol));
%Waiting time at destination
waitingTime = (Rides(RideIndex).EarliestStart -
(TimetoArriveatRideStart + TimeNow));
if(waitingTime<0)
waitingTime = 0;
end
TimeofRide = abs((Rides(RideIndex).FinishRow -
Rides(RideIndex).StartRow))...
+ abs((Rides(RideIndex).FinishCol -
Rides(RideIndex).StartCol));
TotalVehicleRideTime = TimetoArriveatRideStart + waitingTime +
TimeofRide;
if((TimeNow + TotalVehicleRideTime) <=
Rides(RideIndex).LatestFinish)
% disp('lets Schedule')
RideAssignment(VehicleIndex).RidesAssigned =
[RideAssignment(VehicleIndex).RidesAssigned Rides(RideIndex).RideIndex];
%delete the ride
VehicleStatus(VehicleIndex).CurrentRow =
Rides(RideIndex).FinishRow;
VehicleStatus(VehicleIndex).CurrentCol =
Rides(RideIndex).FinishCol;
VehicleStatus(VehicleIndex).TimetoFree = TotalVehicleRideTime
- TimeNow;
VehicleStatus(VehicleIndex).availability = 0;
Rides(RideIndex) = [];
Distance(RideIndex) = [];
RidesNotAssigned =0;
end
if(RidesNotAssigned ==1)

[MaxDistanceRide RideIndex] = min(Distance);


RidesNotAssigned =1;
Rides(RideIndex).StartRow;
Rides(RideIndex).StartCol;
Rides(RideIndex).FinishRow;
Rides(RideIndex).FinishCol;
Rides(RideIndex).EarliestStart;
Rides(RideIndex).LatestFinish;
TimeNow = step;
TimetoArriveatRideStart = abs((Rides(RideIndex).StartRow-
VehicleStatus(VehicleIndex).CurrentRow))...
+ abs((Rides(RideIndex).StartCol-
VehicleStatus(VehicleIndex).CurrentCol));
waitingTime = (Rides(RideIndex).EarliestStart -
(TimetoArriveatRideStart + TimeNow));
if(waitingTime<0)
waitingTime = 0;
end
TimeofRide = abs((Rides(RideIndex).FinishRow -
Rides(RideIndex).StartRow))...
+ abs((Rides(RideIndex).FinishCol -
Rides(RideIndex).StartCol));
TotalVehicleRideTime = TimetoArriveatRideStart + waitingTime +
TimeofRide;
if((TimeNow + TotalVehicleRideTime) <=
Rides(RideIndex).LatestFinish)
% disp('lets Schedule')
RideAssignment(VehicleIndex).RidesAssigned =
[RideAssignment(VehicleIndex).RidesAssigned Rides(RideIndex).RideIndex];
%delete the ride
VehicleStatus(VehicleIndex).CurrentRow =
Rides(RideIndex).FinishRow;
VehicleStatus(VehicleIndex).CurrentCol =
Rides(RideIndex).FinishCol;
VehicleStatus(VehicleIndex).TimetoFree =
TotalVehicleRideTime - TimeNow;
VehicleStatus(VehicleIndex).availability = 0;
Rides(RideIndex) = [];
Distance(RideIndex) = [];
RidesNotAssigned =0;
end
end
end

end

end
end

fclose(fileID);
WritefileID = fopen('./e_high_bonus.txt','w');
for i=1:length(RideAssignment)
NumRidesAssigned = length(RideAssignment(i).RidesAssigned) - 1;
RideAssignment(i).RidesAssigned(1) = NumRidesAssigned;
fprintf(WritefileID, [num2str(RideAssignment(i).RidesAssigned) '\n']);
end
fclose(WritefileID);

You might also like