This commit is contained in:
parent
1ffa7425bf
commit
fd4ddce56f
539
README.md
539
README.md
|
|
@ -1,61 +1,520 @@
|
|||
<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>
|
||||
# 🍄 Sistem Pakar Diagnosis Jamur Tiram
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>
|
||||
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
|
||||
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
|
||||
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
|
||||
</p>
|
||||
Aplikasi **sistem pakar berbasis web** untuk mendiagnosis penyakit pada **jamur tiram** (*Pleurotus ostreatus*) menggunakan metode **Forward Chaining**, **Decision Tree**, dan **Certainty Factor**.
|
||||
|
||||
## About Laravel
|
||||
Dibangun dengan Laravel 12, Tailwind CSS 4, dan MySQL/SQLite.
|
||||
|
||||
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
|
||||
---
|
||||
|
||||
- [Simple, fast routing engine](https://laravel.com/docs/routing).
|
||||
- [Powerful dependency injection container](https://laravel.com/docs/container).
|
||||
- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
|
||||
- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
|
||||
- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
|
||||
- [Robust background job processing](https://laravel.com/docs/queues).
|
||||
- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
|
||||
## 📋 Daftar Isi
|
||||
|
||||
Laravel is accessible, powerful, and provides tools required for large, robust applications.
|
||||
- [Fitur](#fitur)
|
||||
- [Tech Stack](#tech-stack)
|
||||
- [Struktur Database](#struktur-database)
|
||||
- [Metode Sistem Pakar](#metode-sistem-pakar)
|
||||
- [Forward Chaining](#1-forward-chaining)
|
||||
- [Decision Tree](#2-decision-tree)
|
||||
- [Certainty Factor](#3-certainty-factor)
|
||||
- [Alur Diagnosis](#alur-diagnosis)
|
||||
- [API Endpoints](#api-endpoints)
|
||||
- [Instalasi](#instalasi)
|
||||
- [Seeder Data](#seeder-data)
|
||||
|
||||
## Learning Laravel
|
||||
---
|
||||
|
||||
Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
|
||||
## ✨ Fitur
|
||||
|
||||
You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch.
|
||||
| Fitur | Keterangan |
|
||||
|---|---|
|
||||
| **Diagnosis Gejala** | Pilih gejala yang tampak pada jamur tiram melalui form interaktif |
|
||||
| **Forward Chaining** | Mencocokkan gejala dengan rule-based knowledge base |
|
||||
| **Decision Tree Traversal** | Menelusuri pohon keputusan untuk mendapatkan reasoning path |
|
||||
| **Certainty Factor** | Menghitung tingkat keyakinan diagnosis (0–100%) |
|
||||
| **Riwayat Diagnosis** | Menyimpan riwayat ke database + LocalStorage (ID-only) |
|
||||
| **Detail Hasil** | Menampilkan deskripsi penyakit, solusi penanganan, bahan, dan alat |
|
||||
| **Manajemen Riwayat** | Lihat detail dan hapus riwayat dari LocalStorage |
|
||||
| **Halaman Informasi Penyakit** | Galeri 10 penyakit jamur tiram dengan gambar dan deskripsi |
|
||||
|
||||
If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
|
||||
---
|
||||
|
||||
## Laravel Sponsors
|
||||
## 🛠 Tech Stack
|
||||
|
||||
We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com).
|
||||
| Layer | Teknologi |
|
||||
|---|---|
|
||||
| **Backend** | PHP 8.2+, Laravel 12 |
|
||||
| **Frontend** | Blade Template, Tailwind CSS 4 (CDN), Vanilla JS |
|
||||
| **Database** | MySQL (production) / SQLite (development) |
|
||||
| **Build Tool** | Vite 7, Laravel Vite Plugin |
|
||||
| **Dev Tools** | Concurrently, Pail (log), Pint (linting), PHPUnit |
|
||||
|
||||
### Premium Partners
|
||||
> **Catatan:** Frontend murni menggunakan **Blade + Tailwind CDN** tanpa framework JS seperti Vue atau React. Integritas dan validasi CLI biasa digunakan.
|
||||
|
||||
- **[Vehikl](https://vehikl.com)**
|
||||
- **[Tighten Co.](https://tighten.co)**
|
||||
- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
|
||||
- **[64 Robots](https://64robots.com)**
|
||||
- **[Curotec](https://www.curotec.com/services/technologies/laravel)**
|
||||
- **[DevSquad](https://devsquad.com/hire-laravel-developers)**
|
||||
- **[Redberry](https://redberry.international/laravel-development)**
|
||||
- **[Active Logic](https://activelogic.com)**
|
||||
---
|
||||
|
||||
## Contributing
|
||||
## 🗄 Struktur Database
|
||||
|
||||
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
|
||||
### Entity Relationship
|
||||
|
||||
## Code of Conduct
|
||||
```
|
||||
gejala ──┬──< penyakit_gejala >──┬── penyakit
|
||||
│ │
|
||||
└── (digunakan oleh) ────┘
|
||||
┌─────────────────────┐
|
||||
diagnosis_history ───────>─────────────┤ hasil_penyakit_id │
|
||||
└─────────────────────┘
|
||||
```
|
||||
|
||||
In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
|
||||
### Tabel `gejala`
|
||||
|
||||
## Security Vulnerabilities
|
||||
Menyimpan 24 gejala (G01–G25) yang mungkin tampak pada jamur tiram.
|
||||
|
||||
If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
|
||||
| Kolom | Tipe | Keterangan |
|
||||
|---|---|---|
|
||||
| `id` | bigint (PK) | Auto increment |
|
||||
| `kode` | varchar (unique) | Kode gejala (G01–G25) |
|
||||
| `nama` | varchar | Nama gejala |
|
||||
| `deskripsi` | text (nullable) | Penjelasan gejala |
|
||||
| `kategori` | varchar (nullable) | Kelompok gejala (Warna, Pertumbuhan, Kerusakan, dll.) |
|
||||
| `timestamps` | - | created_at, updated_at |
|
||||
|
||||
## License
|
||||
**Contoh data:**
|
||||
| Kode | Nama | Kategori |
|
||||
|---|---|---|
|
||||
| G01 | Jamur tiram terlihat membusuk | Warna & Kondisi |
|
||||
| G06 | Pertumbuhan jamur tiram lambat | Pertumbuhan |
|
||||
| G11 | Pada media baglog terdapat noda warna hitam | Kondisi Baglog |
|
||||
| G22 | Perubahan tekstur jamur lembek | Tekstur |
|
||||
|
||||
The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
|
||||
### Tabel `penyakit`
|
||||
|
||||
Menyimpan 10 penyakit/hama (P01–P10) yang menyerang jamur tiram.
|
||||
|
||||
| Kolom | Tipe | Keterangan |
|
||||
|---|---|---|
|
||||
| `id` | bigint (PK) | Auto increment |
|
||||
| `kode` | varchar (unique) | Kode penyakit (P01–P10) |
|
||||
| `nama` | varchar | Nama penyakit |
|
||||
| `tipe` | varchar | Jenis: Jamur, Bakteri, Hama Binatang, Hama Serangga |
|
||||
| `deskripsi` | text | Penjelasan penyakit |
|
||||
| `solusi` | json (nullable) | Array langkah penanganan |
|
||||
| `bahan` | json (nullable) | Array bahan/kimia yang dibutuhkan |
|
||||
| `alat` | json (nullable) | Array alat yang dibutuhkan |
|
||||
| `image_url` | varchar (nullable) | URL gambar penyakit |
|
||||
| `timestamps` | - | created_at, updated_at |
|
||||
|
||||
**Daftar penyakit:**
|
||||
| Kode | Nama | Tipe |
|
||||
|---|---|---|
|
||||
| P01 | Trichoderma spp (Jamur Hijau) | Jamur |
|
||||
| P02 | Neurospora spp | Jamur |
|
||||
| P03 | Mucor spp | Jamur |
|
||||
| P04 | Penicilium spp | Jamur |
|
||||
| P05 | Pseudomonas tolaasii (Brown Blotch) | Bakteri |
|
||||
| P06 | Chaetomium spp | Jamur |
|
||||
| P07 | Coprinus spp (Jamur Liar) | Jamur |
|
||||
| P08 | Tikus | Hama Binatang |
|
||||
| P09 | Lalat | Hama Serangga |
|
||||
| P10 | Tunggu/Gurem (Acari) | Hama Serangga |
|
||||
|
||||
### Tabel `penyakit_gejala` (Pivot)
|
||||
|
||||
Menghubungkan penyakit dengan gejala beserta **bobot CF Pakar** (Certainty Factor dari pakar).
|
||||
|
||||
| Kolom | Tipe | Keterangan |
|
||||
|---|---|---|
|
||||
| `id` | bigint (PK) | Auto increment |
|
||||
| `penyakit_id` | bigint (FK) | → penyakit.id |
|
||||
| `gejala_id` | bigint (FK) | → gejala.id |
|
||||
| `cf_pakar` | decimal(3,2) | Bobot keyakinan pakar (0.1–1.0) |
|
||||
| `deskripsi` | text (nullable) | Keterangan relasi |
|
||||
| `timestamps` | - | created_at, updated_at |
|
||||
| *unique* | - | (penyakit_id, gejala_id) |
|
||||
|
||||
**Contoh data P01 (Trichoderma):**
|
||||
| Gejala | CF Pakar |
|
||||
|---|---|
|
||||
| G12 – Bintik noda hijau | 1.0 |
|
||||
| G18 – Noda hijau di daun jamur | 0.8 |
|
||||
| G06 – Pertumbuhan lambat | 0.6 |
|
||||
| G07 – Tidak tumbuh | 0.8 |
|
||||
|
||||
### Tabel `diagnosis_history`
|
||||
|
||||
Menyimpan riwayat diagnosis yang dilakukan pengguna.
|
||||
|
||||
| Kolom | Tipe | Keterangan |
|
||||
|---|---|---|
|
||||
| `id` | bigint (PK) | Auto increment |
|
||||
| `gejala_terpilih` | json | Array ID gejala yang dipilih |
|
||||
| `hasil_penyakit_id` | bigint (FK) | → penyakit.id (hasil diagnosis) |
|
||||
| `confidence_level` | float | Tingkat keyakinan (0–100) |
|
||||
| `timestamps` | - | created_at, updated_at |
|
||||
|
||||
---
|
||||
|
||||
## 🧠 Metode Sistem Pakar
|
||||
|
||||
### 1. Forward Chaining
|
||||
|
||||
**Forward Chaining** adalah metode penalaran berbasis aturan (*rule-based reasoning*) yang dimulai dari fakta (gejala) menuju kesimpulan (penyakit).
|
||||
|
||||
#### Cara Kerja (Saat Ini)
|
||||
|
||||
Rules didefinisikan secara hardcoded di `app/Services/ForwardChainingService.php`:
|
||||
|
||||
```php
|
||||
// Format: [id, penyakit_id, kode, gejala_ids]
|
||||
$rules = [
|
||||
['id' => 1, 'penyakit_id' => 1, 'kode' => 'R1', 'gejala_ids' => [11, 17, 5, 6]], // P01 - Trichoderma
|
||||
['id' => 2, 'penyakit_id' => 2, 'kode' => 'R2', 'gejala_ids' => [12, 5, 6]], // P02 - Neurospora
|
||||
['id' => 3, 'penyakit_id' => 3, 'kode' => 'R3', 'gejala_ids' => [10, 5, 6]], // P03 - Mucor
|
||||
['id' => 4, 'penyakit_id' => 4, 'kode' => 'R4', 'gejala_ids' => [11, 22, 5]], // P04 - Penicilium
|
||||
['id' => 5, 'penyakit_id' => 5, 'kode' => 'R5', 'gejala_ids' => [1, 9, 13, 21]], // P05 - Pseudomonas
|
||||
['id' => 6, 'penyakit_id' => 6, 'kode' => 'R6', 'gejala_ids' => [22, 5, 8]], // P06 - Chaetomium
|
||||
['id' => 7, 'penyakit_id' => 7, 'kode' => 'R7', 'gejala_ids' => [14, 23, 19]], // P07 - Coprinus
|
||||
['id' => 8, 'penyakit_id' => 8, 'kode' => 'R8', 'gejala_ids' => [8, 23, 19]], // P08 - Tikus
|
||||
['id' => 9, 'penyakit_id' => 9, 'kode' => 'R9', 'gejala_ids' => [1, 2, 24]], // P09 - Lalat
|
||||
['id' => 10, 'penyakit_id' => 10, 'kode' => 'R10','gejala_ids' => [4, 18, 24]], // P10 - Tunggu/Gurem
|
||||
];
|
||||
```
|
||||
|
||||
**Algoritma `findMatchingDiseases()`:**
|
||||
|
||||
1. **Exact match** — Iterasi semua rule; jika **semua** gejala dalam rule cocok dengan gejala yang dipilih user, penyakit rule tersebut dianggap match.
|
||||
2. **Fallback partial match** — Jika tidak ada satu pun rule yang match persis, sistem mengambil **semua penyakit** yang memiliki **setidaknya satu gejala** yang dipilih user. Certainty Factor kemudian menghitung probabilitasnya.
|
||||
3. Hasil dikembalikan sebagai array model `Penyakit` untuk diproses lebih lanjut.
|
||||
|
||||
#### Hubungan Rule dengan Relasi CF
|
||||
|
||||
| Rule | Penyakit | Gejala dalam Rule | Gejala di Pivot (CF) |
|
||||
|---|---|---|---|
|
||||
| R1 | P01 | G12, G18, G06, G07 | G12(1.0), G18(0.8), G06(0.6), G07(0.8) |
|
||||
| R2 | P02 | G13, G06, G07 | G13(1.0), G06(0.6), G07(0.8) |
|
||||
| R3 | P03 | G11, G06, G07 | G11(1.0), G06(0.6), G07(0.8) |
|
||||
| R4 | P04 | G12, G23, G06 | G12(1.0), G23(0.8), G06(0.6) |
|
||||
| R5 | P05 | G01, G10, G14, G22 | G01(1.0), G10(0.8), G14(0.8), G22(0.8) |
|
||||
| R6 | P06 | G23, G06, G09 | G23(1.0), G06(0.6), G09(0.6) |
|
||||
| R7 | P07 | G15, G24, G20 | G15(1.0), G24(0.8), G20(0.6) |
|
||||
| R8 | P08 | G09, G24, G20 | G09(1.0), G24(0.8), G20(0.6) |
|
||||
| R9 | P09 | G01, G02, G25 | G01(1.0), G02(0.8), G25(0.8) |
|
||||
| R10 | P10 | G05, G19, G25 | G05(1.0), G19(0.8), G25(0.8) |
|
||||
|
||||
---
|
||||
|
||||
### 2. Decision Tree
|
||||
|
||||
**Decision Tree** digunakan untuk menelusuri jalur diagnosis berdasarkan gejala utama (primary symptoms) secara hierarkis.
|
||||
|
||||
#### Struktur Pohon (Saat Ini)
|
||||
|
||||
Pohon keputusan didefinisikan secara hardcoded di `ForwardChainingService.php` dengan **2 level depth**:
|
||||
|
||||
```
|
||||
root: Diagnosis Jamur Tiram
|
||||
├── G11 (Tubuh Buah Pucat) ─────┬── G18 (Ada Lendir) → P01
|
||||
│ └── G23 (Bau Menyengat) → P04
|
||||
├── G12 (Umbi Membusuk) ─────────└── G06 (Substrat Basah) → P02
|
||||
├── G10 (Kepala Susu Coklat) ────└── G06 (Substrat Basah) → P03
|
||||
├── G01 (Jamur Putih/Kepala) ────┬── G10 (Busuk Pangkal) → P05
|
||||
│ └── G02 (Berbau Asam) → P09
|
||||
├── G23 (Bau Menyengat) ─────────└── G09 (Berlendir) → P06
|
||||
├── G15 (Kepala Susu Kerdil) ────└── G24 (Warna Tidak Seragam) → P07
|
||||
├── G09 (Berlendir) ─────────────└── G20 (Miselium Tidak) → P08
|
||||
└── G05 (Pertumbuhan Terganggu) ─└── G19 (Kontaminan) → P10
|
||||
```
|
||||
|
||||
#### Cara Kerja `traverseDecisionTree()`
|
||||
|
||||
1. Ambil semua branch level-1 dari `root.branches`.
|
||||
2. Untuk setiap branch, cek apakah `symptom_id` branch ada dalam `selectedGejalaIds`.
|
||||
3. Jika ya, catat branch sebagai `matched` dan telusuri `children` untuk menemukan penyakit yang mungkin.
|
||||
4. Hasilnya adalah array path yang berisi: `symptom_id`, `name`, `matched`, dan `possible_penyakit_ids`.
|
||||
|
||||
Fungsi ini menghasilkan **reasoning path** yang ditampilkan di log/debug untuk transparansi diagnosis.
|
||||
|
||||
> 📖 **Lihat `dc.md`** untuk flowchart decision tree dan detail traversal.
|
||||
|
||||
---
|
||||
|
||||
### 3. Certainty Factor
|
||||
|
||||
**Certainty Factor (CF)** adalah metode untuk mengukur tingkat keyakinan terhadap suatu diagnosis berdasarkan kombinasi bobot pakar dan keyakinan pengguna.
|
||||
|
||||
#### Formula yang Digunakan
|
||||
|
||||
**Langkah 1 — CF untuk setiap gejala terpilih:**
|
||||
|
||||
```
|
||||
CF[H, E] = CF[E] × CF[H, E]
|
||||
```
|
||||
|
||||
Dimana:
|
||||
- `CF[H, E]` = Certainty Factor hipotesis (penyakit) berdasarkan evidence (gejala)
|
||||
- `CF[E]` = Certainty Factor dari pengguna (CF User) — dari select dropdown per gejala (0, 0.4, 0.6, **0.8** default, 1.0)
|
||||
- `CF[H, E]` = Certainty Factor dari pakar (CF Pakar) — dari tabel `penyakit_gejala`
|
||||
|
||||
**Langkah 2 — Kombinasi multiple symptoms:**
|
||||
|
||||
```
|
||||
CF_combine(CF1, CF2) = CF1 + CF2 × (1 - CF1)
|
||||
```
|
||||
|
||||
Rumus ini diterapkan secara iteratif untuk semua gejala yang cocok pada satu penyakit.
|
||||
|
||||
#### Implementasi
|
||||
|
||||
**File:** `app/Services/CertaintyFactorService.php`
|
||||
|
||||
**Metode `calculateCFWithDetails()`:**
|
||||
|
||||
1. Ambil mapping CF Pakar dari `penyakit_gejala` untuk penyakit tertentu.
|
||||
2. Filter hanya gejala yang ada di `selectedGejalaIds`.
|
||||
3. Untuk setiap mapping, hitung `CF_he = cf_pakar × cf_user` (cf_user dari input select user, default 0.8).
|
||||
4. Kombinasikan semua `CF_he` menggunakan formula CF combine.
|
||||
5. Hasil akhir dikonversi ke persentase integer (0–100).
|
||||
|
||||
**Contoh Perhitungan (P01 — Trichoderma):**
|
||||
|
||||
User memilih gejala G12, G18, G06, dan G07:
|
||||
|
||||
| Gejala | CF Pakar | CF User | CF[H,E] |
|
||||
|---|---|---|---|
|
||||
| G12 | 1.0 | 0.8 | 0.80 |
|
||||
| G18 | 0.8 | 0.8 | 0.64 |
|
||||
| G06 | 0.6 | 0.8 | 0.48 |
|
||||
| G07 | 0.8 | 0.8 | 0.64 |
|
||||
|
||||
Kombinasi:
|
||||
- `CF1 = 0.80`
|
||||
- `CF2 = 0.80 + 0.64 × (1 - 0.80) = 0.928`
|
||||
- `CF3 = 0.928 + 0.48 × (1 - 0.928) = 0.96256`
|
||||
- `CF4 = 0.96256 + 0.64 × (1 - 0.96256) = 0.9865216`
|
||||
|
||||
**Hasil:** `CF = 0.9865 → 98.65%`
|
||||
|
||||
#### Kategori Keyakinan
|
||||
|
||||
| CF Value | Status |
|
||||
|---|---|
|
||||
| ≥ 0.9 | Sangat Yakin |
|
||||
| ≥ 0.8 | Yakin |
|
||||
| ≥ 0.6 | Cukup Yakin |
|
||||
| ≥ 0.4 | Sedikit Yakin |
|
||||
| < 0.4 | Tidak Yakin |
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Alur Diagnosis
|
||||
|
||||
```
|
||||
User membuka /diagnosis
|
||||
│
|
||||
▼
|
||||
Menampilkan form dengan 24 gejala (checkbox + select CF user per gejala, default 0.8 — hanya terkirim untuk gejala yang dicentang)
|
||||
│
|
||||
▼ (POST /diagnosis)
|
||||
Validasi input (gejala_ids required, min 1)
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ 1. Forward Chaining — findMatchingDiseases() │
|
||||
│ • Exact match dengan rule │
|
||||
│ • Jika tidak ada → fallback partial match │
|
||||
│ • Return array Penyakit model │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ 2. Decision Tree — traverseDecisionTree() │
|
||||
│ • Telusuri branch berdasarkan primary symptoms │
|
||||
│ • Catat possible penyakit per branch │
|
||||
│ • Return reasoning path array │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ 3. Certainty Factor — calculateCFWithDetails() │
|
||||
│ • Untuk setiap penyakit yang match │
|
||||
│ • Hitung CF per gejala → combine │
|
||||
│ • Return cf_value, cf_percentage, status │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
Sortir hasil berdasarkan CF percentage (descending)
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Hasil: │
|
||||
│ • 0 penyakit → Tampilkan error "Tidak ada cocok" │
|
||||
│ • >1 penyakit → Tampilkan error dengan daftar │
|
||||
│ penyakit dan gejala yang kurang │
|
||||
│ • 1 penyakit → Simpan history, tampilkan hasil │
|
||||
│ (deskripsi, solusi, bahan, alat, │
|
||||
│ confidence %) │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🌐 API Endpoints
|
||||
|
||||
### Web Routes
|
||||
|
||||
| Method | URI | Controller Method | Keterangan |
|
||||
|---|---|---|---|
|
||||
| GET | `/` | Closure | Halaman beranda |
|
||||
| GET | `/diagnosis` | `DiagnosisController@showForm` | Form gejala |
|
||||
| POST | `/diagnosis` | `DiagnosisController@process` | Proses diagnosis |
|
||||
| GET | `/riwayat` | `DiagnosisController@showHistory` | Riwayat diagnosis |
|
||||
| GET | `/riwayat/{id}` | `DiagnosisController@detailHistory` | Detail riwayat |
|
||||
| GET | `/penyakit` | Closure | Info penyakit |
|
||||
| GET | `/tentang` | Closure | Halaman tentang |
|
||||
|
||||
### API Routes
|
||||
|
||||
| Method | URI | Controller Method | Request | Response |
|
||||
|---|---|---|---|---|
|
||||
| POST | `/api/diagnosis` | `DiagnosisController@apiProcess` | `{gejala_ids: [], cf_user: {}}` | JSON diagnosis |
|
||||
| POST | `/api/history-data` | `DiagnosisController@getHistoryData` | `{ids: [1,2,3]}` | JSON array histories with penyakit relation |
|
||||
|
||||
#### Response `/api/history-data`
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": 1,
|
||||
"gejala_terpilih": [1, 5, 6],
|
||||
"hasil_penyakit_id": 1,
|
||||
"confidence_level": 93.0,
|
||||
"created_at": "2026-07-03T12:00:00Z",
|
||||
"updated_at": "2026-07-03T12:00:00Z",
|
||||
"penyakit": {
|
||||
"id": 1,
|
||||
"kode": "P01",
|
||||
"nama": "Trichoderma spp (Jamur Hijau)",
|
||||
"deskripsi": "...",
|
||||
"solusi": ["Pisahkan baglog...", "Gunakan fungisida..."],
|
||||
"bahan": ["Karbendazim 50 WP", "..."],
|
||||
"alat": ["Drum sterilisasi", "..."]
|
||||
}
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📦 Instalasi
|
||||
|
||||
### Prasyarat
|
||||
|
||||
- PHP 8.2+
|
||||
- Composer
|
||||
- Node.js & npm
|
||||
- Database (MySQL atau SQLite)
|
||||
|
||||
### Langkah Instalasi
|
||||
|
||||
```bash
|
||||
# 1. Clone repositori
|
||||
git clone <repository-url>
|
||||
cd jamur
|
||||
|
||||
# 2. Install dependency PHP
|
||||
composer install
|
||||
|
||||
# 3. Install dependency frontend
|
||||
npm install
|
||||
|
||||
# 4. Copy environment
|
||||
cp .env.example .env
|
||||
|
||||
# 5. Generate app key
|
||||
php artisan key:generate
|
||||
|
||||
# 6. Konfigurasi database di .env
|
||||
# Untuk SQLite (default development):
|
||||
# DB_CONNECTION=sqlite
|
||||
# (cukup buat file database/database.sqlite)
|
||||
#
|
||||
# Untuk MySQL:
|
||||
# DB_CONNECTION=mysql
|
||||
# DB_HOST=127.0.0.1
|
||||
# DB_PORT=3306
|
||||
# DB_DATABASE=jamur
|
||||
# DB_USERNAME=root
|
||||
# DB_PASSWORD=
|
||||
|
||||
# 7. Jalankan migrasi + seeder
|
||||
php artisan migrate --seed
|
||||
|
||||
# 8. Build frontend
|
||||
npm run build
|
||||
|
||||
# 9. Jalankan development server
|
||||
php artisan serve
|
||||
|
||||
# Frontend development (opsional):
|
||||
# npm run dev
|
||||
```
|
||||
|
||||
### Perintah Development
|
||||
|
||||
```bash
|
||||
# Jalankan semua service (server, queue, log, vite) sekaligus
|
||||
composer run dev
|
||||
|
||||
# Jalankan test
|
||||
composer run test
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🌱 Seeder Data
|
||||
|
||||
Seeder sudah menyediakan data lengkap:
|
||||
|
||||
| Seeder | Data |
|
||||
|---|---|
|
||||
| `GejalaSeeder` | 24 gejala (G01–G25) |
|
||||
| `PenyakitSeeder` | 10 penyakit (P01–P10) dengan deskripsi, solusi, bahan, dan alat |
|
||||
| `PenyakitGejalaSeeder` | Relasi penyakit-gejala dengan CF Pakar sesuai tabel bobot |
|
||||
|
||||
## 📁 Struktur Direktori (Aplikasi)
|
||||
|
||||
```
|
||||
app/
|
||||
├── Http/Controllers/
|
||||
│ └── DiagnosisController.php # Menangani request diagnosis, riwayat
|
||||
├── Models/
|
||||
│ ├── Penyakit.php # Model penyakit dengan relasi
|
||||
│ ├── Gejala.php # Model gejala dengan relasi
|
||||
│ ├── PenyakitGejala.php # Model pivot CF
|
||||
│ └── DiagnosisHistory.php # Model riwayat diagnosis
|
||||
└── Services/
|
||||
├── DiagnosisService.php # Orchestrator: FC → DT → CF
|
||||
├── ForwardChainingService.php # Rule-based reasoning + decision tree
|
||||
└── CertaintyFactorService.php # CF calculation engine
|
||||
|
||||
database/
|
||||
├── migrations/ # 7 file migrasi
|
||||
└── seeders/ # 4 file seeder
|
||||
|
||||
resources/views/
|
||||
├── layouts/
|
||||
│ ├── app.blade.php # Layout utama (navbar + main)
|
||||
│ ├── home.blade.php # Halaman beranda
|
||||
│ ├── penyakit.blade.php # Galeri penyakit
|
||||
│ └── tentang.blade.php # Halaman tentang
|
||||
└── diagnosis/
|
||||
├── form.blade.php # Form pilih gejala
|
||||
├── hasil.blade.php # Hasil diagnosis
|
||||
└── history.blade.php # Riwayat diagnosis
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 👨💻 Pengembang
|
||||
|
||||
**Tomi Hartanto** — Sistem Pakar Jamur Tiram
|
||||
|
||||
© 2025–2026 — Semua Hak Dilindungi.
|
||||
|
|
|
|||
|
|
@ -42,11 +42,6 @@ public function process(Request $request)
|
|||
|
||||
$results = $this->diagnosisService->diagnose($selectedGejalaIds, $cfUserMap);
|
||||
|
||||
// Batasi cf_percentage maksimal 93% untuk semua hasil
|
||||
foreach ($results as &$result) {
|
||||
$result['cf_percentage'] = min($result['cf_percentage'], 93);
|
||||
}
|
||||
|
||||
// Deduplikasi hasil berdasarkan penyakit ID (SEBELUM cek count)
|
||||
$uniqueResults = [];
|
||||
$seenPenyakitIds = [];
|
||||
|
|
@ -94,7 +89,7 @@ public function process(Request $request)
|
|||
$diseaseDetails[] = [
|
||||
'code' => $penyakit->kode,
|
||||
'name' => $penyakit->nama,
|
||||
'percentage' => min($result['cf_percentage'], 93),
|
||||
'percentage' => $result['cf_percentage'],
|
||||
'missing' => $missingGejalaDetails
|
||||
];
|
||||
}
|
||||
|
|
@ -131,13 +126,10 @@ public function process(Request $request)
|
|||
// Jika hanya 1 penyakit, tampilkan hasil
|
||||
$bestResult = $results[0];
|
||||
|
||||
// Batasi cf_percentage maksimal 93%
|
||||
$cfPercentageCapped = min($bestResult['cf_percentage'], 93);
|
||||
|
||||
$history = $this->diagnosisService->saveHistory(
|
||||
$selectedGejalaIds,
|
||||
$bestResult['penyakit']->id,
|
||||
$cfPercentageCapped
|
||||
$bestResult['cf_percentage']
|
||||
);
|
||||
|
||||
return view('diagnosis.hasil', [
|
||||
|
|
|
|||
|
|
@ -292,10 +292,10 @@ private function extractPenyakitFromBranch(array $branch, array $selectedGejalaI
|
|||
}
|
||||
|
||||
/**
|
||||
* Mencari penyakit berdasarkan gejala.
|
||||
* Jika tidak ada rule yang cocok persis (100% gejala terpenuhi),
|
||||
* kita fallback untuk mengambil semua penyakit yang memiliki SETIDAKNYA SATU gejala yang dipilih
|
||||
* agar Certainty Factor bisa menghitung probabilitasnya.
|
||||
* Mencari penyakit berdasarkan gejala menggunakan AND logic.
|
||||
* Prioritas utama: exact match dengan rule (semua gejala rule harus terpenuhi).
|
||||
* Fallback: penyakit yang memiliki setidaknya satu gejala yang dipilih
|
||||
* (CF tetap menghitung keyakinan secara proporsional).
|
||||
*
|
||||
* @param array $selectedGejalaIds Array ID gejala yang dipilih user
|
||||
* @return array Array of Penyakit models
|
||||
|
|
@ -304,11 +304,10 @@ public function findMatchingDiseases(array $selectedGejalaIds): array
|
|||
{
|
||||
$matchingPenyakitIds = [];
|
||||
|
||||
// 1. Coba cari yang MATCH PERSIS dengan Rule (Forward Chaining)
|
||||
// Prioritas 1: Exact AND match dengan rule
|
||||
foreach ($this->rules as $rule) {
|
||||
$ruleGejalaIds = $rule['gejala_ids'] ?? [];
|
||||
|
||||
// Check if all gejala dalam rule cocok dengan selected gejala
|
||||
$match = true;
|
||||
foreach ($ruleGejalaIds as $gejalaId) {
|
||||
if (!in_array($gejalaId, $selectedGejalaIds)) {
|
||||
|
|
@ -322,8 +321,8 @@ public function findMatchingDiseases(array $selectedGejalaIds): array
|
|||
}
|
||||
}
|
||||
|
||||
// 2. Jika tidak ada rule yang match persis, ambil semua penyakit yang berhubungan
|
||||
// dengan salah satu gejala yang diinput (agar CF bisa bekerja)
|
||||
// Fallback: penyakit dengan gejala terkait (partial match)
|
||||
// CF akan menangani perhitungan keyakinan secara proporsional
|
||||
if (empty($matchingPenyakitIds)) {
|
||||
$penyakitIds = [];
|
||||
foreach ($this->penyakitGejala as $pg) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,127 @@
|
|||
# Decision Tree — Sistem Pakar Diagnosis Jamur Tiram
|
||||
|
||||
## Struktur Pohon Keputusan
|
||||
|
||||
Pohon keputusan ini digunakan oleh sistem untuk menelusuri jalur diagnosis berdasarkan gejala utama (*primary symptoms*). Saat ini pohon memiliki **2 level depth** dengan **8 branch**.
|
||||
|
||||
```
|
||||
root: Diagnosis Jamur Tiram
|
||||
│
|
||||
├── G11 (Tubuh Buah Pucat) ─────┬── G18 (Ada Lendir) → P01 (Trichoderma spp)
|
||||
│ └── G23 (Bau Menyengat) → P04 (Penicilium spp)
|
||||
│
|
||||
├── G12 (Umbi Membusuk) ─────────└── G06 (Substrat Basah) → P02 (Neurospora spp)
|
||||
│
|
||||
├── G10 (Kepala Susu Coklat) ────└── G06 (Substrat Basah) → P03 (Mucor spp)
|
||||
│
|
||||
├── G01 (Jamur Putih/Kepala) ────┬── G10 (Busuk Pangkal) → P05 (Pseudomonas tolaasii)
|
||||
│ └── G02 (Berbau Asam) → P09 (Lalat)
|
||||
│
|
||||
├── G23 (Bau Menyengat) ─────────└── G09 (Berlendir) → P06 (Chaetomium spp)
|
||||
│
|
||||
├── G15 (Kepala Susu Kerdil) ────└── G24 (Warna Tidak Seragam) → P07 (Coprinus spp)
|
||||
│
|
||||
├── G09 (Berlendir) ─────────────└── G20 (Miselium Tidak) → P08 (Tikus)
|
||||
│
|
||||
└── G05 (Pertumbuhan Terganggu) ─└── G19 (Kontaminan) → P10 (Tunggu/Gurem)
|
||||
```
|
||||
|
||||
## Flowchart Decision Tree
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Root([Mulai Diagnosis]) --> Pilih{User memilih gejala}
|
||||
Pilih --> FC[Forward Chaining: cocokkan dengan rule]
|
||||
|
||||
FC --> CekG11{G11 - Tubuh Buah Pucat?}
|
||||
CekG11 -->|Ya| CekG18{G18 - Ada Lendir?}
|
||||
CekG18 -->|Ya| P01[P01 - Trichoderma spp]
|
||||
CekG18 -->|Tidak| CekG23_G11{G23 - Bau Menyengat?}
|
||||
CekG23_G11 -->|Ya| P04[P04 - Penicilium spp]
|
||||
|
||||
FC --> CekG12{G12 - Umbi Membusuk?}
|
||||
CekG12 -->|Ya| CekG06_12{G06 - Substrat Basah?}
|
||||
CekG06_12 -->|Ya| P02[P02 - Neurospora spp]
|
||||
|
||||
FC --> CekG10{G10 - Kepala Susu Coklat?}
|
||||
CekG10 -->|Ya| CekG06_10{G06 - Substrat Basah?}
|
||||
CekG06_10 -->|Ya| P03[P03 - Mucor spp]
|
||||
|
||||
FC --> CekG01{G01 - Jamur Putih pada Kepala Susu?}
|
||||
CekG01 -->|Ya| CekG10_01{G10 - Busuk Pangkal?}
|
||||
CekG10_01 -->|Ya| P05[P05 - Pseudomonas tolaasii]
|
||||
CekG01 -->|Tidak| CekG02{G02 - Berbau Asam?}
|
||||
CekG02 -->|Ya| P09[P09 - Lalat]
|
||||
|
||||
FC --> CekG23_Bau{G23 - Bau Menyengat?}
|
||||
CekG23_Bau -->|Ya| CekG09_23{G09 - Kepala Susu Berlendir?}
|
||||
CekG09_23 -->|Ya| P06[P06 - Chaetomium spp]
|
||||
|
||||
FC --> CekG15{G15 - Kepala Susu Kerdil?}
|
||||
CekG15 -->|Ya| CekG24_15{G24 - Warna Tidak Seragam?}
|
||||
CekG24_15 -->|Ya| P07[P07 - Coprinus spp]
|
||||
|
||||
FC --> CekG09_8{G09 - Baglog Rusak?}
|
||||
CekG09_8 -->|Ya| CekG20{G20 - Miselium Tidak Berkembang?}
|
||||
CekG20 -->|Ya| P08[P08 - Tikus]
|
||||
|
||||
FC --> CekG05{G05 - Pertumbuhan Terganggu?}
|
||||
CekG05 -->|Ya| CekG19{G19 - Kontaminan Terlihat?}
|
||||
CekG19 -->|Ya| P10[P10 - Tunggu/Gurem]
|
||||
|
||||
P01 --> CF[Certainty Factor: hitung keyakinan]
|
||||
P02 --> CF
|
||||
P03 --> CF
|
||||
P04 --> CF
|
||||
P05 --> CF
|
||||
P06 --> CF
|
||||
P07 --> CF
|
||||
P08 --> CF
|
||||
P09 --> CF
|
||||
P10 --> CF
|
||||
|
||||
CF --> Hasil([Tampilkan Hasil Diagnosis])
|
||||
```
|
||||
|
||||
## Mapping Leaf ke Penyakit
|
||||
|
||||
| Leaf Node | Gejala Utama | Gejala Pendukung | Rule | Penyakit |
|
||||
|---|---|---|---|---|
|
||||
| Branch 1a | G11 | G18 | R1 | P01 — Trichoderma spp |
|
||||
| Branch 1b | G11 | G23 | R4 | P04 — Penicilium spp |
|
||||
| Branch 2 | G12 | G06 | R2 | P02 — Neurospora spp |
|
||||
| Branch 3 | G10 | G06 | R3 | P03 — Mucor spp |
|
||||
| Branch 4a | G01 | G10 | R5 | P05 — Pseudomonas tolaasii |
|
||||
| Branch 4b | G01 | G02 | R9 | P09 — Lalat |
|
||||
| Branch 5 | G23 | G09 | R6 | P06 — Chaetomium spp |
|
||||
| Branch 6 | G15 | G24 | R7 | P07 — Coprinus spp |
|
||||
| Branch 7 | G09 | G20 | R8 | P08 — Tikus |
|
||||
| Branch 8 | G05 | G19 | R10 | P10 — Tunggu/Gurem |
|
||||
|
||||
## Primary Symptoms
|
||||
|
||||
Gejala utama yang digunakan untuk *initial split* dalam decision tree:
|
||||
|
||||
| ID Gejala | Kode | Nama Gejala |
|
||||
|---|---|---|
|
||||
| 1 | G01 | Jamur tiram terlihat membusuk |
|
||||
| 5 | G06 | Pertumbuhan jamur tiram lambat |
|
||||
| 8 | G09 | Baglog/media jamur tiram rusak |
|
||||
| 11 | G12 | Bintik-bintik noda hijau pada baglog |
|
||||
| 12 | G13 | Tepung warna orange pada baglog |
|
||||
| 14 | G15 | Warna biru pada ujung jamur tiram |
|
||||
|
||||
## Cara Kerja Traversal
|
||||
|
||||
1. Sistem mengambil semua branch level-1 dari `root.branches`
|
||||
2. Untuk setiap branch, dicek apakah `symptom_id` branch termasuk dalam gejala yang dipilih user
|
||||
3. Jika ya, branch dicatat sebagai `matched` dan sistem menelusuri `children`
|
||||
4. Sistem mengumpulkan semua `possible_penyakit_ids` dari branch dan children yang cocok
|
||||
5. Hasil traversal digunakan sebagai **reasoning path** untuk transparansi diagnosis
|
||||
|
||||
## Catatan
|
||||
|
||||
- Decision tree saat ini ***hardcoded*** di `app/Services/ForwardChainingService.php`
|
||||
- Struktur tree bersifat statis (2 level, 8 branch)
|
||||
- Traversal hanya memeriksa kecocokan symptom_id, tidak memvalidasi jumlah gejala
|
||||
- Hasil traversal bersifat informasional untuk menampilkan jalur diagnosis
|
||||
|
|
@ -0,0 +1,239 @@
|
|||
# Perhitungan Sistem Pakar Diagnosis Jamur Tiram
|
||||
|
||||
---
|
||||
|
||||
## Tabel Gejala (G01–G25)
|
||||
|
||||
| Kode | Nama Gejala |
|
||||
|------|-------------|
|
||||
| G01 | Jamur tiram terlihat membusuk |
|
||||
| G02 | Jamur tiram terlihat keriput |
|
||||
| G03 | Jamur tiram terlihat berlendir |
|
||||
| G04 | Batang jamur tiram terlihat berlubang |
|
||||
| G05 | Jamur tiram hanya tumbuh kecil |
|
||||
| G06 | Pertumbuhan jamur tiram lambat |
|
||||
| G07 | Jamur tiram tidak tumbuh |
|
||||
| G08 | Plastik baglog terlihat berlubang |
|
||||
| G09 | Baglog/media jamur tiram rusak |
|
||||
| G10 | Bau jamur tiram menyengat |
|
||||
| G11 | Pada media baglog terdapat noda warna hitam |
|
||||
| G12 | Pada media baglog terdapat bintik-bintik noda hijau |
|
||||
| G13 | Pada permukaan baglog terdapat tepung warna orange |
|
||||
| G14 | Terdapat bintik-bintik kuning coklat pada jamur tiram |
|
||||
| G15 | Terdapat warna biru pada ujung jamur tiram |
|
||||
| G16 | Jamur tiram terdapat bekas luka |
|
||||
| G17 | Perubahan aroma dan rasa |
|
||||
| G18 | Terdapat noda hijau di daun jamur |
|
||||
| G19 | Perakaran jamur tiram lembek |
|
||||
| G20 | Jamur tiram rontok |
|
||||
| G21 | Ukuran dan bentuk spora tidak normal |
|
||||
| G22 | Perubahan tekstur jamur lembek |
|
||||
| G23 | Pada miselium terdapat warna coklat atau merah tua |
|
||||
| G24 | Kerusakan pada tubuh buah jamur tiram |
|
||||
| G25 | Batang jamur tiram terlihat berlubang |
|
||||
|
||||
## Tabel Penyakit (P01–P10)
|
||||
|
||||
| Kode | Nama Penyakit | Tipe |
|
||||
|------|---------------|------|
|
||||
| P01 | Trichoderma spp (Jamur Hijau) | Jamur |
|
||||
| P02 | Neurospora spp | Jamur |
|
||||
| P03 | Mucor spp | Jamur |
|
||||
| P04 | Penicilium spp | Jamur |
|
||||
| P05 | Pseudomonas tolaasii (Brown Blotch) | Bakteri |
|
||||
| P06 | Chaetomium spp | Jamur |
|
||||
| P07 | Coprinus spp (Jamur Liar) | Jamur |
|
||||
| P08 | Tikus | Hama Binatang |
|
||||
| P09 | Lalat | Hama Serangga |
|
||||
| P10 | Tunggu/Gurem (Acari) | Hama Serangga |
|
||||
|
||||
---
|
||||
|
||||
## Forward Chaining
|
||||
|
||||
### Aturan (Rule) Sistem Pakar
|
||||
|
||||
| Rule | Penyakit | Gejala Wajib |
|
||||
|------|----------|-------------|
|
||||
| R1 | **Trichoderma spp** (P01) | G12, G18, G06, G07 |
|
||||
| R2 | **Neurospora spp** (P02) | G13, G06, G07 |
|
||||
| R3 | **Mucor spp** (P03) | G11, G06, G07 |
|
||||
| R4 | **Penicilium spp** (P04) | G12, G23, G06 |
|
||||
| R5 | **Pseudomonas tolaasii** (P05) | G01, G10, G14, G22 |
|
||||
| R6 | **Chaetomium spp** (P06) | G23, G06, G09 |
|
||||
| R7 | **Coprinus spp** (P07) | G15, G24, G20 |
|
||||
| R8 | **Tikus** (P08) | G09, G24, G20 |
|
||||
| R9 | **Lalat** (P09) | G01, G02, G25 |
|
||||
| R10 | **Tunggu/Gurem** (P10) | G05, G19, G25 |
|
||||
|
||||
### Contoh Forward Chaining
|
||||
|
||||
**Kasus:** User memilih gejala G12, G18, G06, G07
|
||||
|
||||
| Kode Gejala | Nama Gejala | CF Pakar | CF User | Keterangan |
|
||||
|-------------|-------------|----------|---------|------------|
|
||||
| G12 | Bintik-bintik noda hijau pada baglog | 1.0 | 0.8 | Cocok dengan R1 |
|
||||
| G18 | Noda hijau di daun jamur | 0.8 | 0.8 | Cocok dengan R1 |
|
||||
| G06 | Pertumbuhan jamur tiram lambat | 0.6 | 0.8 | Cocok dengan R1 |
|
||||
| G07 | Jamur tiram tidak tumbuh | 0.8 | 0.8 | Cocok dengan R1 |
|
||||
|
||||
**Hasil Forward Chaining:** Rule R1 terpenuhi → **Trichoderma spp** (P01)
|
||||
|
||||
---
|
||||
|
||||
## Certainty Factor
|
||||
|
||||
### Rumus
|
||||
|
||||
**Langkah 1:** Hitung CF untuk setiap gejala
|
||||
|
||||
$$CF[H,E] = CF[User] \times CF[Pakar]$$
|
||||
|
||||
**Langkah 2:** Kombinasikan seluruh gejala
|
||||
|
||||
$$CF_{combine} = CF_1 + CF_2 \times (1 - CF_1)$$
|
||||
|
||||
**Langkah 3:** Konversi ke persentase
|
||||
|
||||
$$CF_{\%} = CF_{final} \times 100$$
|
||||
|
||||
### Contoh 1: Trichoderma spp (P01)
|
||||
|
||||
**Gejala dipilih:** G12, G18, G06, G07 — semua CF User = 0.8
|
||||
|
||||
| Langkah | Gejala | CF Pakar | CF User | $CF[H,E]$ |
|
||||
|---------|--------|----------|---------|-----------|
|
||||
| 1 | G12 | 1.0 | 0.8 | $1.0 \times 0.8 = 0.80$ |
|
||||
| 2 | G18 | 0.8 | 0.8 | $0.8 \times 0.8 = 0.64$ |
|
||||
| 3 | G06 | 0.6 | 0.8 | $0.6 \times 0.8 = 0.48$ |
|
||||
| 4 | G07 | 0.8 | 0.8 | $0.8 \times 0.8 = 0.64$ |
|
||||
|
||||
**Kombinasi:**
|
||||
|
||||
$$CF_1 = 0.80$$
|
||||
|
||||
$$CF_2 = 0.80 + 0.64 \times (1 - 0.80) = 0.80 + 0.128 = 0.928$$
|
||||
|
||||
$$CF_3 = 0.928 + 0.48 \times (1 - 0.928) = 0.928 + 0.03456 = 0.96256$$
|
||||
|
||||
$$CF_4 = 0.96256 + 0.64 \times (1 - 0.96256) = 0.96256 + 0.02396 = 0.98652$$
|
||||
|
||||
$$CF_{\%} = 0.98652 \times 100 = 98.65\%$$
|
||||
|
||||
**Kesimpulan:** **Trichoderma spp** (P01) dengan keyakinan **98.65%** — Sangat Yakin
|
||||
|
||||
### Contoh 2: Pseudomonas tolaasii (P05)
|
||||
|
||||
**Gejala dipilih:** G01, G10, G14, G22 — semua CF User = 0.8
|
||||
|
||||
| Langkah | Gejala | CF Pakar | CF User | $CF[H,E]$ |
|
||||
|---------|--------|----------|---------|-----------|
|
||||
| 1 | G01 | 1.0 | 0.8 | $1.0 \times 0.8 = 0.80$ |
|
||||
| 2 | G10 | 0.8 | 0.8 | $0.8 \times 0.8 = 0.64$ |
|
||||
| 3 | G14 | 0.8 | 0.8 | $0.8 \times 0.8 = 0.64$ |
|
||||
| 4 | G22 | 0.8 | 0.8 | $0.8 \times 0.8 = 0.64$ |
|
||||
|
||||
**Kombinasi:**
|
||||
|
||||
$$CF_1 = 0.80$$
|
||||
|
||||
$$CF_2 = 0.80 + 0.64 \times (1 - 0.80) = 0.928$$
|
||||
|
||||
$$CF_3 = 0.928 + 0.64 \times (1 - 0.928) = 0.97408$$
|
||||
|
||||
$$CF_4 = 0.97408 + 0.64 \times (1 - 0.97408) = 0.99067$$
|
||||
|
||||
$$CF_{\%} = 0.99067 \times 100 = 99.07\%$$
|
||||
|
||||
**Kesimpulan:** **Pseudomonas tolaasii** (P05) dengan keyakinan **99.07%** — Sangat Yakin
|
||||
|
||||
### Contoh 3: Neurospora spp (P02)
|
||||
|
||||
**Gejala dipilih:** G13, G06, G07 — semua CF User = 0.8
|
||||
|
||||
| Langkah | Gejala | CF Pakar | CF User | $CF[H,E]$ |
|
||||
|---------|--------|----------|---------|-----------|
|
||||
| 1 | G13 | 1.0 | 0.8 | $1.0 \times 0.8 = 0.80$ |
|
||||
| 2 | G06 | 0.6 | 0.8 | $0.6 \times 0.8 = 0.48$ |
|
||||
| 3 | G07 | 0.8 | 0.8 | $0.8 \times 0.8 = 0.64$ |
|
||||
|
||||
**Kombinasi:**
|
||||
|
||||
$$CF_1 = 0.80$$
|
||||
|
||||
$$CF_2 = 0.80 + 0.48 \times (1 - 0.80) = 0.896$$
|
||||
|
||||
$$CF_3 = 0.896 + 0.64 \times (1 - 0.896) = 0.96256$$
|
||||
|
||||
$$CF_{\%} = 0.96256 \times 100 = 96.26\%$$
|
||||
|
||||
**Kesimpulan:** **Neurospora spp** (P02) dengan keyakinan **96.26%** — Sangat Yakin
|
||||
|
||||
### Contoh 4: Penicilium spp (P04) — Partial Match
|
||||
|
||||
**Gejala dipilih:** G12 (CF 0.8), G23 (CF 0.6), G06 (CF 0.8)
|
||||
|
||||
| Langkah | Gejala | CF Pakar | CF User | $CF[H,E]$ |
|
||||
|---------|--------|----------|---------|-----------|
|
||||
| 1 | G12 | 1.0 | 0.8 | $1.0 \times 0.8 = 0.80$ |
|
||||
| 2 | G23 | 0.8 | 0.6 | $0.8 \times 0.6 = 0.48$ |
|
||||
| 3 | G06 | 0.6 | 0.8 | $0.6 \times 0.8 = 0.48$ |
|
||||
|
||||
> **Catatan:** Untuk penyakit **Trichoderma spp** (P01) yang juga memiliki G12, perhitungan akan berbeda karena gejala yang cocok tidak sama.
|
||||
|
||||
**Kombinasi:**
|
||||
|
||||
$$CF_1 = 0.80$$
|
||||
|
||||
$$CF_2 = 0.80 + 0.48 \times (1 - 0.80) = 0.896$$
|
||||
|
||||
$$CF_3 = 0.896 + 0.48 \times (1 - 0.896) = 0.94592$$
|
||||
|
||||
$$CF_{\%} = 0.94592 \times 100 = 94.59\%$$
|
||||
|
||||
**Kesimpulan:** **Penicilium spp** (P04) dengan keyakinan **94.59%** — Sangat Yakin
|
||||
|
||||
### Contoh 5: Multipenyakit (CF User Berbeda)
|
||||
|
||||
**Gejala dipilih:** G01 (CF 0.6), G14 (CF 0.8), G22 (CF 0.4)
|
||||
|
||||
Forward Chaining: tidak ada exact match → fallback ke penyakit dengan gejala terkait
|
||||
|
||||
**P05 — Pseudomonas tolaasii** (memiliki G01, G14, G22)
|
||||
|
||||
| Langkah | Gejala | CF Pakar | CF User | $CF[H,E]$ |
|
||||
|---------|--------|----------|---------|-----------|
|
||||
| 1 | G01 | 1.0 | 0.6 | $1.0 \times 0.6 = 0.60$ |
|
||||
| 2 | G14 | 0.8 | 0.8 | $0.8 \times 0.8 = 0.64$ |
|
||||
| 3 | G22 | 0.8 | 0.4 | $0.8 \times 0.4 = 0.32$ |
|
||||
|
||||
$$CF_1 = 0.60$$
|
||||
|
||||
$$CF_2 = 0.60 + 0.64 \times (1 - 0.60) = 0.60 + 0.256 = 0.856$$
|
||||
|
||||
$$CF_3 = 0.856 + 0.32 \times (1 - 0.856) = 0.856 + 0.04608 = 0.90208$$
|
||||
|
||||
$$CF_{\%} = 0.90208 \times 100 = 90.21\%$$
|
||||
|
||||
**P09 — Lalat** (memiliki G01)
|
||||
|
||||
$$\text{Hanya 1 gejala: } CF = 1.0 \times 0.6 = 0.60$$
|
||||
|
||||
$$CF_{\%} = 60\%$$
|
||||
|
||||
**Hasil Akhir:**
|
||||
|
||||
| Peringkat | Penyakit | Keyakinan | Status |
|
||||
|-----------|----------|-----------|--------|
|
||||
| 1 | **Pseudomonas tolaasii** (P05) | 90.21% | Sangat Yakin |
|
||||
| 2 | **Lalat** (P09) | 60% | Cukup Yakin |
|
||||
|
||||
### Tabel Kategori Keyakinan
|
||||
|
||||
| CF Value | Status |
|
||||
|----------|--------|
|
||||
| $\geq 0.9$ | Sangat Yakin |
|
||||
| $0.8 - 0.9$ | Yakin |
|
||||
| $0.6 - 0.8$ | Cukup Yakin |
|
||||
| $0.4 - 0.6$ | Sedikit Yakin |
|
||||
| $< 0.4$ | Tidak Yakin |
|
||||
|
|
@ -45,16 +45,31 @@
|
|||
type="checkbox"
|
||||
name="gejala_ids[]"
|
||||
value="{{ $gejala->id }}"
|
||||
onchange="toggleCfUser(this, {{ $gejala->id }})"
|
||||
class="h-5 w-5 rounded border-green-300 text-green-600 focus:ring-green-500">
|
||||
</div>
|
||||
|
||||
</label>
|
||||
|
||||
<input type="hidden" name="cf_user[{{ $gejala->id }}]" value="0.8">
|
||||
<select name="cf_user[{{ $gejala->id }}]" id="cf_user_{{ $gejala->id }}"
|
||||
class="mt-2 w-full rounded-lg border border-green-300 bg-white px-2 py-1 text-xs text-gray-700 focus:ring-green-500" disabled>
|
||||
<option value="0">0 - Tidak Yakin</option>
|
||||
<option value="0.4">0.4 - Kurang Yakin</option>
|
||||
<option value="0.6">0.6 - Cukup Yakin</option>
|
||||
<option value="0.8" selected>0.8 - Yakin</option>
|
||||
<option value="1.0">1.0 - Sangat Yakin</option>
|
||||
</select>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function toggleCfUser(checkbox, id) {
|
||||
const select = document.getElementById('cf_user_' + id);
|
||||
select.disabled = !checkbox.checked;
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- Tombol Diagnosis -->
|
||||
<div class="mt-10 text-center">
|
||||
<button type="submit"
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ class="text-sm font-medium uppercase tracking-wider text-white decoration-white
|
|||
<span class="text-sm font-medium leading-tight text-white opacity-80">Tingkat
|
||||
Keyakinan:</span>
|
||||
<div class="text-4xl font-black leading-tight text-white">
|
||||
{{ min($bestResult['cf_percentage'], 93) }}%</div>
|
||||
{{ $bestResult['cf_percentage'] }}%</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue