Clear Filters
Clear Filters

Index in position 1 is invalid. Array indices must be positive integers or logical values. Error in PROYEK (line 78) distance = jarak_pela​nggan(last​_point, pelanggan_

2 views (last 30 days)
% Data jarak antara gudang dan pelanggan
jarak_gudang_pelanggan = [5, 10, 15, 20];
% Data jarak antar pelanggan
jarak_pelanggan = [5, 10, 15, 20;
10, 0, 12, 25;
15, 12, 0, 18;
20, 25, 18, 0];
% Data kapasitas kendaraan
kapasitas_kendaraan = 30;
% Data permintaan pelanggan
permintaan = [5, 10, 15, 5];
% Data waktu perjalanan, waktu loading/unloading, dan waktu transaksi
waktu_perjalanan = [5, 5, 8, 10];
waktu_loading_unloading = 5;
waktu_transaksi = [5, 3, 4, 2];
% Definisi kapasitas waktu
kapasitas_waktu = 60;
% Metode Clarke and Wright Saving Heuristic
% 1) Menghitung nilai matriks penghematan jarak
matriks_penghematan_jarak = zeros(size(jarak_pelanggan));
for a = 2:numel(permintaan)
for b = 2:numel(permintaan)
if a ~= b
Coa = jarak_gudang_pelanggan(a);
Cbo = jarak_gudang_pelanggan(b);
Cab = jarak_pelanggan(a, b);
Sab = Coa + Cbo - Cab;
matriks_penghematan_jarak(a, b) = Sab;
end
end
end
% 2) Mengurutkan pasangan pelanggan berdasarkan penghematan jarak
[a_indices, b_indices] = find(matriks_penghematan_jarak);
[~, sorted_indices] = sort(matriks_penghematan_jarak(a_indices + (b_indices-1)*size(matriks_penghematan_jarak, 1)), 'descend');
a_indices = a_indices(sorted_indices);
b_indices = b_indices(sorted_indices);
% 3) Membuat rute pertama
rute_awal = 1:numel(permintaan);
% 4) Memilih kombinasi pelanggan dengan penghematan jarak terbesar
for i = 1:numel(a_indices)
a = a_indices(i);
b = b_indices(i);
% 5) Melakukan uji kelayakan rute dengan menghitung total volume permintaan dan total waktu penyelesaian
rute_baru = [rute_awal(a), rute_awal(b)];
total_volume = sum(permintaan(rute_baru));
total_waktu = waktu_perjalanan(rute_baru(1)) + sum(waktu_transaksi(rute_baru)) + (numel(rute_baru) - 1) * waktu_perjalanan(1) + (numel(rute_baru) - 1) * waktu_loading_unloading;
if total_volume <= kapasitas_kendaraan && total_waktu <= kapasitas_waktu
break;
end
end
% 6) Memasukkan pelanggan terpilih ke dalam rute
rute_awal([a, b]) = [];
rute_distribusi = [0, rute_baru, rute_awal, 0];
% Metode Nearest Neighbour
% 1) Menjadikan gudang sebagai titik awal
rute_nearest_neighbour = [0];
% Metode Nearest Neighbour (lanjutan)
pelanggan_tersedia = 2:numel(permintaan);
% 2) Mencari pelanggan terdekat yang belum dikunjungi
while ~isempty(pelanggan_tersedia)
last_point = rute_nearest_neighbour(end);
min_distance = inf;
next_point = -1;
for i = 1:numel(pelanggan_tersedia)
distance = jarak_pelanggan(last_point, pelanggan_tersedia(i));
if distance < min_distance
min_distance = distance;
next_point = pelanggan_tersedia(i);
end
end
rute_nearest_neighbour = [rute_nearest_neighbour, next_point];
pelanggan_tersedia(pelanggan_tersedia == next_point) = [];
end
% Menghitung jarak total rute untuk masing-masing rute
% Menghitung jarak total untuk rute distribusi menggunakan metode Clarke and Wright Saving Heuristic
jarak_total_cw = calculateTotalDistance(rute_distribusi, jarak_pelanggan);
% Menghitung jarak total untuk rute distribusi menggunakan metode Nearest Neighbour
jarak_total_nn = calculateTotalDistance(rute_nearest_neighbour, jarak_pelanggan);
% Menampilkan hasil
disp('Rute distribusi usulan menggunakan metode Clarke and Wright Saving Heuristic:')
disp(rute_distribusi)
disp('Jarak total rute menggunakan metode Clarke and Wright Saving Heuristic:')
disp(jarak_total_cw)
disp('Rute distribusi usulan menggunakan metode Nearest Neighbour:')
disp(rute_nearest_neighbour)
disp('Jarak total rute menggunakan metode Nearest Neighbour:')
disp(jarak_total_nn)
% Fungsi untuk menghitung jarak total rute
function total_distance = calculateTotalDistance(rute, jarak_pelanggan)
total_distance = 0;
for i = 1:numel(rute)-1
start = rute(i);
finish = rute(i+1);
total_distance = total_distance + jarak_pelanggan(start, finish);
end
end

Answers (1)

Pramil
Pramil on 15 Jun 2023
last_point here contains a value of 0 when the code runs and matlab indexing starts with 1, hence the error :
while ~isempty(pelanggan_tersedia)
last_point = rute_nearest_neighbour(end);
min_distance = inf;
next_point = -1;
for i = 1:numel(pelanggan_tersedia)
%Here in the first argument last_point is zero
distance = jarak_pelanggan(last_point, pelanggan_tersedia(i));
if distance < min_distance
min_distance = distance;
next_point = pelanggan_tersedia(i);
end
end
rute_nearest_neighbour = [rute_nearest_neighbour, next_point];
pelanggan_tersedia(pelanggan_tersedia == next_point) = [];
end

Categories

Find more on Debugging and Analysis in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!