2021年12月5日 星期日

ISO14064

話說ISO14064 是國際標準化組織製定的規範。 ISO14064-1 用於組織級別的 GHG 排放和清除的量化和報告。 ISO14064 標準實施的各個階段按時間順序描述如下。該順序是指示性的,可以根據要求進行更改 。 任何國際法規都需要Top Manager 的承諾及落實。尤其甚者是範圍定義需考慮到落實而好大喜功,徒增成本。筆者依據多年經驗分析,按照策略規劃如下:
1. 定義邊界(Boundary Setting processes):邊界有兩種類型——組織邊界和操作邊界。組織邊界設置決定了要考慮哪些設施和組織(子公司或合資公司),而運營邊界決定了要考慮哪些溫室氣體排放(直接和能源間接)。定義邊界,以便可以做出將溫室氣體排放源包括在內的決定。 2. 識別溫室氣體排放源和匯:根據邊界設置,需要識別和記錄所有溫室氣體源和匯。識別過程可以根據在組織中進行的操作的流程圖來實施。需要從確定的溫室氣體源和匯收集溫室氣體數據(例如燃料和電力消耗、廢物產生等)。列出所有溫室氣體源和匯,並製作數據收集表(可能是 MS-Excel 表)以收集溫室氣體數據。 3、制定GHG量化體系:按流程;溫室氣體源和匯;和溫室氣體類型,需要製定適當的量化方法。它可以根據政府間氣候變化專門委員會 (IPCC) 制定的量化標準制定,IPCC 是溫室氣體清單計算的最高機構,以及世界資源研究所製定的溫室氣體協議方法。各種計算工具,如基於 MS excel 的計算工具或基於網絡的 GHG 計算工具,可用於 GHG 量化。溫室氣體計算工具可用於測量和監控組織的溫室氣體排放。 4. 制定溫室氣體清單質量管理體系:制定溫室氣體清單質量管理體系,用於數據收集、量化、監控和記錄保存程序。它通過某些政策、流程和程序進行管理,以減少溫室氣體清單計算中的重要性和不確定性。它有助於維持組織為目標用戶決定的保證級別。 5. 開展能力建設和培訓:要求對參與 ISO14064 實施和維護的組織的全體員工/員工進行能力建設和培訓。 6. 制定實施和報告指南文件:ISO14064 要求準備文件以維護和管理符合 ISO14064 的溫室氣體管理體系。它包括所有指南文件、描述為確定基準年溫室氣體足跡所採用的過程和方法的溫室氣體報告、作為培訓材料的溫室氣體手冊,以了解所實施的 ISO 14064 系統。溫室氣體報告用於與利益相關者的外部溝通。 7. 驗證:這是最後階段,需要外部第三方驗證機構對溫室氣體清單進行驗證。 這些階段是根據 ISO 14064-1 中提到的規範設計的。上述要點為衡量組織的碳足跡和可靠地開發碳核算和管理系統提供了循序漸進的指導方針。 您可能有興趣了解如何計算化石燃料燃燒產生的二氧化碳排放量? 參考:ISO 14064 標準、溫室氣體協議

2021年8月2日 星期一

如何輕鬆架設自己的網站

如何輕鬆架設自己的網站 

 現在人寫程式已經不是問題? 會寫程式的人懂得去行銷才是重點啊! 所以只架設網站已經事在必行,再此分享一下我的經驗 在電子商務時代,無論自行架設網站或者委話行家架設網站👀這篇文章就足夠了⋯ 跟隨以下流程,你也能從入門者變身進階用戶! 1. 架設方式選擇 2. 虛擬主機推薦 3. Cloudaccess方案選擇 4. 網域申請+租用虛擬主機 5. 建立 WordPress 網站 6. Cloudaccess 其他設定 7. WordPress 主題安裝+使用購物模板 8. 新增&編輯網站頁面 9. 調整網站選單&更換 Logo 10. 新增文章列表頁面&側邊欄設定 11. 新增第一篇文章 12. 網頁區塊+小工具設定 https://ccp.cloudaccess.net/clientarea.php
免費的主機有哪些功能? 本篇以 https://www.cloudaccess.net 為申請範例。 提供的免費功能有:磁碟空間 500MB、1 CPU Core、1 GB RAM、支援 WordPress、支援 MySQL/FTP。 唯一的限制:每個月需要登入控制台 (CCP) 更新 (Renew)。
首先你要先選擇你個人的網址。如果你本身🈶️己付費的網址可以鍵入你的網址或是用Cloudaccess 提供的免費網址 。
選好了的網址之後就會要求註冊帳號,可以用個人來註冊。
先不要理會launch now 選擇 add here 桉裝Wordpress or joomla
鍵入Domain name 可以依需求選擇Wordpress或是進階版的boldgrid。
________________________________________ 按裝後顯示你的帳單,因為選擇是免費専案,其帳單為零美元。
鍵入Check out 按1-2 選項完成本次I agree…” 打勾;點選 [Complete Order]。 設定完成免費使用設定。。
完成免費使用設定。
切換至網路管理平台。 Free user 唯一的限制:每個月需要登入控制台 (CCP) 更新 (Renew)。
設定你個人的資料啊。磁碟空間 500MB、1 CPU Core、1 GB RAM
若看到如上畫面,代表您的網站已經建置完成。
在本篇,讀者就可以直接編輯你的部落格或者是你的網路商場的內容。
在此可以客製化你的模版以利展現個人特色。按add new 就可以開始編輯你的文章。

2021年8月1日 星期日

全球最熱門的 6 大免費網頁製作平台

全球最熱門的 6 大免費網頁製作平台 :


Wix 是一個全球享譽盛名的建站工具,除了有眾多功能可以使用之外,還提供操作教學影片。Wix 曾經一天就有 3 萬以上的新用戶註冊,它的實用性跟便利性不必言喻就夠清楚的了,而且 Wix 一直在改進它的使用功能,實惠的價格也很適合預算有限的企業主。 便於使用: 只需幾分鐘即可掌握使用 Wix 平台的竅門,這是網絡上最直觀的平台之一。選擇一個您喜歡的模板並開始使用它。在上線之前,您甚至不需要註冊付費帳戶。 Wix 還包括廣泛的幫助功能,包括您可以從編輯器訪問的知識庫,以及數百個在線教程視頻。簡化 Wix 的另一件事是所有內容都託管在 Wix 服務器上,因此您永遠不必擔心管理網絡託管帳戶。 模板設計選項 借助 Wix 的數百個設計豐富的模板,您一定能找到與您的網站願景完美匹配的內容——無論是在線商店、旅遊博客還是活動頁面。 您可以一一滾動瀏覽可用模板,然後單擊“信息”以查看其說明,包括它最適合哪種類型的網站。您可以按“查看”以獲取站點外觀的演示,或者只需按“編輯”開始處理模板並按照您喜歡的方式將各個部分組合在一起。 Wix 還為您提供選擇空白模板的選項,並自己一步一步設計整個網站。 Wix 還擁有大量免費的專業照片庫,可幫助您為您的網站打造出色的外觀。 https://wix.com/
個人喜歡其下列功能: 直觀的界面,即使是初次創建網站的人。 超過 500 個設計師製作的模板。 數以千計的專業工具和功能為您的網站提供動力。 內建CRM升級服務有利於消費者權益保護。 提供完整的自動化功能,有利於網站的維護及管理更新
Network Solutions 是小型企業主的絕佳選擇,他們提供一站式全方案功能齊全的 Web 託管服務提供商,無需花費一臂之力。這些計劃靈活且負擔得起,對於處於任何增長階段的企業,都有不錯的選擇可供考慮。網絡解決方案可能不是臨時用戶或業主的最佳選擇,但企業和組織會發現這個多功能平台有很多喜歡的地方。每個電子商務套餐都包含比較式購物,這是幫助您在競爭中保持領先的關鍵功能。 Network Solutions 還提供在線產品目錄以及實時運輸和支付功能,使其成為企業主的理想選擇。 模板 使 Network Solutions 在其競爭對手中獨一無二的一點是該公司提供 2 種完全不同的網站構建工具,針對不同的受眾。有一個相對有限的免費網站構建器,以及功能更齊全的 nsWebsite 構建器。 我選擇使用 nsWebsite 包,但我確實先查看了免費建構器。這兩個平台都為用戶提供了廣泛的 Network Solutions 網站模板選擇,但 nsWebsite 構建器有一個更大的庫。雖然網絡解決方案免費網站模板是兩個構建器的選項,但一些免費構建器的模板一次性標價 9.99 美元。 帶有 nsWebsite builder 的網絡解決方案模板被組織成 16 種不同的類別,代表各種行業和興趣。每種類別至少包含5種不同的模板,但有些類別有 20 多種設計可供選擇。顏色很容易定制,用戶可以在提交特定設計之前預覽任何設計。另一種選擇是選擇沒有特定主題的簡單佈局,或者您可以從真正空白的石板開始。 個人喜歡其下列功能: 通過專業設計的模板幫助企業主擴大他們的在線形象,這些模板允許進行大量自定義。 此外,照片、文件和特定網頁可以專門與朋友和家人共享。 初學者和經驗豐富的網站管理員的選擇 您選擇的平台和計劃可以隨著您的業務增長 https://www.networksolutions.com/domain-name-registration/index.jsp
GoDaddy的一大優勢是能夠節省時間和金錢。 無論您的技術水平如何,他們的分步引導都使網站構建過程變得快速而簡單。 如果您有疑問或不知道如何解決的問題,您可以全球在地聯繫他們的客服, 包括台灣地區,透過客服的服務可以享用他們的廣泛的操作指南。 當你需要啟動您的新業務或將您現有的業務上線時,GoDaddy 的網站 + 營銷是一種快速而簡單的方式,可讓您的網站或在線商店快速啟動和運行。 雖然該產品的所有先前級別都需要付款計劃,但 GoDaddy 現在提供免費版本,讓您不僅可以使用該工具,還可以發布沒有 14 天或 30 天試用限制的實時網站。 個人喜歡其下列功能: 直觀、易於使用的界面 提供免費計劃(在許多國家/地區) 內置營銷工具可在各種市場上銷售 適合一個易於設置的網站或在線商店的小企業主 https://tw.godaddy.com/
HostGator 的一系列託管選項會給您留下最深刻的印象。 找到適合您的企業網站的託管解決方案,這樣您最終就不會為不需要的服務器空間或安全選項付費,但仍然可以享受您想要的容量和功能。 HostGator 的網站構建器在網絡構建新手中非常受歡迎,部分原因是它們非常直觀,基於 AI 的構建器。 與其他需要精通設計並要求用戶自行調整佈局、位置和格式的網站建設者不同,HostGator 會根據簡單的提示立即為您填充設計。 這對用戶來說非常容易且耗時更少。 儘管智能構建器最終會為您完成工作,但您會被結果困住:用戶可以單擊按鈕來更改佈局並獲得替代選項。 個人喜歡其下列功能: 基於人工智能的自建網站建設者 範圍廣泛的專用或共享主機 WordPress、Windows、VPS、網絡或云託管 Unsplash 圖像庫 完整的網站分析和指標工具 所有主題都適合移動設備 網路商城 約會和預訂(使用上層計劃) 使用自行創建的網站構建器進行手動設計 大量的託管選項 包括有用的營銷和電子商務工具 https://www.hostgator.com/
ordPress.com 不是WordPress 開源,而是為WordPress愛用者提供一站式的網站開發平台,在一個屋簷下運行所需的一切的解決方案。 通過在 WordPress.com 上建構,您可以購買域或使用現有域(如果有)。 所有 WordPress.com 計劃(甚至是他們的免費產品!)都包括託管,因此您無需擔心尋找網絡託管服務商。 您可能想知道 WordPress.com 和“WordPress”之間有什麼區別? “WordPress”是一個用於創建網站的開源腳本。 用戶需要下載它並將其安裝在自己的服務器上,並負責保持它(WordPress 核心)的更新。 WordPress.com 是作為託管服務提供的相同軟件。 WordPress.com 負責託管,所有用戶需要做的就是建立他們的網站。 作為一些高級功能限制的交換,這使得構建站點的過程更容易。 如果您正在考慮建立一個網站,那麼您可能聽說過 WordPress 的推薦。 雖然它是一個強大的開源腳本,但您也可以在 WordPress.com 上構建,而不必擔心網絡託管。 您甚至可以使用自己的域名。 多年來,它經過徹底改造,WordPress.com 用戶可以獲得幾乎所有與在自己的服務器上託管腳本的用戶相同的功能。 個人喜歡其下列功能: 完全託管的解決方案 與 WordPress 腳本相同的功能 非常容易連接Domain https://wordpress.com/create/?aff=6189&cid=788482&sid=PWfmpKGFeK
IONOS 非常適合那些尚未準備好使用代碼構建網站但希望將其網站託管在擁有大量技術火力的受人尊敬的提供商上的人。 對於想要獲得強大的設計功能和一些多功能性但尚未準備好從頭開始構建自己的網站的用戶來說,IONOS 網站構建器是一個不錯的選擇。 在針對初學者的計劃和適合有一定經驗的用戶的計劃之間進行升級很容易。 IONOS 對於喜歡以最少的努力推出網站的想法的用戶來說是一個不錯的選擇。 無需編碼,用戶可以從各種模板中進行選擇,以獲得他們想要的外觀和感覺。 個人喜歡其下列功能: 可應要求提供私人顧問 無限空間 大量模板可供選擇 https://www.ionos.com/websites/website-builder?ac=OM.US.USt04K418272T7073a

2020年12月30日 星期三

      Conditional Generative Adversarial Nets

今天細說一下什麼何謂GAN、在此不得不提這號人物、楊立昆、他說了GAN是未來10年耶最好玩的事情、其原文如下:“The most interesting idea in the last 10 years in Machine Learning"。GAN有兩個主件組合而成:分別是生成器(Generato)r和鑑別器(Discriminator)

生成器G需要捕獲數據分佈丶判別器D估計樣本的概率來自訓練數據而不是G

讓我想起一部有名的電影、其中文名叫神鬼交鋒是一部於2002年上映的美國傳記犯罪電影為史蒂芬·史匹柏執導傑夫·納桑森編劇李奧納多·狄卡皮歐、湯姆·漢克斯、克里斯多福·沃肯及馬丁·辛主演。劇情根據1960年代著名詐欺犯法蘭克·威廉·艾巴內爾二世的同名自傳改編少年詐欺犯法蘭克·艾巴內爾(Frank Abagnale,李奧納多·狄卡皮歐飾)在1963年至1967年間,以多種不同方式共騙得400萬美元。他在中學時曾冒充代課老師上法語課成功瞞騙同學和校方一週。當時法蘭克的家庭陷入破產危機並遭國稅局「追殺」。法蘭克為了挽救家庭鋌而走險先後扮民航機飛行員、醫生、律師又利用支票系統的漏洞偽造多張支票並成功入帳。



 GAN其模型圖如下圖:











  上面的模型圖是一個最基本的GAN的方塊圖可以看出GAN中有二個Neural Network需要去Training接下來我就來介紹Discriminator跟Generator這二個神經網路應該要怎麼去訓練。

Discriminator (鑑別器)

鑑別器網路簡單一點說明的就是是一個Neural Network可以分辨偽造出來的圖跟真實的圖沒錯,就是很直觀的,我們把Generator出來的圖標記為0(fake image),然後把真實的圖標記為1,這樣的training data 丟進我們的Discriminator Network做訓練,這就是每一次Discriminator訓練的步驟了,接下來我們來看Generator怎麼做,然後再把二個連結再一起。

Generator Network (生成器網路)

生成器網路的概念也很簡單,就是要訓練出一個Neural Network可以讓Discriminator分辨出來的結果越接近真實(1)的結果越好,我畫了以下的圖來理解生成器網路的訓練方式。

沒錯,就是很直觀的,我們把Generator出來的圖標記為0(fake image),然後把真實的圖標記為1,這樣的training data 丟進我們的Discriminator Network做訓練,這就是每一次Discriminator訓練的步驟了,接下來我們來看Generator怎麼做,然後再把二個連結再一起。

Generator Network (生成器網路)

生成器網路的概念也很簡單,就是要訓練出一個Neural Network可以讓Discriminator分辨出來的結果越接近真實(1)的結果越好,我畫了以下的圖來理解生成器網路的訓練方式。



2020年10月12日 星期一

                                   好玩的創客開發套件丶M5Stack


近來發現一個很好玩的東西丶它的名字是M5stack!!!

它是乙種串連各式模組合成系統的硬體模塊可以完成你想要的夢想。M5Stack2016年在深圳成立的公司,M5Stack之名的含意為Modular5cmx5cm、堆疊。Module顧名思義為模組化、意指一切都像積木一樣直覺堆砌拆組、5cm是指印刷電路板僅有5公分長寬、Stackable則指可堆疊的。 

M5Stack產品的核心是Core Module、這個Module內由ESP32擔任主控晶片。Core的底部可以彈性換裝不同的Module、例如無線通訊模組、電池模組等,Module能夠以一個Core為基礎進行複數疊放連接、Core也可向外連接不同的Unit積木、Unit即為各種感測器或致動器、如加速度感測器、震動馬達等。

      依電氣連通而言大體為上述三者,除此之外M5Stack還提供機械、機構類型的Accessory配件、Base底座等、或直接以實現某一特定應用為取向的Application套件、智慧插座、迷你車等。使用M5Stack的好處是開發的創客不需要拿焊槍焊接、麵包板接線、直接將不同的積木拼湊連接即可實現與改變電路設計。其網址為https://m5stack.com/



             如何開始玩M5Stack、就是要下載開發工具、筆者使用的是Android系統。

開啓瀏覽器、然後訪問Arduino官方網站https://www.arduino.cc/en/Main/Software


          單擊“ Windows Installer、用於Windows XP及更高版本”下載Arduino IDE

單擊“僅下載”、雙擊Arduino安裝程序。

打開Arduino IDE然後導航到File-> Preferences->Settings

添加ESP32板管理器 URLhttps://dl.espressif.com/dl/package_esp32_index.json

將此鏈接用於ESP32板管理器URL複製到其他板管理器URL ESP32板管理器

然後點擊確定install即可。


Tools -> Board: -> Boards Manager...

Boards Manager窗口中搜索ESP32、找到它並單擊Install


打開Arduino IDE然後選擇Sketch-> Include Library-> Manage Libraries ...

搜索M5Stack找到它然後單擊Install



            這是M5stack核心開發套件。它是一個具有內置有用硬件的漂亮開發模塊可以使用Arduino Ide進行編程。

 


那麼我們就開始寫一個最簡單的萬年程式來測試一下環境。

#include <M5Stack.h>

  

// the setup routine runs once when M5Stack starts up

void setup(){

 

  // Initialize the M5Stack object

  M5.begin();

 

  /*

    Power chip connected to gpio21, gpio22, I2C device

    Set battery charging voltage and current

    If used battery, please call this function in your project

  */

  

  M5.Power.begin();

  M5.Lcd.setTextColor(GREEN, BLACK);

  M5.Lcd.setTextDatum(MC_DATUM);

   // LCD display

  M5.Lcd.print("Hello World");

}

 // the loop routine runs over and over again forever

void loop() {

//M5.update();

}

最後的成果如下圖:


新增說明文字


2020年4月16日 星期四


A Genetic Algorithm-based Beamforming Approach


在兹介紹一下所謂Beamforming(波束成型的天線陳列) 的架構,
LTE通訊啓,基地台為了提供更佳的服務,故使用天線陣列來極化電磁波以利QoS的提升5G的技術中, 幾乎其天缐唯一選項就是波束成型 (beamforming),  波束成型(Beamforming)技術可以大略的分成兩種:

第一種: 藉由量測到的通道係數, 設計傳送參數 (precoder), 最佳化通道
第二種: 透過多天線的相位偏移 (phase shifter), 決定電波傳遞強度模
本章節以Phase shifter 為其架構, 假設以1x9“矩陣”是線性代數來描述波束成型的天線陳列、
本文利用基因工程(Genetic Algorithm-based_來找出每一個Cell Weight以利其快速其值。



Source code with Python:

# -*- coding: utf-8 -*-

import numpy as np
import ga
import matplotlib.pyplot as plt
"""
The y=target is to maximize this equation ASAP:
    y = w1x1+w2x2+w3x3+w4x4+w5x5+6wx6+7Wx7+8Wx7+9Wx9
    where (x1,x2,x3,x4,x5,x6,x7,x8,x9)=(4,-2,3.5,5,-11,-4.7,5.0,2.1,3.1)
    What are the best values for the 9 weights w1 to w9?
    We are going to use the genetic algorithm for the best possible values after a number of generations.
"""

# Inputs of the equation.
equation_inputs = [4,-2,3.5,5,-11,-4.7,5.0,2.1,3.1]

# Number of the weights we are looking to optimize.
num_weights = len(equation_inputs)

"""
Genetic algorithm parameters:
    Mating pool size
    Population size
"""
sol_per_pop = 8
num_parents_mating = 4

# Defining the population size.
pop_size = (sol_per_pop,num_weights) # The population will have sol_per_pop chromosome where each chromosome has num_weights genes.
#Creating the initial population.
new_population = np.random.uniform(low=-4.0, high=4.0, size=pop_size)
print("new_population")
print(new_population)

"""
new_population[0,:]=[[ 2.58108145  2.42053643 -3.24720098  0.73414778  2.95861561 -3.95613747
   2.34638506 -1.96226993 -2.4267999 ]
new_population[1,:]= [ 0.50988501  3.66384758 -0.35728906 -3.36106177  0.60748192  0.34572714
   0.63256316  3.59916985  0.5291632 ]
new_population[2,:]= [-3.99726266 -1.05382206 -0.72618039 -0.69354415  3.6819675   1.42235044
   3.21944868  0.56545786 -2.53333267]
new_population[3,:]= [-2.01602033  3.21295543  0.1898793  -2.6094637   1.9595066  -2.04175245
  -0.63172776 -1.84656932 -3.39214779]
new_population[4,:]= [-1.65667992 -3.61456147 -2.08880869  0.51076383  0.06322565 -0.43551276
  -3.4748497  -2.61883376  2.93387284]
new_population[5,:]= [ 3.06194594 -1.81691236 -3.5244207   3.7688676  -0.78804301  1.7642483
  -1.63477098  2.0739781  -3.88904675]
new_population[6,:]= [-0.7733979  -0.59532673  0.22656214 -1.53837445 -1.72333473 -1.32000815
   1.8188883  -0.8669669  -1.29803437]
new_population[7,:]= [-3.52687898 -3.91602606  2.07969841 -2.29166193  0.58104485  0.79150089
  -3.13136887 -0.04240155  2.80654781]]
"""

best_outputs = []
num_generations = 10
for generation in range(num_generations):
    print("Generation : ", generation)
    # Measuring the fitness of each chromosome in the population.
    fitness = ga.cal_pop_fitness(equation_inputs, new_population)
    print("Fitness")
    print(fitness)

    best_outputs.append(np.max(numpy.sum(new_population*equation_inputs, axis=1)))
    # The best result in the current iteration.
    print("Best result : ", np.max(np.sum(new_population*equation_inputs, axis=1)))
    
    # Selecting the best parents in the population for mating.
    parents = ga.select_mating_pool(new_population, fitness, 
                                      num_parents_mating)
    print("Parents")
    print(parents)

    # Generating next generation using crossover.
    offspring_crossover = ga.crossover(parents,
                                       offspring_size=(pop_size[0]-parents.shape[0], num_weights))
    print("Crossover")
    print(offspring_crossover)

    # Adding some variations to the offspring using mutation.
    offspring_mutation = ga.mutation(offspring_crossover, num_mutations=2)
    print("Mutation")
    print(offspring_mutation)

    # Creating the new population based on the parents and offspring.
    new_population[0:parents.shape[0], :] = parents
    new_population[parents.shape[0]:, :] = offspring_mutation
    
# Getting the best solution after iterating finishing all generations.
#At first, the fitness is calculated for each solution in the final generation.
fitness = ga.cal_pop_fitness(equation_inputs, new_population)
# Then return the index of that solution corresponding to the best fitness.
best_match_idx = np.where(fitness == np.max(fitness))

print("Best solution : ", new_population[best_match_idx, :])
print("Best solution fitness : ", fitness[best_match_idx])



plt.plot(best_outputs)
plt.xlabel("Iteration")
plt.ylabel("Fitness")

plt.show()


2020年4月15日 星期三


                                     

Route Planning  With  Genetic Algorithm


Since we are given each location’s coordinates, let’s calculate the Manhattan distances between each pair of points and count the longitude and latitude differences to get a sense of direction . We can clean up timestamps a little and keep the original features which might look useless to us at first glance.

Locs : Traveler to go cities  list (note that locs is a list containing Location objects)
Level: number of evolution
Population : refers to a group consisting of several different paths
Variant  :  it is as the degree of variation between parents and children
Mutate_percent: refers to  percentage of a path is  mutated

Elite_save_percent : The shortest  path is regarded as the elite path (0.1 = 10% here)

At first, to define the  location:

 locations = []
    #longitude and latitude
    xs = [8, 50, 18, 35, 90, 40, 84, 74, 34, 40, 60, 74]
    ys = [3, 62, 0, 25, 89, 71, 7, 29, 45, 65, 69, 47]
    cities = ['Z', 'P', 'A', 'K', 'O', 'Y', 'N', 'X', 'G', 'Q', 'S', 'J']
    for x, y, name in zip(xs, ys, cities):
          locations.append(Location(name, x, y))

    my_locs=  locations

 Source code  with Python as below: 


import random as rd
import copy
from matplotlib import pyplot as plt

    
    

class Location:
    
    def __init__(self, name, x, y):
        self.name = name
        self.loc = (x, y)

    def distance_between(self, location2):
        assert isinstance(location2, Location)
        return ((self.loc[0] - location2.loc[0]) ** 2 + (self.loc[1] -                                      location2.loc[1]) ** 2) ** (1 / 2)
         
        
class Route:
    
    def __init__(self, path):
        # path is a list of Location obj
        self.path = path
        self.length = self._set_length()

    def _set_length(self):
        total_length = 0
        path_copy = self.path[:]
        from_here = path_copy.pop(0)
        init_node = copy.deepcopy(from_here)
        while path_copy:
            to_there = path_copy.pop(0)
            total_length += to_there.distance_between(from_here)
            from_here = copy.deepcopy(to_there)
        total_length += from_here.distance_between(init_node)
        return total_length
        
class GeneticAlgo:
    
    def __init__(self, locs, level=10, populations=100, variant=3, mutate_percent=0.01, elite_save_percent=0.1):
        self.locs = locs
        self.level = level
        self.variant = variant
        self.populations = populations
        self.mutates = int(populations * mutate_percent)
        self.elite = int(populations * elite_save_percent)
        
    def _find_path(self):
        # locs is a list containing all the Location obj
        locs_copy = self.locs[:]
        path = []
        while locs_copy:
            to_there =                                                                locs_copy.pop(locs_copy.index(rd.choice(locs_copy)))
            path.append(to_there)
        return path

    def _init_routes(self):
        routes = []
        for _ in range(self.populations):
            path = self._find_path()
            routes.append(Route(path))
        return routes
        
    def _get_next_route(self, routes):
        routes.sort(key=lambda x: x.length, reverse=False)
        elites = routes[:self.elite][:]
        crossovers = self._crossover(elites)
        return crossovers[:] + elites

    def _crossover(self, elites):
        # Route is a class type
        normal_breeds = []
        mutate_ones = []
        for _ in range(self.populations - self.mutates):
            father, mother = rd.sample(elites[:4], k=2)
            index_start = rd.randrange(0, len(father.path) - self.variant - 1)
            # list of Location obj
            father_gene = father.path[index_start: index_start + self.variant]
            father_gene_names = [loc.name for loc in father_gene]
            mother_gene = [gene for gene in mother.path if gene.name not in father_gene_names]
            mother_gene_cut = rd.randrange(1, len(mother_gene))
            # create new route path
            next_route_path = mother_gene[:mother_gene_cut] + father_gene + mother_gene[mother_gene_cut:]
            next_route = Route(next_route_path)
            # add Route obj to normal_breeds
            normal_breeds.append(next_route)

            # for mutate purpose
            copy_father = copy.deepcopy(father)
            idx = range(len(copy_father.path))
           # gene1, gene2 = rd.shuffle(idx)
            gene1, gene2 = rd.sample(idx, 2)
            copy_father.path[gene1], copy_father.path[gene2] = copy_father.path[gene2], copy_father.path[gene1]
            mutate_ones.append(copy_father)
        mutate_breeds = rd.sample(mutate_ones, k=self.mutates)
        return normal_breeds + mutate_breeds  
           
    def evolution(self):
        routes = self._init_routes()
        for _ in range(self.level):
            routes = self._get_next_route(routes)
        routes.sort(key=lambda x: x.length)
        return routes[0].path, routes[0].length
    
    
  
     
if __name__ == '__main__':
    # obj = GeneticAlgo()
    
    locations = []
    xs = [8, 50, 18, 35, 90, 40, 84, 74, 34, 40, 60, 74]
    ys = [3, 62, 0, 25, 89, 71, 7, 29, 45, 65, 69, 47]
    cities = ['Z', 'P', 'A', 'K', 'O', 'Y', 'N', 'X', 'G', 'Q', 'S', 'J']
    for x, y, name in zip(xs, ys, cities):
          locations.append(Location(name, x, y))
    my_locs=  locations
       
    my_algo =  GeneticAlgo(my_locs, level=40, populations=150,                variant=2, mutate_percent=0.02, elite_save_percent=0.15)
    variant=2, mutate_percent=0.02, elite_save_percent=0.15)
    best_route, best_route_length = my_algo.evolution()
    best_route.append(best_route[0])
    print([loc.name for loc in best_route], best_route_length)
    print([(loc.loc[0], loc.loc[1]) for loc in best_route],                                                                             best_route_length)   
    fig, ax = plt.subplots()
    ax.plot([loc.loc[0] for loc in best_route], [loc.loc[1] for loc in                               best_route], 'red', linestyle='-', marker='')
    ax.scatter(xs, ys)
    for i, txt in enumerate(cities):
        ax.annotate(txt, (xs[i], ys[i]))

    plt.show()                    

精選文章

Active Cooler/Warner system with thermoelectric cooler

Cooler 系統包括了 DC/DC Converter, 與主機通界面 , 感测線路 , 風量葉片 ,DC Motor 等 , 控制器感测線路的回饋資料供 PID 運算出最佳控制模式。在系統軟件架構上主要包括四種類型的軟體規劃,分別是資料庫系統 (Database) 、 ...