{"id":51017956,"url":"https://github.com/franzxml/wisata-gen","last_synced_at":"2026-06-21T13:30:28.433Z","repository":{"id":362876186,"uuid":"1260439086","full_name":"franzxml/wisata-gen","owner":"franzxml","description":"Aplikasi optimasi paket wisata Indonesia menggunakan Algoritma Genetika dengan representasi binary encoding.","archived":false,"fork":false,"pushed_at":"2026-06-06T09:46:02.000Z","size":2179,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-06T11:16:04.291Z","etag":null,"topics":["algoritma-genetika","python","wisata"],"latest_commit_sha":null,"homepage":"https://wisata-gen.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/franzxml.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-05T13:49:02.000Z","updated_at":"2026-06-06T09:46:06.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/franzxml/wisata-gen","commit_stats":null,"previous_names":["franzxml/wisata-gen"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/franzxml/wisata-gen","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzxml%2Fwisata-gen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzxml%2Fwisata-gen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzxml%2Fwisata-gen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzxml%2Fwisata-gen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/franzxml","download_url":"https://codeload.github.com/franzxml/wisata-gen/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzxml%2Fwisata-gen/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34610832,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-21T02:00:05.568Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algoritma-genetika","python","wisata"],"created_at":"2026-06-21T13:30:27.824Z","updated_at":"2026-06-21T13:30:28.422Z","avatar_url":"https://github.com/franzxml.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Fitur\n\n- Optimasi kombinasi paket wisata dari 20 destinasi Indonesia menggunakan Algoritma Genetika\n- Representasi kromosom binary (20-bit) - setiap bit merepresentasikan apakah paket ke-i dipilih\n- Fungsi fitness multi-kriteria: rata-rata rating, total destinasi, efisiensi harga, dan pemanfaatan durasi\n- Repair operator untuk menjaga feasibility constraint anggaran dan durasi sepanjang evolusi\n- Seleksi tournament dan roulette wheel\n- Uniform crossover pada bit array - gen benar-benar ditukar antar kromosom\n- Bit-flip mutation dengan probabilitas per-bit\n- Elitisme 1 individu terbaik per generasi\n- Grafik konvergensi fitness terbaik, rata-rata, dan terburuk per generasi (custom SVG)\n- Konfigurasi parameter GA secara manual (ukuran populasi, probabilitas crossover, probabilitas mutasi, jumlah generasi, metode seleksi)\n- Antarmuka web responsif berbasis React dengan scroll-snap\n\n## Teknologi\n\n- **Runtime:** Python 3.8+, Bun\n- **Backend:** FastAPI, Uvicorn, Pydantic v2\n- **Frontend:** React 19, Vite, TypeScript, Tailwind CSS 4\n\n## Struktur Folder\n\n```\nwisata-gen/\n├── apps/\n│   ├── backend/\n│   │   └── app/\n│   │       ├── ga/\n│   │       │   ├── dataset.py      # 20 paket wisata Indonesia dan konstanta fitness\n│   │       │   └── engine.py       # Logika GA: inisialisasi, seleksi, crossover, mutasi, repair\n│   │       ├── routers/\n│   │       │   └── optimize.py     # POST /api/optimize\n│   │       ├── schemas.py          # Pydantic models request dan response\n│   │       └── main.py             # FastAPI app\n│   └── frontend/\n│       └── src/\n│           ├── components/         # HeroSection, FormSection, ResultSection, ResultsView, PackageCard, ConvergenceChart, DatasetView\n│           └── App.tsx\n├── packages/\n│   └── shared/                     # Types dan utils bersama (TypeScript)\n├── package.json                    # Bun workspaces root\n└── .gitignore\n```\n\n## Cara Menjalankan\n\n**Prasyarat sistem:**\n```bash\npython3 --version   # 3.8+\nbun --version       # versi terbaru\n```\n\n1. Clone repositori:\n   ```bash\n   git clone https://github.com/franzxml/wisata-gen.git \u0026\u0026 cd wisata-gen\n   ```\n\n2. Setup virtual environment backend:\n   ```bash\n   python3 -m venv apps/backend/.venv\n   source apps/backend/.venv/bin/activate\n   pip install -r apps/backend/requirements.txt\n   ```\n\n3. Install dependensi frontend:\n   ```bash\n   bun install\n   ```\n\n4. Build shared package:\n   ```bash\n   bun build:shared\n   ```\n\n5. Jalankan seluruh aplikasi:\n   ```bash\n   bun dev\n   ```\n\n6. Buka browser:\n   ```\n   http://localhost:5173\n   ```\n   API berjalan di `http://localhost:8000`.\n\n## Scripts\n\n| Perintah | Keterangan |\n|---|---|\n| `bun dev` | Jalankan backend dan frontend secara paralel |\n| `bun dev:be` | Jalankan hanya backend FastAPI |\n| `bun dev:fe` | Jalankan hanya frontend Vite |\n| `bun build` | Build shared package dan frontend untuk produksi |\n| `bun typecheck` | Type check seluruh workspace |\n\n## API Endpoint\n\n| Method | Endpoint | Keterangan |\n|---|---|---|\n| POST | `/api/optimize` | Jalankan GA, kembalikan hasil optimasi lengkap |\n| GET | `/api/health` | Cek status API |\n\n## Parameter GA\n\n| Parameter | Nilai Default |\n|---|---|\n| Ukuran Populasi | 50 |\n| Jumlah Generasi Maksimum | 100 |\n| Probabilitas Crossover | 0.8 |\n| Probabilitas Mutasi per-bit | 0.05 |\n| Metode Seleksi | Tournament (size=3) |\n| Metode Crossover | Uniform |\n| Metode Mutasi | Bit-flip |\n| Elitisme | 1 individu terbaik |\n\n## Constraints\n\n| Parameter | Batas |\n|---|---|\n| Anggaran | Configurable - default Rp 8.000.000 |\n| Durasi | Configurable - default 7 hari |\n\nKromosom yang melanggar constraint diperbaiki oleh *repair operator* setelah crossover dan mutasi.\n\n## Fungsi Fitness\n\nSkor fitness dinormalisasi 0-1 dengan bobot per kriteria:\n\n| Kriteria | Bobot |\n|---|---|\n| Rata-rata rating paket terpilih | 0.35 |\n| Total destinasi (cap 20) | 0.25 |\n| Efisiensi harga (lebih murah = lebih tinggi) | 0.25 |\n| Pemanfaatan durasi (mendekati batas = tinggi) | 0.15 |\n| Bonus soft constraint (maks +0.10) | - |\n\nNilai fitness maksimum ~1.10.\n\n## Deployment\n\nhttps://wisata-gen.vercel.app\n\n## Pengembang\n\n- [franzxml](https://github.com/franzxml)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffranzxml%2Fwisata-gen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffranzxml%2Fwisata-gen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffranzxml%2Fwisata-gen/lists"}