konsep dasar algoritma greedy
Konsep dasar algoritma Greedy
#include <stdlib.h>
typedef struct {
int index;
int waktuMulai;
int waktuSelesai;
int bobot;
} Tugas;
void tukar(Tugas *a, Tugas *b) {
Tugas temp = *a;
*a = *b;
*b = temp;
}
void urutBerdasarkanWaktuSelesai(Tugas tugas[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (tugas[j].waktuSelesai > tugas[j + 1].waktuSelesai) {
tukar(&tugas[j], &tugas[j + 1]);
}
}
}
}
void jadwalkanTugas(Tugas tugas[], int n) {
urutBerdasarkanWaktuSelesai(tugas, n);
int *terpilih = (int *)malloc(n * sizeof(int));
int jumlahTerpilih = 0;
terpilih[jumlahTerpilih++] = tugas[0].index;
int terpilihTerakhir = 0;
for (int i = 1; i < n; i++) {
if (tugas[i].waktuMulai >= tugas[terpilihTerakhir].waktuSelesai) {
terpilih[jumlahTerpilih++] = tugas[i].index;
terpilihTerakhir = i;
}
}
printf("Urutan Pelaksanaan Tugas untuk Keuntungan Maksimum:\n");
for (int i = 0; i < jumlahTerpilih; i++) {
printf("Tugas %d (Waktu Mulai: %d, Waktu Selesai: %d, Bobot: %d)\n",
tugas[terpilih[i]].index + 1, tugas[terpilih[i]].waktuMulai,
tugas[terpilih[i]].waktuSelesai, tugas[terpilih[i]].bobot);
}
free(terpilih);
}
int main() {
int n;
printf("Masukkan jumlah tugas: ");
scanf("%d", &n);
Tugas *tugas = (Tugas *)malloc(n * sizeof(Tugas));
printf("Masukkan waktu mulai, waktu selesai, dan bobot untuk setiap tugas:\n");
for (int i = 0; i < n; i++) {
tugas[i].index = i;
printf("Tugas %d: ", i + 1);
scanf("%d %d %d", &tugas[i].waktuMulai, &tugas[i].waktuSelesai, &tugas[i].bobot);
}
jadwalkanTugas(tugas, n);
free(tugas);
return 0;
}
Program ini meminta pengguna untuk memasukkan jumlah tugas, waktu mulai, waktu selesai, dan bobot untuk setiap tugas. Kemudian, program akan menjadwalkan tugas-tugas tersebut untuk memaksimalkan keuntungan total menggunakan algoritma Greedy Activity Selection.
Semoga program ini membantu dan memberikan pemahaman mengenai implementasi algoritma greedy untuk masalah penjadwalan tugas.
Berikut adalah penjelasan mengenai implementasi program dalam bahasa C untuk menjadwalkan tugas-tugas dengan algoritma greedy:
Struktur Data Tugas (
Tugas):- Struktur ini digunakan untuk merepresentasikan setiap tugas dengan empat atribut:
index(nomor urutan),waktuMulai,waktuSelesai, danbobot(keuntungan).
- Struktur ini digunakan untuk merepresentasikan setiap tugas dengan empat atribut:
Fungsi Tukar (
tukar):- Fungsi ini digunakan untuk menukar dua elemen dari tipe data
Tugas. Fungsi ini membantu dalam pengurutan elemen tugas berdasarkan waktu selesai.
- Fungsi ini digunakan untuk menukar dua elemen dari tipe data
Fungsi Urut Berdasarkan Waktu Selesai (
urutBerdasarkanWaktuSelesai):- Fungsi ini mengurutkan array tugas berdasarkan waktu selesai secara ascending menggunakan algoritma Bubble Sort.
Fungsi Jadwalkan Tugas (
jadwalkanTugas):- Fungsi utama yang menerima array tugas (
tugas) dan jumlah tugas (n). - Fungsi ini memanggil
urutBerdasarkanWaktuSelesaiuntuk mengurutkan tugas berdasarkan waktu selesai. - Selanjutnya, fungsi menggunakan algoritma Greedy Activity Selection untuk memilih tugas-tugas yang akan dijadwalkan.
- Hasilnya, fungsi mencetak urutan pelaksanaan tugas beserta waktu mulai, waktu selesai, dan bobotnya untuk keuntungan maksimum.
- Fungsi utama yang menerima array tugas (
Fungsi
main:- Di dalam fungsi utama (
main), pengguna diminta untuk memasukkan jumlah tugas, waktu mulai, waktu selesai, dan bobot untuk setiap tugas. - Program memanggil fungsi
jadwalkanTugasuntuk menyelesaikan masalah penjadwalan tugas dan mencetak hasilnya.
- Di dalam fungsi utama (
Dealokasi Memori:
- Terdapat penggunaan
mallocuntuk alokasi memori dinamis untuk array tugas (Tugas). Setelah selesai, memori tersebut di-dealokasi menggunakanfree.
- Terdapat penggunaan
Program ini menggunakan algoritma Greedy Activity Selection untuk memilih tugas-tugas yang memberikan keuntungan maksimum dengan memperhatikan waktu selesai. Semoga penjelasan ini membantu Anda memahami implementasi algoritma greedy dalam konteks penjadwalan tugas.
#include <stdio.h>
#include <stdlib.h>
#define MAX_VARIABLES 10
void gaussElimination(double matriks[MAX_VARIABLES][MAX_VARIABLES + 1], int n) {
for (int i = 0; i < n; i++) {
// Membuat elemen diagonal menjadi 1
double pivot = matriks[i][i];
for (int j = i; j <= n; j++) {
matriks[i][j] /= pivot;
}
// Menghilangkan elemen di bawah diagonal menjadi 0
for (int k = 0; k < n; k++) {
if (k != i) {
double factor = matriks[k][i];
for (int j = i; j <= n; j++) {
matriks[k][j] -= factor * matriks[i][j];
}
}
}
}
}
int main() {
int n; // Jumlah persamaan
printf("Masukkan jumlah persamaan: ");
scanf("%d", &n);
double matriks[MAX_VARIABLES][MAX_VARIABLES + 1];
printf("Masukkan koefisien variabel dan hasil untuk setiap persamaan:\n");
for (int i = 0; i < n; i++) {
printf("Persamaan %d: ", i + 1);
for (int j = 0; j <= n; j++) {
scanf("%lf", &matriks[i][j]);
}
}
gaussElimination(matriks, n);
printf("Solusi variabel:\n");
for (int i = 0; i < n; i++) {
printf("Variabel %d: %.2f\n", i + 1, matriks[i][n]);
}
return 0;
}
Program ini menggunakan algoritma eliminasi Gauss untuk menyelesaikan sistem persamaan linear. Berikut adalah penjelasan singkat mengenai bagian-bagian kunci dari program:
Fungsi
gaussElimination:- Fungsi ini menerapkan algoritma eliminasi Gauss untuk mentransformasi matriks augmented menjadi bentuk segitiga atas dan kemudian membuat elemen diagonal menjadi 1.
- Langkah-langkahnya mencakup membagi setiap elemen baris saat ini dengan elemen diagonalnya, dan mengurangkan baris lain dengan faktor yang sesuai untuk menghilangkan elemen di bawah diagonal.
Fungsi
main:- Di dalam fungsi utama (
main), pengguna diminta untuk memasukkan jumlah persamaan. - Setelah itu, program meminta pengguna untuk memasukkan koefisien variabel dan hasil untuk setiap persamaan.
- Program kemudian memanggil fungsi
gaussEliminationuntuk menyelesaikan sistem persamaan linear. - Setelah eliminasi Gauss selesai, program mencetak solusi variabel yang memenuhi persamaan-persamaan.
- Di dalam fungsi utama (
Variabel
matriks:- Variabel ini digunakan untuk menyimpan matriks augmented yang terdiri dari koefisien variabel dan hasil dari setiap persamaan.
Loop dan Perhitungan:
- Terdapat loop untuk melakukan iterasi melalui setiap baris matriks dan mengaplikasikan langkah-langkah eliminasi Gauss.
- Solusi variabel akhirnya dicetak setelah eliminasi Gauss selesai.
Program ini memberikan solusi variabel yang memenuhi sistem persamaan linear yang diberikan oleh pengguna. Semoga penjelasan ini membantu!
3.
#include <stdio.h>
#include <stdlib.h>
#define MAX_KOTA 10
int jarak[MAX_KOTA][MAX_KOTA];
int kota;
int kunjungan[MAX_KOTA];
int min(int a, int b) {
return (a < b) ? a : b;
}
int tsp(int mask, int pos) {
if (mask == (1 << kota) - 1) {
// Semua kota telah dikunjungi
return jarak[pos][0]; // Kembali ke kota awal
}
if (kunjungan[mask] != -1) {
// Hasil sudah pernah dihitung sebelumnya
return kunjungan[mask];
}
int hasil = __INT_MAX__;
// Coba kunjungi setiap kota yang belum dikunjungi
for (int next = 0; next < kota; next++) {
if (!(mask & (1 << next))) {
hasil = min(hasil, jarak[pos][next] + tsp(mask | (1 << next), next));
}
}
return kunjungan[mask] = hasil;
}
void cariRuteTerpendek() {
for (int i = 0; i < kota; i++) {
for (int j = 0; j < kota; j++) {
printf("Masukkan jarak dari Kota %d ke Kota %d: ", i + 1, j + 1);
scanf("%d", &jarak[i][j]);
}
}
// Inisialisasi array kunjungan
for (int i = 0; i < (1 << kota); i++) {
kunjungan[i] = -1;
}
int ruteTerpendek = tsp(1, 0); // Dimulai dari kota 0
printf("Jarak Rute Terpendek: %d\n", ruteTerpendek);
}
int main() {
printf("Masukkan jumlah kota: ");
scanf("%d", &kota);
cariRuteTerpendek();
return 0;
}
Program ini adalah implementasi algoritma Traveling Salesman Problem (TSP) dengan menggunakan pendekatan rekursif dan memoisasi (dynamic programming) untuk menghindari perhitungan berulang. Berikut adalah penjelasan singkat tentang program tersebut:
Fungsi
tsp:- Fungsi ini menerima dua parameter:
mask(bitmask yang merepresentasikan kota yang telah dikunjungi) danpos(kota saat ini). - Jika semua kota telah dikunjungi, fungsi mengembalikan jarak dari
poske kota awal. - Jika hasil sudah pernah dihitung sebelumnya, fungsi langsung mengembalikan nilai tersebut.
- Fungsi mencoba kunjungi setiap kota yang belum dikunjungi, dan memilih kota dengan jarak terpendek.
- Fungsi ini menerima dua parameter:
Fungsi
cariRuteTerpendek:- Fungsi ini meminta pengguna untuk memasukkan jarak antar kota dan inisialisasi array kunjungan.
- Memanggil fungsi
tspuntuk mencari rute perjalanan terpendek, dimulai dari kota 0. - Menampilkan jarak rute terpendek.
Variabel dan Konstanta:
jarak: Matriks yang menyimpan jarak antar kota.kota: Jumlah kota.kunjungan: Array untuk memoisasi hasil perhitungan.
Pemanggilan Fungsi di
main:- Meminta pengguna untuk memasukkan jumlah kota.
- Memanggil fungsi
cariRuteTerpendek.
Program ini menggunakan pendekatan rekursif dengan memoisasi untuk mencari solusi optimal dari TSP. Dengan cara ini, program menghindari perhitungan berulang dan meningkatkan efisiensi. Semoga penjelasan ini membantu memahami program Traveling Salesman Problem dalam bahasa C.



Comments
Post a Comment