Kamis, 02 Oktober 2025

TUGAS 4 MK ALGORITMA

- 0 komentar

 BFS

Di sebuah pusat penelitian, ada drone pintar yang harus menavigasi sebuah ruang simulasi berbentuk grid 5x5. Drone ini harus berangkat dari titik S di pojok kiri atas (0,0) dan mencapai titik G di pojok kanan bawah (4,4) untuk menyelesaikan misinya.

Dalam ruang simulasi:

  • Angka 1 berarti jalur biasa, drone menghabiskan energi kecil untuk melewatinya.

  • Angka 2 berarti jalur lebih berat, drone perlu mengeluarkan energi ekstra.

  • Angka 9 berarti ada rintangan besar seperti dinding, drone tidak bisa melewatinya.

Drone tidak asal memilih jalan. Ia menggunakan algoritma BFS (Breadth-First Search), yang membuatnya selalu menyebar ke semua arah yang mungkin secara bertahap. Dengan cara ini, drone bisa memastikan menemukan jalan keluar menuju G.

Perjalanan drone:

Dari S(0,0), drone mencoba dua arah: ke kanan (0,1) dan ke bawah (1,0). Keduanya bisa dilewati dengan energi 1 sehingga masuk daftar eksplorasi.

Dari (0,1), drone melanjutkan ke kanan (0,2) dengan energi 1`.

Dari (1,0), drone bisa turun ke (2,0) dengan energi 1`.

Dari (0,2), ke kanan (0,3) tidak bisa karena ada rintangan, tapi ke bawah (1,2) bisa dilewati.

Dari (2,0), drone turun lagi ke (3,0) dengan energi 1`.

Dari (1,2), drone ke kanan (1,3) dan masuk jalur aman.

Dari (3,0), drone turun ke (4,0) dengan energi 1`.

Dari (4,0), drone ke kanan (4,1) dengan energi 1`.

Dari (4,1), drone melanjutkan ke (4,2) dengan energi 1`.

Dari (4,2), drone ke kanan (4,3) dengan energi 2`.

Dari (4,3), drone akhirnya menuju G(4,4) dan sampai di titik tujuan.


import java.util.*;

public class bfs {
static int ROWS = 5, COLS = 5;
static int[][] grid = {
{0,1,1,9,1},
{1,2,1,1,1},
{1,9,2,9,1},
{1,1,2,1,1},
{1,1,1,2,0}
};

static int[] start = {0,0};
static int[] goal = {4,4};

static int[][] directions = {{-1,0},{1,0},{0,-1},{0,1}};

static class Node {
int r, c;
Node parent;
Node(int r, int c, Node parent) {
this.r = r;
this.c = c;
this.parent = parent;
}
}

public static void main(String[] args) {
bfs();
}

static void bfs() {
boolean[][] visited = new boolean[ROWS][COLS];
Queue<Node> queue = new LinkedList<>();

queue.add(new Node(start[0], start[1], null));
visited[start[0]][start[1]] = true;

Node endNode = null;

while(!queue.isEmpty()) {
Node current = queue.poll();

if(current.r == goal[0] && current.c == goal[1]) {
endNode = current;
break;
}

for(int[] d : directions) {
int nr = current.r + d[0];
int nc = current.c + d[1];

if(nr >= 0 && nr < ROWS && nc >= 0 && nc < COLS && !visited[nr][nc]) {
if(grid[nr][nc] != 9) {
visited[nr][nc] = true;
queue.add(new Node(nr, nc, current));
}
}
}
}

if(endNode != null) {
printPath(endNode);
} else {
System.out.println("Tidak ada jalur dari S ke G!");
}
}

static void printPath(Node endNode) {
List<int[]> path = new ArrayList<>();
Node current = endNode;
int totalCost = 0;

while(current != null) {
path.add(new int[]{current.r, current.c});
if(!(current.r == start[0] && current.c == start[1]) &&
!(current.r == goal[0] && current.c == goal[1])) {
totalCost += grid[current.r][current.c];
}
current = current.parent;
}

Collections.reverse(path);

System.out.print("Jalur yang paling pendek ");
for(int[] p : path) {
System.out.print("(" + p[0] + "," + p[1] + ")");
}
System.out.println(" Total biaya: " + totalCost);
}
}

outputnya:

alur yang paling pendek (0,0)(1,0)(2,0)(3,0)(4,0)(4,1)(4,2)(4,3)(4,4) Total biaya: 8

Read more...

Kamis, 25 September 2025

TUGAS 3 MK ALGORITMA

- 0 komentar
saya ingin menelusuri peta dari petak S di sudut kiri atas dan sampai pada petak G sudut kanan bawah dengan biaya perjalanan sekecil mungkin. dengan prinsip DFS yaitu menyelam satu cabang sedalam mungkin kemudian Backtracking untuk kembali ke persimpangan jika jalan buntu atau sudah terlalu mahal,semua jalur dari S ke G di coba dan Setelah semua jalur selesai dicoba, saya memilih biaya paling murah. Saya mulai dari S(0,0) dengan biaya 0,saya memilih arah pertama kanan (0,1) dengan biaya 1. Dari(0,1) saya lanjut ke kanan (0,2) dengan total biaya 2. kemudian dari(0,2) saya ke kanan(0,3) tetapi disana ada dinding(9). Backtrack ke (0,2) saya kebawah (1,2) dengan total biaya 3. Kemudian dari(1,2) saya ke kanan(1,3) dngan total biaya 4. Dari (1,3) saya lanjut ke kanan(1,4) dengan total biaya 5. Selanjutnya dari(1,4) saya kebawah(2,4) dengan total biaya = 6. Dari(2,4) saya kebawah(3,4) dengan total biaya = 7. Dan Terakhir dari(3,4) saya ke bawah atau Ke G(4,4).sampai tujuan dengan total biaya = 7.Setelah Menemukan G Jadi jalur pertama yang saya lalui adalah dari S(0,0), (0,1), (0,2), (1,2), (1,3), (1,4), (2,4),(3,4), G(4,4) dengan total biaya = 7. Saya tidak langsung berhenti. saya mundur lagi dan mencoba cabang lain dari titik sebelumnya, untuk memastikan tidak ada jalur yang lebih murah. Tetapi setiap kali saya menemukan jalur lain yang biayanya sudah ≥7, saya menghentikan cabang itu (pruning) karena tidak mungkin lebih murah. Semua jalur lain mengandung angka 2 atau lebih panjang, jadi semuanya lebih mahal.

 CONTOH VISUAL :
package javaapplication42;


    
 import java.util.*;

public class DFSPathfinding {
    static int[][] grid = {
        {0, 1, 1, 9, 1},
        {1, 2, 1, 1, 1},
        {1, 9, 2, 9, 1},
        {1, 1, 2, 1, 1},
        {1, 1, 1, 2, 0} // 0 di sini = Start/Goal, 9 = dinding
    };

    static int rows = grid.length;
    static int cols = grid[0].length;

    static int[][] directions = {{1,0},{-1,0},{0,1},{0,-1}}; // bawah, atas, kanan, kiri

    static int bestCost = Integer.MAX_VALUE;
    static List<String> bestPath = new ArrayList<>();
    static boolean[][] visited = new boolean[rows][cols];

    public static void main(String[] args) {
        List<String> path = new ArrayList<>();
        dfs(0, 0, 0, path); // Start di (0,0)

        if (bestCost < Integer.MAX_VALUE) {
            System.out.println("Biaya minimum: " + bestCost);
            System.out.println("Jalur yang dilalui: " + bestPath);
        } else {
            System.out.println("Tidak ada jalur ditemukan.");
        }
    }

    static void dfs(int x, int y, int cost, List<String> path) {
        // Cek batas
        if (x < 0 || x >= rows || y < 0 || y >= cols) return;

        // Cek dinding atau sudah dikunjungi
        if (grid[x][y] == 9 || visited[x][y]) return;

        // Hitung biaya (S dan G dianggap 0)
        int cellCost = (x == 0 && y == 0) || (x == rows-1 && y == cols-1) ? 0 : grid[x][y];
        int newCost = cost + cellCost;

        // Pruning
        if (newCost >= bestCost) return;

        // Tambahkan posisi ke path
        path.add("(" + x + "," + y + ")");
        visited[x][y] = true;

        // Jika sampai Goal
        if (x == rows-1 && y == cols-1) {
            if (newCost < bestCost) {
                bestCost = newCost;
                bestPath = new ArrayList<>(path); // Simpan jalur terbaik
            }
        } else {
            // Coba 4 arah
            for (int[] d : directions) {
                dfs(x + d[0], y + d[1], newCost, path);
            }
        }

        // Backtrack
        path.remove(path.size() - 1);
        visited[x][y] = false;
    }
}

 
Read more...

Selasa, 16 September 2025

TUGAS 2 MK ALGORITMA

- 0 komentar
Algoritma: Greedy Best-First Search (GBFS) Mencari jalan dari titik A (Start) ke B (Goal) dengan biaya minimum, menggunakan heuristik (estimasi biaya ke tujuan). --- Contoh Kasus: Misalnya kita punya peta seperti ini (biaya aktual di setiap simpul dan estimasi jarak ke goal di dalam kurung):
- Angka di sisi panah = biaya nyata antar simpul - Angka dalam kurung = heuristik (estimasi jarak ke Goal, misalnya dari jarak Euclidean) --- Langkah-langkah Algoritma Greedy: 1. Mulai di A, lihat tetangga: - C (heuristik = 4) - B (heuristik = 6) → Pilih C (karena 4 < 6) 2. Dari C, lihat tetangga: - D (heuristik = 2) → Pilih D 3. Dari D, lihat tetangga: - E (heuristik = 0) → Pilih E (tujuan) --- Jalur yang Diambil: A → C → D → E Biaya Aktual Total: A–C = 1 C–D = 1 D–E = 3 → Total: 5

contoh visual

package soal;


import java.util.*;


public class JalurGreedy {


    // arah: kanan, bawah, kiri, atas

    static final int[] dBaris = {0,1,0,-1};

    static final int[] dKolom = {1,0,-1,0};


    static int[][] peta = {

        {0,1,1,9,1},

        {1,2,1,1,1},

        {1,9,2,9,1},

        {1,1,1,9,1},

        {9,1,1,1,0}

    };


    static class Titik {

        int baris, kolom;

        Titik(int baris, int kolom){this.baris=baris;this.kolom=kolom;}

        public String toString(){return "("+baris+","+kolom+")";}

    }


    public static void main(String[] args){

        Titik awal = new Titik(0,0);

        Titik tujuan = new Titik(4,4);

        cariJalurGreedy(awal, tujuan);

    }


    static void cariJalurGreedy(Titik awal, Titik tujuan){

        int jumlahBaris = peta.length, jumlahKolom = peta[0].length;


        boolean[][] dikunjungi = new boolean[jumlahBaris][jumlahKolom];

        int biaya = 0;

        List<Titik> jalur = new ArrayList<>();


        Titik sekarang = awal;

        jalur.add(sekarang);

        dikunjungi[sekarang.baris][sekarang.kolom] = true;


        while(!(sekarang.baris==tujuan.baris && sekarang.kolom==tujuan.kolom)){

            List<Titik> tetangga = new ArrayList<>();


            for(int k=0;k<4;k++){

                int nb = sekarang.baris + dBaris[k];

                int nk = sekarang.kolom + dKolom[k];


                if(nb<0 || nb>=jumlahBaris || nk<0 || nk>=jumlahKolom) continue;

                if(peta[nb][nk]==9 || dikunjungi[nb][nk]) continue;


                tetangga.add(new Titik(nb,nk));

            }


            if(tetangga.isEmpty()){

                System.out.println("Algoritma Greedy gagal: jalan buntu.");

                return;

            }


            // pilih tetangga dengan biaya paling kecil

            Titik terbaik = tetangga.get(0);

            for(Titik t: tetangga){

                if(peta[t.baris][t.kolom] < peta[terbaik.baris][terbaik.kolom]){

                    terbaik = t;

                }

            }

Read more...

TUGAS 2 MK INTERAKSI MANUSIA KOMPUTER

- 0 komentar
A. kalkulator sebelum
B. Identifikasi aspek usability : Kalkulator ini mudah dipahami karena tampilannya sederhana. Tombol angka tersusun rapi dan sama seperti kalkulator biasa. Hasil perhitungan langsung muncul di layar setelah menekan tombol “=”. Tapi, kalau salah input seperti membagi dengan nol, tidak ada pesan error. Selain itu, warna tombol hampir sama sehingga kurang jelas membedakan angka dan operator, dan belum ada fitur tambahan seperti persen atau akar kuadrat. C. Apa yang sudah baik dan apa yang masih kurang Yang sudah baik yaitu kalkulator mudah digunakan, tombol rapi, dan hasil langsung terlihat. Yang masih kurang yaitu tidak ada pesan error, tampilan kurang menarik, dan fiturnya masih sedikit. kode kalkulator sebelumnya html
css
jv
KALKULATOR setelah di desain
kode kalkulator html
css
jv
Setelah dilakukan perbaikan dan penambahan fitur, kalkulator menjadi lebih nyaman dan bermanfaat. Warna tombol operator dibedakan dari angka, ukuran tombol diperbesar, serta ditambahkan mode gelap agar lebih enak dipakai di berbagai kondisi. Selain itu, ada fitur baru seperti tanda persen (%),dan juga riwayat hasil yang memungkinkan pengguna melihat kembali perhitungan sebelumnya. Dengan tambahan fitur fitur ini, kalkulator menjadi lebih lengkap, mudah digunakan, dan memberi pengalaman yang lebih baik dibandingkan versi awalnya. Ketika kita menginput nilai 10/0 kalkulator sebeleumnya hanya menampilkan hasil “infinity” tanpa ada penjelasan lebih lanjut. untuk perbaikan sebaiknya ditambahkan pesan peringatan seperti “input tidak valid” agar pengguna lebih paham.
Read more...

Selasa, 02 September 2025

TUGAS 1 MK INTERAKSI MANUSIA KOMPUTER

- 0 komentar
jika kamu diberikan kesempatan untuk mendesain ulang lampu merah dijalan , bagaimana kira kira gambaran lampu merah tersebut? pertama kita cari tau apa apa sja masalah yang sering terjafi pada lampu merah dijalan 1. count down eror 2.mati tidak berfungsi 3.akurasi waktu yang tidak seimbang 4salah posisi serinkali terhalang pohon 5.tidak ramah pada pejalan kaki berikut desain lang saya
desain ini efektif menurut saya karna tidak akan mati lagi karna sudah memakai sistem tenaga surya , tiang lampu merah juga harus lebih tinggi agar mudah dilihat , serta mendukung pejalan aki yang ingin menyebrang bisa langsung memencet tombol agar lampu merah nya jalan sehinggah pejalan kaki bisa menyebrang , desain saya juga saya menambahkan sensor di jalan raya yang bisa mengetahui padatnya pengguna lalu lintas sehinggah bisa mengatur akurasi waktu lampu hijaunya
Read more...

Kamis, 28 Agustus 2025

TUGAS 1 MK ALGORITMA

- 0 komentar
📌 Masalah Dalam permainan billiard, meja ternyata tidak rata sehingga bola cenderung menggelinding ke arah tertentu walaupun tidak dipukul lurus. Bagaimana algoritma bisa membantu pemain tetap menentukan pukulan terbaik? 🔄 Algoritma (langkah demi langkah) Input: Posisi bola putih, bola target, lubang, arah kemiringan meja. 1. Identifikasi arah kemiringan meja (misalnya bola selalu condong ke kanan bawah). 2. Ukur seberapa besar pengaruh kemiringan (misalnya bola bergeser 2 cm ke kanan per 1 meter lintasan). 3. Tentukan jalur ideal bola merah ke lubang. 4. Koreksi jalur dengan memperhitungkan deviasi akibat kemiringan meja. -Jika meja miring ke kanan, maka pukulan harus sedikit diarahkan ke kiri agar hasilnya lurus. 5. Tentukan kekuatan pukulan (semakin kuat, semakin kecil pengaruh miring → karena bola lebih cepat). 6. Eksekusi pukulan. 7. Output: Bola merah masuk lubang dengan kompensasi kemiringan. 📌 Kenapa algoritma ini efektif? -Mengantisipasi kondisi meja tidak rata. -Tetap bisa dipakai meski arah miring berbeda → cukup ganti input arah & besar kemiringan. -Hanya bagian perhitungan sudut kompensasi yang berubah, prosedur besar tetap sama. 📌 Bagaimana memastikan transparan & adil? - Semua pemain diberi tahu arah & besarnya kemiringan meja. - Rumus kompensasi dicatat jelas (misalnya: pergeseran = jarak × faktor kemiringan). - Dengan begitu, tidak ada “keberuntungan tersembunyi” yang hanya diketahui sebagian pemain.
Read more...
 
Copyright © 2012. ARJUNA - Posts · Comments · Theme Template by More Than Themes · Bloggerized by BTDesigner Published..Blogger Templates · Powered by Blogger