啟發式最佳化演算法帶給我的成長

:::warning 這篇文涉及到的觀念比較複雜,建議沒有經驗的讀者可以使用維基百科輔助理解這篇文的內容。 ::: :::warning 筆者對於 P 與 NP 問題的詳細定義可能存在些許誤解或理解不夠全面,因此如果文中出現錯誤麻煩告知,會儘快修正。 ::: 起因 上了大學之後因為對自己的專業技能抱有期待能夠發揮在一些地方, 因此我很主動在詢問學校的資源, 教授剛好藉機向我介紹實驗室這個地方, 於是在我好奇心的驅使下在大一還是個新生時就進入了學校實驗室, 後來從教授口中得知實驗室有在做最佳化演算法的實驗, 目的是改善現有的演算法, 並且從演算法的角度出發去找到更高效率的演算法, 實驗室已經有實現出 Python 版本, 而我負責改寫為 C++ 並且提升效能。 也算是幫忙寫 code 順便賺點零用錢。 P=NP 問題與時間複雜度 關於最佳化演算法的出現首先要提起 P=NP 問題, 這是著名的千禧年難題之一, 在介紹這個問題前, 我先簡單解釋什麼是「時間複雜度」, 時間複雜度用於表示一個演算法需要花多少時間解決問題, 通常人們習慣用大O表示法來表達時間複雜度, 並以 n 作為問題大小, 例如遍歷一個陣列的時間複雜度為 O(n), 表示使用問題大小的時間(操作次數)可以解決此問題。 P 與 NP P 代表的是多項式時間, 也就是在次方項為常數的時間複雜度, 因為次方向如果為 n 的話會導致花費的時間隨著問題大小成指數成長, 也就是 NP, 因此問題只要變大很快就會變得無法計算, 因此需要隨著問題大小讓時間線性成長的演算法來解決 NP 問題。 啟發式與最佳化演算法 啟發式演算法是藉由學習或模仿自然界已有的可行方案例如蟻群、狼群尋找食物的方式之類的行為來設計一套演算法, 也有藉由退火啟發的演算法, 都是想要藉由演化或其他自然界的力量來處理問題。 最佳化演算法是專為一系列的 NP 問題而誕生。 區域最佳解與全域最佳解 一個大的 NP 問題中在我們使用最佳化演算法時會遇到一個重要的問題, 要如何調配區域搜尋和全域搜尋的比例, 若區域搜尋過多會停留在區域最佳解, 過少則會導致解往更好方向的收斂速度過慢, 從而浪費時間。 ...

December 19, 2023

大學生資源統整

最近剛上大學發現還蠻多大學生專屬的優惠, 在這邊統整給大家, 如果有沒寫到的都歡迎私訊我, 我會更新上來。 軟體 Apple Music 90$ 月費 我之前幾年都是用 Apple Music 聽音樂, 上大學之後我申請了學生方案讓原本 150$ 的月費變成 70$, 但最近似乎要漲價到 90$,但以 Apple Music 介面和音質等等的綜合體驗來說還是推薦可以用, 不過後來因為 YouTube 封鎖廣告阻擋器之後就和別人合租了 YouTube Premium 家庭方案。 Github Student pack 0$ 學生方案 Github Student Pack 是我最推薦的學生方案, 完全免費就有許多非常好的工具和服務可以用。 像是免費的網域名稱、虛擬主機還有 Github Copilot、全套 Jetbrains IDE 和其他一大堆合作的公司都有推出學生優惠, 不用真的很可惜。 YouTube Premium 119$ 月費 如果 YouTube Premium 找不到其他人合租的話可以考慮, 個人覺得有 YouTube 無廣告 + 歌曲最豐富的音樂串流這兩點來說還算划算。 其他 台灣高鐵 大學生優惠方案 台灣高鐵有一些車次有賣大學生的 85 折和 75、65 折票, 通常離峰時段的優惠會更多, 尖峰時段的折扣很少, 如果是大學生的話可以多利用離峰時段搭高鐵或是事先訂票才比較容易省下一些錢。 Apple - Back To School Apple 對於大學生買 iPad 和 Mac 有可以搭配 airpods 的折扣, 但我自己沒用過, 詳細的折扣內容可以到 Apple 官網看。

December 18, 2023

去中心化是人與人連結的起點,也是終點

綜觀網際網路的大規模擴張從最早的 email 到目前主流的社群如 Facebook Instagram Discord 等等, 我們可以發現社群中心化的概念最早是由臉書開始, 但後來臉書也開始做封閉社群,例如 Facebook 社團。 換個角度看人們從使用電子郵件開始原本就是去中心化的(可能當時也沒有足夠的資源和技術做到社群中心化), 後來中心化以後卻又反其道而行, 做回了群組、社群導向的軟體, 而不是全面往每個人都可以瀏覽的粉絲專頁這種形式推進。 我認為這樣做肯定有一些考量, 例如讓使用者更容易接觸興趣和理念相近的人, 並且防止不停出現使用者沒有興趣的貼文, 但這樣做也同時加深了同溫層, 讓不同立場和觀點的人較難互相理解。 換個方向想,我們真的需要「中心」嗎? 我想答案很明顯,當然不需要。 現在各種社群軟體百家爭鳴, 即使世界主流的社群軟體還是沒有改變, 但像是 Reddit, Discord 等等社群依然不停出現, 不僅僅是因為使用者的習慣和需求不同, 也同時有人與人互動方式的原因。 我們可以把所有社群軟體都放到一條擁有兩個極端的線上, 這條線的最左邊代表完全中心化, 最右邊則代表完全去中心化, 也就是擁有最多的少量使用者組成的群體, 一開始的臉書就在這條線的最左端, 但這顯然沒有辦法應對所有人的需求, 於是有許多社群軟體在後面憑藉著擁有多個小群體的優勢後來快速崛起。 中心化就像是養雞場 臉書在早年時因為對手很少而擁有的大量的使用者快速湧入, 但臉書也有隨著使用者的喜好做出相對應的動作, 例如在處理個人偏好的問題時就使用了著名的貼文推送演算法, 藉此來滿足每個個人的喜好, 也建立了社團這種小群, 雖然名義上是獨立社群但還是基於你是臉書使用者的基礎才能夠加入。 對我來說臉書這種中心化社群軟體就像一個大型高科技養雞場, 每一個使用者不論加入了什麼社團、喜歡哪些貼文、與哪些人成為好友甚至幾年幾月幾日在哪裡打卡都被記錄得一清二楚, 還記得有一句話叫做臉書比你媽還了解你, 這就是原因。 再說臉書擁有數十億位使用者, 代表世界上接近一半的人都在使用臉書, 平常卻很少有人在思考自己被賣給廣告商的資訊是不是根本不應該洩露給把你個資賣掉的平台。 花一點小錢保護自己的個資並且還給自己無廣告且自由的友善空間 以前有寫過關於 Home Server 和 self host 的文, 像這種形態的伺服器就很適合拿來架設自己的社群軟體, 目前主流開源的去中心化社群是 Mastodon, 如果不認識的話可以參考維基百科上的條目:「聯邦宇宙」這是我認為社群軟體最後的理想型態, 不需要擔心個資外洩的同時也不用被廣告折磨, 更不會推送為了博取你注意力的短影音, 因為在聯邦宇宙上使用者不再是一個商品, 而是一個單純的、支撐起整個社群的支柱。 當然普通人很少會選擇自己架設社群軟體, 因此也有許多公開的 Mastodon 節點可供使用, 比起自架來的更穩定而且免錢, 非常值得任何人嘗試。

November 18, 2023

給自己三天時間清除資訊垃圾

現代大多數人每天都在使用手機和電腦等等電子產品, 能夠在短時間內吸收大量資訊確實也是一大優勢, 但大多數人卻忽略了自己也身處資訊垃圾堆中。 資訊垃圾的形式有非常多, 從信箱裡的垃圾郵件、社群軟體上的無意義通知, 到內容超載的短影片。 許多時候我們在不注意的情況下就花了好幾個小時瀏覽這些內容, 但結果就是一無所獲。 該從哪裡做起 過濾資訊垃圾的方式很多, 只要是瀏覽後不需要採取任何動作或回應的就算, 這邊舉幾個基本例子, 其中最重要的目的就是不要讓這些東西干擾自已的工作效率, 減少專注期間被中斷的可能性, 同時降低平時動不動就無意義查看手機的機會。 取消訂閱不需要的電子郵件 退追蹤、退訂閱不必要、不常看和農場內容 清除備份好的照片、影片、文件 退追蹤、移除多年沒有聯絡的人 刪除手機上不怎麼使用的 app 關閉非重要訊息的通知 清理完之後應該繼續做的事 清理完之後並不等於結束, 想要長時間保持著不被資訊垃圾淹沒的話, 還要持續的檢查自己的習慣, 例如在每天結束前檢查一下自己的手機和電腦。 以下是我自己的習慣: 申請新帳號時不要訂閱電子報 查看電子郵件時順便清除不需要保留的郵件 把每天上課拍的板書照片刪除 不定期清除手機上的 app 和照片和電腦上的檔案 我從這之中獲得的好處 其實清理資訊垃圾不只在於減少接收不必要的資訊, 同時也可以回顧以前瀏覽過, 買過或是去碰過什麼東西, 對於自己資料例如電子郵件、文件、照片、影片等等佔用多少大小、如何整理也會更有把握。 就像整理現實中的空間一樣, 整理資訊垃圾以後對於空間整體的把握度也會更高, 可以更快找到自己要的東西, 也可以更容易發覺哪些東西自己真正需要, 哪些東西只是在佔用空間。

October 29, 2023

如果你是個新手 Fedora 可能適合你

前言 前陣子買了一條 2TB 的 SSD, 但是因為之前使用 arch linux 有太多需要手動設定的地方, 而且我都直接裝 gnome, 那陣子剛好看到很多人都在推 fedora, 於是我就決定試試看。 安裝 安裝上 fedora 有提供圖形化的使用者介面來選擇要把系統裝在哪顆硬碟, 並且操作上因為圖形化也更直覺, 裝好之後我先裝了一些我常用的軟體, 並且熟悉一下套件管理工具 dnf。 我發現 fedora 有許多地方都已經幫使用者預先處理好了, 雖然少了一點手動配置的樂趣, 但也省下了很多時間, 更適合新手入門 linux 但不想選擇大家都在用的 ubuntu 的人。 使用體驗 日常 使用上其實與 archlinux 裝了 gnome 非常接近, 但是比較不會遇到一些小東西需要一直去調整, 像是字體和輸入法設定就方便許多。 遊戲 遊戲的話使用 steam 的黑魔法一樣可以玩原本只能在 Windows 上執行的遊戲, 就算是 3A 大作也可以有幾乎和 Windows 版本一樣的效能, 但是我自己感覺打 Apex Legends 時滑鼠似乎有一點點的輸入延遲, 也可能是羅技驅動程式的問題。 總結 如果你想試試看 Linux 但是不想選擇大家都在用的 ubuntu, 也不想花一堆時間在各種細節的設定上, 並且也對電腦底層不熟, 那 fedora 可以幫助你省下很多時間, 並且讓你可以更快的上手 linux。

October 17, 2023

專題作品:yush

高中三年級的專題我做出了 yush, 算是一個輕量化的 shell, 可以執行在不同平台上, 並且擁有基本的指令功能, 同時這專題也是我這學期學校成績拿最高的一個科目, 以下附上 Github 連結: yush :::tip 以下是我張貼在社群媒體上的原文。 ::: (已編輯) 我用 C++ 寫了一個 shell,並且我打算稱它為 yush。 yush 目前是一個成長中的 shell 專案,作為我個人第一個較大的 C++ 專案,原本設計是跨平台,但因涉及底層許多操作邏輯不同因此暫時取消了 Windows 的支援,僅保留了 Unix-like 的 MacOS 和 Linux。 另外,yush 其實還沒完成,程式還欠缺部分功能,如果有人參與開發或是告訴我哪裡能改進我會很感謝你們的。 詳細內容請看 Github 連結:https://github.com/Young-TW/yush

October 12, 2023

DNS 與 DDNS 介紹與設定教學

DNS 是甚麼 DNS 中文稱為網域名稱系統 Domain Name System DNS 的概念就像是電話簿一樣, 首先要知道每一台裝置會有一個 ip 位址, 而 DNS 就是負責取代這些 ip 位址來讓你更好記住別人, 就像是你想要打電話給 A (連線至網站 A), 但是你不知道 A 的電話號碼是多少 (A 的 ip 位址), 這時候你就會告訴 DNS 伺服器你要打給 A, 這時候 DNS 伺服器會代替你找到 A 的電話號碼 (A 的 ip 位址), 並且將 A 的電話號碼 (ip 位址) 傳回給你, 接下來你就可以自己撥打 A 的電話號碼 (向 A 發起連線)。 所以每一個網域名稱會對應到一組 ip 位址, 你提供了網域名稱後 DNS 伺服器會幫你找到你真正要連線到的 ip 位址。 DNS 設定 網域名稱有幾種不同的使用方法, 這邊只介紹兩種我用到的, 同時也是最常用到的, 如以下表格: 類型 用途 CNAME 指向另一個域名 A 指向一或多個 ip 位址 設定好以後可能需要一些時間才會開始作用, 成功連上後就大功告成了。 ...

October 11, 2023

學會在網路上保護自己

這篇文前半段我會專注在個人資料和相片的部分, 後半段則是關於位置與 IP 的部分。 你在網路上留下的痕跡會永遠存在 不知道大家有沒有遇過一件事情, 當你在某個社群軟體上發布了一張照片, 過了一段時間後你打算刪除這張照片, 卻發現這張照片已經被其他人轉載到其他地方, 這時候你就會發現你的照片已經無法刪除了, 但別人帳號上的照片你卻無法控制, 這就是網路上的資訊永遠無法被刪除的原因。 又或是你小時候曾經在某個社群網站上發布了相片, 但是你已經不記得當時使用的帳號密碼。 更恐怖的事全世界都看得到那些你一輩子都刪除不了的任何資訊。 其實網路上留下的痕跡不僅僅是照片, 還有你的個人資料、IP 位置、瀏覽紀錄、喜歡的事物、聯絡人等等, 你可能需要的工具: VPN 要保護好自己的資料和行蹤有一些手段, 例如 VPN 像是 Cloudflare Warp、Mullvad、NordVPN 等等, 如果你有個熱愛資訊技術的朋友也可以請他幫你架設 VPN。 VPN 就像是一個隧道, 你的資料會透過這個隧道傳送, 而這個隧道的出口會是 VPN 伺服器的 IP 位置, 所以你的 IP 位置就會變成 VPN 伺服器的 IP 位置, 藉此來達到隱藏自己真實 IP 位置的目的。 激進一點的手段 如果你依舊不信任那些會收集你資料的服務, 你可以考慮自己架設服務, 也能夠確保自己的資料不會被賣給廣告商, 像是即時通訊的 matrix 的 synapse 伺服器, 或是發文為主的社群網站 Mastodon, 這些軟體不會被廣告商插手, 這些開源的軟體可以讓你不受言論審查, 所以不用擔心自己的資料被別人掌握, 並且他們都採用去中心化的架構, 即使其中一個節點下線也可以用另一個節點的服務。 必須要有的底線 不管你使用什麼服務, 任何你能被別人看見的資料都有可能被轉載並且永久保存, 所以你必須要有一個底線, 至於這個底線是什麼, 就要看你自己覺得哪些東西是一輩子公開都沒問題的, 不然就不要上傳到網路上, 除非是你可以完全信任的人。

October 6, 2023

Minecraft 伺服器架設教學

Minecraft 做為一款在我這個時代大家小時候都愛玩的遊戲肯定也有不少人想自己架設伺服器卻不知道從何開始, 這次我會用 Ubuntu 22.04 LTS 的 Server 版來架設 PaperMC 伺服器。 同時為了支援 24 小時上線所以不建議拿主力機來架設(除非只有一台電腦能用)。 先備條件 一台電腦(建議安裝 Ubuntu 以便後續跟著內文實作) 穩定的電力與網路 稍微接觸並使用過終端機(建議) 熟悉基礎檔案管理(建議) 開始架設 建立並進入 Minecraft 資料夾 下載 PaperMC 的 jar 檔案 運行 jar 檔案 編輯 eula.txt 按下 i 進入插入模式後操控方向鍵把 false 替換成 true 修改好按下 esc 接著輸入 :wq 後按 enter 退出 vim 啟動伺服器 Java 版本問題 到這邊如果 Java 沒有報錯的話就是安裝完成了,如果有報錯的話通常是因為 Java 版本過舊。 How to Install Java JDK 17 on Ubuntu 22.04 ...

August 20, 2023

Port Forwarding 通訊埠轉發教學

Port 是甚麼 在網路上, 每一個服務都會使用一個 port 通訊埠, 例如使用 http 的網頁服務通常會使用 80 port, 而 https 通常會使用 443 port, 而 Minecraft 伺服器則是使用 25565 port, 還有很多很多 port 用於各種不同服務, 這些 port 都是網路上的服務所使用的。 Port Forwarding 是甚麼 在遊玩 Minecraft 等等的線上遊戲時, 常常會需要讓別人連線到你的電腦, 通常家裡的網路都是先接入一台路由器, 然後再由路由器 DHCP 分配 ip 位址給各個裝置, 這時候你的電腦會分配到一個內網的 ip 位址, 外網的人在連線到你家的 ip 位址時會先連線到路由器, 因此是無法直接連線到你的電腦的, 你需要讓你家裡的路由器幫你轉發指定的 Port 到你的電腦上, 這個轉發的過程就稱為 Port Forwarding 通訊埠轉發。 如何設定 Port Forwarding 前面介紹完 Port Forwarding 的概念之後, 接下來要講解如何設定 Port Forwarding, 需要注意每一家路由器的設定方法都不太一樣所以就不放圖片。 登入路由器 首先要知道你的路由器在內網中的 ip 位址, 通常路由器的 ip 位址會是 192.168.0.1 或 192.168.1.1 之類的, 你可以在網路設定中查看你的路由器的 ip 位址, 接著在瀏覽器中輸入路由器的 ip 位址, 會出現一個登入畫面, 帳號密碼通常能在路由器的貼紙上看到, 如果沒有的話也可以試試看 admin admin 或 admin password 之類的。 ...

July 31, 2023