Index in position 1 is invalid. Array indices must be positive integers or logical values. Error in PROYEK (line 78) distance = jarak_pelanggan(last_point, pelanggan_
1 次查看(过去 30 天)
显示 更早的评论
% 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
0 个评论
回答(1 个)
Pramil
2023-6-15
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
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Debugging and Analysis 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!