Nghiên cứu, ứng dụng trí tuệ nhân tạo trong việc tối ưu và mô hình hóa thiết kế vi mạch tương tự và hỗn hợp

88 0 0
Nghiên cứu, ứng dụng trí tuệ nhân tạo trong việc tối ưu và mô hình hóa thiết kế vi mạch tương tự và hỗn hợp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA TÔN THẤT BẢO PHÚC NGHIÊN CỨU, ỨNG DỤNG TRÍ TUỆ NHÂN TẠO TRONG VIỆC TỐI ƯU VÀ MƠ HÌNH HĨA THIẾT KẾ VI MẠCH TƯƠNG TỰ VÀ HỖN HỢP Chuyên ngành: Kỹ Thuật Điện Tử Mã số: 8520203 LUẬN VĂN THẠC SĨ TP HỒ CHÍ MINH, tháng 01 năm 2023 CƠNG TRÌNH ĐƯỢC HỒN THÀNH TẠI TRƯỜNG ĐẠI HỌC BÁCH KHOA –ĐHQG -HCM Cán hướng dẫn khoa học: PGS TS Hoàng Trang Cán chấm nhận xét 1: TS Huỳnh Hữu Thuận Cán chấm nhận xét 2: TS Nguyễn Minh Sơn Luận văn thạc sĩ bảo vệ Trường Đại học Bách Khoa, ĐHQG Tp HCM ngày 10 tháng năm 2023 Thành phần Hội đồng đánh giá luận văn thạc sĩ gồm: (Ghi rõ họ, tên, học hàm, học vị Hội đồng chấm bảo vệ luận văn thạc sĩ) Chủ tịch hội đồng: PGS TS Trương Quang Vinh Phản biện 1: TS Nguyễn Minh Sơn Phản biện 2: TS Huỳnh Hữu Thuận Ủy viên: TS Trần Hoàng Linh Thư ký: TS Nguyễn Lý Thiên Trường Xác nhận Chủ tịch Hội đồng đánh giá LV Trưởng Khoa quản lý chuyên ngành sau luận văn sửa chữa (nếu có) CHỦ TỊCH HỘI ĐỒNG TRƯỞNG KHOA ĐIỆN – ĐIỆN TỬ i ĐẠI HỌC QUỐC GIA TP.HCM CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM TRƯỜNG ĐẠI HỌC BÁCH KHOA Độc Lập - Tự Do - Hạnh Phúc NHIỆM VỤ LUẬN VĂN THẠC SĨ Họ tên học viên: TÔN THẤT BẢO PHÚC Ngày, tháng, năm sinh: 02/11/1999 MSHV: 2170698 Nơi sinh: Thành phố Hồ Chí Minh Chuyên ngành: Kỹ Thuật Điện Tử Mã số: 8520203 TÊN ĐỀ TÀI: I NGHIÊN CỨU, ỨNG DỤNG TRÍ TUỆ NHÂN TẠO TRONG VIỆC TỐI ƯU VÀ MƠ HÌNH HĨA THIẾT KẾ VI MẠCH TƯƠNG TỰ VÀ HỖN HỢP (RESEARCH AND APPLICATION OF ARTIFICIAL INTELLIGENCE ON OPTIMIZING AND MODELING ANALOG AND MIXED-SIGNAL INTEGRATED CIRCUITS DESIGN) II NHIỆM VỤ VÀ NỘI DUNG Nghiên cứu, ứng dụng thuật toán tối ưu lĩnh vực trí tuệ nhân tạo vào việc tối ưu mơ hình hóa thiết kế vi mạch tương tự hỗn hợp III NGÀY GIAO NHIỆM VỤ : 01/07/2022 IV NGÀY HOÀN THÀNH NHIỆM VỤ : 06/01/2023 V HỌ VÀ TÊN CÁN BỘ HƯỚNG DẪN: PGS.TS HOÀNG TRANG Tp HCM, ngày 13 tháng 03 năm 2023 CÁN BỘ HƯỚNG DẪN CHỦ NHIỆM BỘ MÔN ĐÀO TẠO (Họ tên chữ ký) TRƯỞNG KHOA ĐIỆN – ĐIỆN TỬ (Họ tên chữ ký) ii LỜI CẢM ƠN Để hoàn thành luận văn thạc sĩ, cố gắng nỗ lực thân, nhận giúp đỡ nhiều từ tập thể cá nhân Tơi xin ghi nhận tỏ lịng biết ơn tới tập thể cá nhân dành cho giúp đỡ q báu Đầu tiên tơi xin bày tỏ lòng biết ơn sâu sắc đến thầy PGS.TS HOÀNG TRANG Thầy đưa gợi ý để hình thành nên ý tưởng đề tài, góp ý cho nhiều cách nhận định đắn vấn đề nghiên cứu, cách tiếp cận nghiên cứu hiệu Tôi xin chân thành cảm ơn quý Thầy Cô Khoa Điện – Điện Tử, trường Đại học Bách Khoa Tp.HCM truyền dạy kiến thức q giá cho tơi, kiến thức thiếu đường nghiên cứu khoa học nghiệp sau Luận văn thạc sĩ hoàn thành thời gian quy định với nỗ lực thân, nhiên khơng có thiếu sót Kính mong q Thầy Cơ dẫn thêm để bổ sung kiến thức hồn thiện thân Xin trân trọng cảm ơn Tp HCM, ngày 01 tháng 01 năm 2023 Tác giả luận văn Tơn Thất Bảo Phúc iii TĨM TẮT LUẬN VĂN THẠC SĨ Tóm tắt: Trong năm gần đây, có nhiều trình nghiên cứu cố gắng tận dụng tiến Trí tuệ nhân tạo (AI) thiết kế mạch Analog Tín hiệu hỗn hợp (AMS) Tối ưu hóa kích thước mạch tự động cải thiện độ xác mơ hình hiệu suất hai cách sử dụng AI chủ yếu thiết kế mạch AMS Luận văn giới thiệu giải thích khái niệm AI, đặc biệt khái niệm phù hợp với ứng dụng Tiếp theo, khảo sát số nghiên cứu gần kỹ thuật AI khác cho thiết kế mạch AMS Sau đó, thảo luận phương pháp tiếp cận ưu nhược điểm phương pháp Cuối cùng, đưa hiểu biết có ý nghĩa thách thức vấn đề mở, đề xuất phương pháp tiếp cận cho ứng dụng cụ thể Hơn nữa, luận văn ứng dụng giải thuật GA PSO vào tối ưu mạch opamp tầng để làm trường hợp nghiên cứu, thử nghiệm Ngoài ra, Phase-locked loop góp phần đáng kể vào tiến công nghệ truyền liên lạc liệu Nhiều nghiên cứu gần sơ đồ vịng lặp khóa pha kết hợp với cơng nghệ mạch tích hợp biến thiết bị vịng lặp khóa pha thành thành phần hệ thống thiết yếu Công việc thiết kế vịng khóa Pha cho ứng dụng tần số siêu cao (UHF) với điện áp đầu vào 1,0 V tần số tham chiếu đầu vào thấp 20 MHz, nghiên cứu NCSU PDK 45 nm với công cụ Cadence Virtuoso để đạt tần số đầu 800 MHz rung pha RMS 150 ps Ngồi ra, quy trình đề xuất sử dụng ngôn ngữ Ocean để nghiên cứu thay đổi tham số vòng lặp khóa pha cơng việc này, bao gồm điện áp đầu ra, tần số hoạt động rung pha iv Abstract: Recently, there have been many studies attempting to take advantage of advancements in Artificial Intelligence (AI) in Analog and Mixed-Signal (AMS) circuit design Automated circuit sizing optimization and improving the accuracy of performance models are the two predominant uses of AI in AMS circuit design This paper first introduces and explains the basic concepts in AI especially the ones that are more suitable to this application Next, it surveys some recent studies of various AI techniques for AMS circuit design Then, it discusses the main approaches as well as the pros and cons of each method Finally, it gives meaningful insights about the current challenges and open issues, as well as recommends approaches for specific applications Phase-locked loop has contributed significantly toward the technological advancement in data transmission and communication In addition, many recent studies in Phase-locked loop schemes combined with novel integrated circuit technology have made Phase-locked loop devices essential system components This work designed a Phase-locked loop for the ultrahigh frequency (UHF) applications with an input voltage of 1.0 V and a low input reference frequency of 20 MHz, which was researched on the 45 nm NCSU PDK with Cadence Virtuoso tools to gain the output frequency over 800 MHz and the RMS jitter of 150 ps Furthermore, the proposed procedure used Ocean language to study the variation of Phase-locked loop parameters in this work, including the output voltage, the operating frequency, and the phase jitter v LỜI CAM ĐOAN Tôi xin cam đoan rằng: Mọi số liệu kết nghiên cứu luận văn thạc sĩ hoàn toàn trung thực chưa công bố công trình khác Tác giả luận văn Tơn Thất Bảo Phúc vi MỤC LỤC CHƯƠNG 1: MỞ ĐẦU LUẬN VĂN 1.1 Lý chọn đề tài luận văn mục tiêu đề tài 1.1 Ý nghĩa khoa học ý nghĩa thực tiễn CHƯƠNG 2: TỔNG QUAN CÔNG NGHỆ 2.1 Nghiên cứu ứng dụng AI vào quy trình tối ưu hóa cho thông số thiết kế mạch tương tự hỗn hợp: 2.1.1 Tổng quan ý tưởng khoa học thực ứng dụng AI vào quy trình tối ưu hóa thơng số thiết kế mạch tương tự hỗn hợp 2.1.2 Phương pháp tối ưu hóa thuật toán Genetic Algorithm (GA) Particle Swarm Optimization (PSO) .7 2.1.3 Phương pháp tối ưu hóa Bayesian (Bayesian Optimization - BO) .8 2.1.4 Phương pháp đa điểm khởi tạo (Multiple Starting Point - MSP) 12 2.1.5 Phương pháp dựa vào Neural Network 13 2.1.6 So sánh ưu nhược điểm phương pháp 16 2.2 Nghiên cứu ứng dụng AI vào quy trình mơ hình hóa thơng số hoạt động mạch tương tự hỗn hợp: 18 2.2.1 Tổng quan ý tưởng khoa học thực ứng dụng AI vào quy trình mơ hình hóa hoạt động mạch tương tự hỗn hợp 18 2.2.2 Phương pháp tiếp cận dựa vào mơ hình Bayesian (BO) 19 2.2.3 Phương pháp học bán giám sát (Semi Supervised Learning - SSL) 20 2.2.4 So sánh ưu nhược điểm phương pháp tiếp cận 22 CHƯƠNG 3: NHỮNG GIẢI PHÁP TIỀM NĂNG ĐƯỢC ĐỀ XUẤT ĐỂ ỨNG DỤNG TRÍ TUỆ NHÂN TẠO VÀO QUY TRÌNH TỐI ƯU VÀ MƠ HÌNH HỐ MẠCH TƯƠNG TỰ VÀ HỖN HỢP 23 3.1 Quy trình ứng dụng thuật tốn GA vào quy trình thiết kế, tối ưu mạch tương tự hỗn hợp 23 3.2 Quy trình ứng dụng thuật tốn PSO vào quy trình thiết kế, tối ưu mạch tương tự hỗn hợp 24 3.3 Quy trình ứng dụng ngơn ngữ Ocean vào việc tối ưu hóa mạch tương tự hỗn hợp cách tự động 26 3.4 Quy trình ứng dụng thuật tốn GA PSO với ngơn ngữ Ocean vào quy trình thiết kế, tối ưu mạch tương tự hỗn hợp 28 vii CHƯƠNG 4: PHÂN TÍCH VÀ BÌNH LUẬN KẾT QUẢ NGHIÊN CỨU 30 4.1 Ứng dụng ngôn ngữ Ocean thiết kế mạch vịng khóa pha (PLL) 30 4.2 Ứng dụng thuật toán GA PSO vào quy trình thiết kế, tối ưu mạch khuếch đại đơn tầng 41 CHƯƠNG 5: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 52 5.1 Kết luận 52 5.2 Hướng phát triển 52 DANH MỤC CÁC CƠNG TRÌNH KHOA HỌC 53 DANH MỤC TÀI LIỆU THAM KHẢO 54 PHỤ LỤC A: SOURCE CODE MƠ PHỎNG THUẬT TỐN GA ĐỂ TỐI ƯU MẠCH OP AMP TẦNG 60 PHỤ LỤC B: SOURCE CODE MÔ PHỎNG THUẬT TOÁN PSO ĐỂ TỐI ƯU MẠCH OP AMP TẦNG 70 viii DANH MỤC HÌNH ẢNH Hình 2.1: Các phương pháp khác để xác định thơng số kích thước mạch tương tự hỗn hợp: a) Xác định thơng số kích thước dựa tối ưu hóa thơng thường (cách tiếp cận nghịch đảo), tức từ biến thiết biểu diễn mạch vòng lặp lặp lặp lại; b) Neural Network nhân tạo (ANN) (cách tiếp cận trực tiếp) tức từ biểu diễn mạch trực tiếp đến biến thiết kế [29] 16 Hình 3.1: Sơ đồ quy trình thực thuật tốn GA .24 Hình 3.2: Sơ đồ quy trình thực thuật toán PSO 26 Hình 3.3: Sơ đồ ứng dụng ngơn ngữ Ocean tối ưu thiết kế vi mạch tương tự .27 Hình 3.4: Ý tưởng thực ứng dụng giải thuật GA, PSO, ngôn ngữ Ocean vào thiết kế vi mạch tương tự hỗn hợp 28 Hình 3.5: Hiện thực giải thuật PSO (hoặc GA) Python kết hợp với ngôn ngữ Ocean 29 Hình 4.1: Mã giả thực ứng dụng ngôn ngữ Ocean vào tối ưu PLL .30 Hình 4.2: Sơ đồ khối CPPLL .31 Hình 4.3: Sơ đồ khối PFD .33 Hình 4.4: Sơ đồ mạch cell NAND2 34 Hình 4.5: Sơ đồ mạch CP 34 Hình 4.6: Sơ đồ mạch CS-VCO stage 35 Hình 4.7: Bộ divider với hệ số N = 35 Hình 4.8: Sơ đồ mạch CPPLL đề xuất thiết kế 35 Hình 4.9: Mạch testbench cho CPPLL 36 Hình 4.10: Kết mơ transient CPPLL 37 Hình 4.11: Kết mơ transient CPPLL tóm tắt .37 Hình 4.12: Kết mô thay đổi tần số trung tâm ngõ 38 Hình 4.13: Kết mô điện áp ngõ (giá trị min) CPPLL thay đổi 39 Hình 4.14: Kết mô điện áp ngõ (giá trị max) CPPLL thay đổi 40 Hình 4.15: Giá trị Jitter CPPLL thay đổi 41 Hình 4.16: Hình minh họa cho mạch khuếch đại vi sai nghiên cứu [53,54] 42 Hình 4.17: Đồ thị thể mối quan hệ điện áp dòng điện ngõ mạch khuếch đại miền DC 44 Hình 4.18: Dạng sóng ngõ thay đổi theo thời gian 45 Hình 4.19: Dạng sóng dịng điện ngõ .46 60 PHỤ LỤC A: SOURCE CODE MƠ PHỎNG THUẬT TỐN GA ĐỂ TỐI ƯU MẠCH OP AMP TẦNG # genetic algorithm search for continuous function optimization from numpy.random import randint from numpy.random import rand import sys import pandas as pd import matplotlib.pyplot as plt import datetime as dt import os import numpy as np def calFitness(pos2,kt): m = n = minGain = 35 maxError = minSlew = 10 minVicMax = 0.6 maxVicMin = -0.2 um = 1e-6 nm = 1e-9 u = 1e-6 p = 1e-12 L12 = 0.5 L34 = L56 = 0.5 W6 = pos0 = np.array([[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1 ,1,1,1,1],[1,1,1,1,1,1]]) pos2 = np.array(pos2) sizePos = np.prod(pos2.shape) pos = np.full((6,5),2, dtype ='f') if sizePos == 5: pos[0,:] = pos2 else: pos = pos2 #print(pos) CL_a = pos[0,0] * p CL_b = pos[1,0] * p CL_c = pos[2,0] * p CL_d = pos[3,0] * p CL_e = pos[4,0] * p 61 CL_f = pos[5,0] * p I_a = pos[0,1] * u I_b = pos[1,1] * u I_c = pos[2,1] * u I_d = pos[3,1] * u I_e = pos[4,1] * u I_f = pos[5,1] * u L1_a = L12 * um L1_b = L12 * um L1_c = L12 * um L1_d = L12 * um L1_e = L12 * um L1_f = L12 * um L2_a = L12 * um L2_b = L12 * um L2_c = L12 * um L2_d = L12 * um L2_e = L12 * um L2_f = L12 * um L3_a = L34 * um L3_b = L34 * um L3_c = L34 * um L3_d = L34 * um L3_e = L34 * um L3_f = L34 * um L4_a = L34 * um L4_b = L34 * um L4_c = L34 * um L4_d = L34 * um L4_e = L34 * um L4_f = L34 * um L5_a = L56 * um L5_b = L56 * um L5_c = L56 * um L5_d = L56 * um L5_e = L56 * um L5_f = L56 * um L6_a = L56 * um L6_b = L56 * um L6_c = L56 * um L6_d = L5 * um L6_e = L56 * um L6_f = L56 * um W1_a = pos[0,2] * um W1_b = pos[1,2] * um 62 W1_c = pos[2,2] * um W1_d = pos[3,2] * um W1_e = pos[4,2] * um W1_f = pos[5,2] * um W2_a = pos[0,2] * um W2_b = pos[1,2] * um W2_c = pos[2,2] * um W2_d = pos[3,2] * um W2_e = pos[4,2] * um W2_f = pos[5,2] * um W3_a = pos[0,3] * um W3_b = pos[1,3] * um W3_c = pos[2,3] * um W3_d = pos[3,3] * um W3_e = pos[4,3] * um W3_f = pos[5,3] * um W4_a = pos[0,3] * um W4_b = pos[1,3] * um W4_c = pos[2,3] * um W4_d = pos[3,3] * um W4_e = pos[4,3] * um W4_f = pos[5,3] * um W5_a = pos[0,4] * um W5_b = pos[1,4] * um W5_c = pos[2,4] * um W5_d = pos[3,4] * um W5_e = pos[4,4] * um W5_f = pos[5,4] * um W6_a = W6 * um #pos[0,4]/2* um W6_b = W6 * um W6_c = W6 * um W6_d = W6 * um W6_e = W6 * um W6_f = W6 * um ac_vminus = ac_vplus = 1e-3 dc_vplus = tran_vminus = -0.4 tran_vplus = 0.4 vdd = 1.2 vss = -1.2 # xuat vo ocean filethongso = "/mnt/hgfs/shared/GA_thongso.txt" f = open(filethongso,'w') f.write("\n%s" %CL_a) 63 f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" %CL_b) %CL_c) %CL_d) %CL_e) %CL_f) %I_a) %I_b) %I_c) %I_d) %I_e) %I_f) %L1_a) %L1_b) %L1_c) %L1_d) %L1_e) %L1_f) %L2_a) %L2_b) %L2_c) %L2_d) %L2_e) %L2_f) %L3_a) %L3_b) %L3_c) %L3_d) %L3_e) %L3_f) %L4_a) %L4_b) %L4_c) %L4_d) %L4_e) %L4_f) %L5_a) %L5_b) %L5_c) %L5_d) %L5_e) %L5_f) %L6_a) %L6_b) %L6_c) %L6_d) 64 f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" f.write("\n%s" %L6_e) %L6_f) %W1_a) %W1_b) %W1_c) %W1_d) %W1_e) %W1_f) %W2_a) %W2_b) %W2_c) %W2_d) %W2_e) %W2_f) %W3_a) %W3_b) %W3_c) %W3_d) %W3_e) %W3_f) %W4_a) %W4_b) %W4_c) %W4_d) %W4_e) %W4_f) %W5_a) %W5_b) %W5_c) %W5_d) %W5_e) %W5_f) %W6_a) %W6_b) %W6_c) %W6_d) %W6_e) %W6_) %ac_vminus) %ac_vplus) %dc_vplus) %tran_vminus) %tran_vplus) %vdd) %vss) 65 f.close() os.system("ocean -nograph -restore GA_ocn.ocn") ketqua = np.array([]) with open("/mnt/hgfs/shared/GA_ketqua.txt") as f: ketquara = f.readlines() ketquara = np.array(ketquara) ketqua = ketquara.astype(np.float) ketqua= ketqua.reshape(n,m) minGain = np.full((n,1),35) maxError = np.full((n,1),2) minSlew = np.full((n,1),8) minVicMax = np.full((n,1),0.6) maxVicMin = np.full((n,1),-0.2) expectGain = 41 expectError = #1% expectSlew = 16 expectVicMax = 0.9 expectVicMin = -0.4 merGain = np.transpose(ketqua[:,0]).reshape(-1,1) merError = np.transpose(ketqua[:,1]).reshape(-1,1) merSlew = np.transpose(ketqua[:,2]).reshape(-1,1) merVicMax = np.transpose(ketqua[:,3]).reshape(-1,1) merVicMin = np.transpose(ketqua[:,4]).reshape(-1,1) hesoGain = hesoError = hesoSlew = hesoVicMax = hesoVicMin = #xu ly de fitness fitness = np.zeros((n,1), dtype='f') fitness[:,] = (hesoGain*(merGain-expectGain)**2 + hesoError*(merError-expectError)**2 + hesoGain*(merSlewexpectSlew)**2 + hesoVicMax*(merVicMax-expectVicMax)**2 + hesoVicMin*(merVicMin-expectVicMin)**2).reshape(-1,1) #kiem tra co du tieu chuan chua #fitness[:,] = ((merGain >= minGain)*fitness + (merGain < minGain)*999 ) #fitness[:,] = ((merError maxError)*999 ) #fitness[:,] = ((merSlew >= minSlew)*fitness + (merSlew < minSlew)*999 ) #fitness[:,] = ((merVicMax >= minVicMax)*fitness + (merVicMax < minVicMax)*999 ) #fitness[:,] = ((merVicMin maxVicMin)*999 ) 66 #return fitness = fitness.flatten() if kt==1: fitness2 = fitness[0] else: fitness2 = fitness.tolist() return fitness2, ketqua # decode bitstring to numbers def decode(bounds, n_bits, bitstring): decoded = list() largest = 2**n_bits for i in range(len(bounds)): # extract the substring start, end = i * n_bits, (i * n_bits)+n_bits substring = bitstring[start:end] # convert bitstring to a string of chars chars = ''.join([str(s) for s in substring]) # convert string to integer integer = int(chars, 2) # scale integer to desired range value = bounds[i][0] + (integer/largest) * (bounds[i][1] - bounds[i][0]) # store decoded.append(value) return decoded # tournament selection def selection(pop, scores, k=3): # first random selection selection_ix = randint(len(pop)) for ix in randint(0, len(pop), k-1): # check if better (e.g perform a tournament) if scores[ix] < scores[selection_ix]: selection_ix = ix return pop[selection_ix] # crossover two parents to create two children def crossover(p1, p2, r_cross): # children are copies of parents by default c1, c2 = p1.copy(), p2.copy() # check for recombination if rand() < r_cross: # select crossover point that is not on the end of the string pt = randint(1, len(p1)-2) # perform crossover c1 = p1[:pt] + p2[pt:] 67 c2 = p2[:pt] + p1[pt:] return [c1, c2] # mutation operator def mutation(bitstring, r_mut): for i in range(len(bitstring)): # check for a mutation if rand() < r_mut: # flip the bit bitstring[i] = - bitstring[i] # genetic algorithm def genetic_algorithm(calFitness, bounds, n_bits, n_iter, n_pop, r_cross, r_mut,df): # initial population of random bitstring pop = [randint(0, 2, n_bits*len(bounds)).tolist() for _ in range(n_pop)] print(decode(bounds, n_bits, pop[0])) # keep track of best solution best = best_eval, ketqua = calFitness(decode(bounds, n_bits, pop[0]),1) # enumerate generations for gen in range(n_iter): begin_time = dt.datetime.now().strftime("%H:%M:%S") # decode population decoded = [decode(bounds, n_bits, p) for p in pop] # evaluate all candidates in the population scores,ketqua = calFitness(decoded,0) #print("decoded\n",decoded) #print("scores\n",scores) # check for new best solution for i in range(n_pop): #print("best_eval",best_eval) if scores[i] < best_eval: best, best_eval= pop[i], scores[i] #print(">%d, new best f(%s) = %f" % (gen, decoded[i], scores[i])) # select parents selected = [selection(pop, scores) for _ in range(n_pop)] # create the next generation children = list() for i in range(0, n_pop, 2): # get selected parents in pairs p1, p2 = selected[i], selected[i+1] # crossover and mutation 68 for c in crossover(p1, p2, r_cross): # mutation mutation(c, r_mut) # store for next generation children.append(c) # replace population pop = children if gen==0: xuatketqua = ketqua[np.argmin(scores)] else: xuatketqua = (np.amin(scores)best_eval)*xuatketqua print("xuatketqua",xuatketqua) gbest_pos = decode(bounds, n_bits, best) new_row =[ { "Lan chay": gen, "Begin": begin_time, "End": dt.datetime.now().strftime("%H:%M:%S"), "Time (s)": dt.datetime.strptime(dt.datetime.now().strftime("%H:%M:% S"), '%H:%M:%S') - dt.datetime.strptime(begin_time, '%H:%M:%S'), "Fitness": best_eval, "CL (p)": gbest_pos[0], "Id (u)" : gbest_pos[1], "W1 (um)": gbest_pos[2], "W3 (um)": gbest_pos[3], "W5 (um)": gbest_pos[4], "Open Loop Gain (dB)": xuatketqua[0], "Error (%)": xuatketqua[1], "Slew rate (V/us)": xuatketqua[2], "vIcMax (V)": xuatketqua[3], "vIcMin (V)": xuatketqua[4], }] df = df.append(new_row, ignore_index=True) print(df) return [best, best_eval,df] # define range for input bounds = [[1, 10.0], [0.1, 40], [0.2, 10], [0.2, 10], [0.2, 10]] #thiet lap um = 1e-6 nm = 1e-9 69 u = 1e-6 p = 1e-12 m = #so bien n = #swarm size wMax = 0.9 wMin = 0.4 c1 = 0.3 c2 = 0.9 # define the total iterations n_iter = int(sys.argv[1]) # bits per variable n_bits = 16 # define the population size n_pop = # crossover rate r_cross = 0.9 # mutation rate r_mut = 1.0 / (float(n_bits) * len(bounds)) column_names = ["Lan chay","Begin","End","Time (s)","Fitness","CL (p)","Id (u)","W1 (um)","W3 (um)","W5 (um)","Open Loop Gain (dB)","Error (%)","Slew rate (V/us)","vIcMax (V)","vIcMin (V)"] df = pd.DataFrame(columns = column_names) # perform the genetic algorithm search best, score,df = genetic_algorithm(calFitness, bounds, n_bits, n_iter, n_pop, r_cross, r_mut,df) print('Done!') print(df) decoded = decode(bounds, n_bits, best) print('f(%s) = %f' % (decoded, score)) df.to_csv("/mnt/hgfs/shared/ketqua4GA.csv") df.to_excel("/mnt/hgfs/shared/ketqua4GA.xlsx", sheet_name="GA") #os.system("ocean -restore final.ocn") calFitness(decoded,0) os.system("ocean -restore GA_final.ocn") 70 PHỤ LỤC B: SOURCE CODE MÔ PHỎNG THUẬT TOÁN PSO ĐỂ TỐI ƯU MẠCH OP AMP TẦNG import numpy as np import os import csv import PSO1_fitnessRun import sys import pandas as pd import matplotlib.pyplot as plt import datetime as dt #thiet lap um = 1e-6 nm = 1e-9 u = 1e-6 p = 1e-12 m = #so bien n = #swarm size wMax = 0.9 wMin = 0.4 c1 = 0.3 c2 = 0.9 lap = int(sys.argv[1]) #sys.stdout("ls") # gioi han LB = np.array([1, 5, 0.2, 0.2, 0.2] , dtype = 'f') #CL, I, W1, W3, W5 UB = np.array([5, 40, 10, 10, 10 ] , dtype = 'f') minGain = 35 maxError = minSlew = 10 minVicMax = 0.6 maxVicMin = -0.2 pos = np.zeros((n,m), dtype='f') # khoi tao gia tri dau cho cac bien # khoi tao POS # tao bay, moi bay bien ##QUAN TRONG #for bay in range(n): # moi tu nhan ban 71 la bay # for in range(m) # moi bay co khac tuc la bien #pos[bay, :] = LB + np.random.rand(1,m)*(UB - LB) pos[0, :] = np.array([1, 10, 1, 1, 1.0]) #CL, I, W1, W3, W5 pos[1, :] = np.array([1, 1, 5, 1, 1.0]) #CL, I, W1, W3, W5 pos[2, :] = np.array([5, 2, 4, 1, 1.0]) #CL, I, W1, W3, W5 pos[3, :] = np.array([2, 10, 5, 1, 1.0]) #CL, I, W1, W3, W5 pos[4, :] = np.array([1, 5, 5, 1, 6.0]) #CL, I, W1, W3, W5 pos[5, :] = np.array([1, 10, 1, 1, 4.0]) #CL, I, W1, W3, W5 # khoi tao van toc VEL #pos = LB + np.random.rand(n,m)*(UB - LB) vel = 0.1*pos # khoi tao FITNESS fitness = np.zeros((n,1), dtype='f') pbest_val = np.full((n, 1), 999999999, dtype ='f') pbest_pos = np.zeros((n,m), dtype='f') gbest_val = np.full((1,1), 999999999, dtype='f') gbest_pos = np.zeros((1,m), dtype='f') #print(fitness[:,]) print(pos) #print(pbest_val) #print(vel) #gbest_pos_save = np.empty_like(gbest_pos) #gbest_val_save = np.array([1]) column_names = ["Lan chay","Begin","End","Time (s)","Fitness","CL (p)","Id (u)","W1 (um)","W3 (um)","W5 (um)","Open Loop Gain (dB)","Error (%)","Slew rate (V/us)","vIcMax (V)","vIcMin (V)"] df = pd.DataFrame(columns = column_names) for chay in range(lap): #bat dau lap #luu start time begin_time = dt.datetime.now().strftime("%H:%M:%S") 72 #thay doi w w = wMax - (chay/lap)*(wMax-wMin) # tinh gia tri voi moi bo so fitness, ketqua = PSO1_fitnessRun.calFitness(pos) #cap nhat pbest pbest_pos = (fitness pbest_val)*pbest_pos pbest_val = (fitness pbest_val)*pbest_val #cap nhat gbest gbest_pos = pbest_pos[np.argmin(pbest_val)] gbest_val = pbest_val[np.argmin(pbest_val)] #cap nhat vel, pos vel = w*vel+ c1*np.random.rand(n,m)*(pbest_pos - pos) + c2*np.random.rand(n,m)*(gbest_pos - pos) pos = pos + vel #kiem tra dieu kien bien pos = (pos >= LB )*pos + (pos < LB)*LB pos = (pos UB)*UB #neu gbest duoc cap nhat moi thi ket qua la gia tri moi, khong thi thoi if chay==0: xuatketqua = ketqua[np.argmin(fitness)] else: xuatketqua = (np.amin(fitness)gbest_val[0])*xuatketqua #luu vao bang ghi new_row =[ { "Lan chay": chay, "Begin": begin_time, "End": dt.datetime.now().strftime("%H:%M:%S"), "Time (s)": dt.datetime.strptime(dt.datetime.now().strftime("%H:%M:% S"), '%H:%M:%S') - dt.datetime.strptime(begin_time, '%H:%M:%S'), "Fitness": gbest_val[0], "CL (p)": gbest_pos[0], 73 "Id (u)" : gbest_pos[1], "W1 (um)": gbest_pos[2], "W3 (um)": gbest_pos[3], "W5 (um)": gbest_pos[4], "Open Loop Gain (dB)": xuatketqua[0], "Error (%)": xuatketqua[1], "Slew rate (V/us)": xuatketqua[2], "vIcMax (V)": xuatketqua[3], "vIcMin (V)": xuatketqua[4], }] df = df.append(new_row, ignore_index=True) print(df) df.to_csv("/mnt/hgfs/shared/PSO1.csv") df.to_excel("/mnt/hgfs/shared/PSO1.xlsx", sheet_name="PSO") #xuat pos[0, :] = np.transpose(gbest_pos) #CL, I, W1, W3, W5 os.system("ocean -restore PSO1_final.ocn") 74 PHẦN LÝ LỊCH TRÍCH NGANG Họ tên: Tôn Thất Bảo Phúc Ngày, tháng, năm sinh: 02/11/1999 Nơi sinh: Vũng Tàu Địa liên lạc: 497 Hồ Hảo, phường 7, quận 10, TP.HCM Q TRÌNH ĐÀO TẠO 2017 - 2021: Học chương trình đào taọ đại học quy Trường đại học Bách khoa, Đại học Quốc gia Thành phố Hồ Chí Minh 2021 – 2023: Học chương trình đào taọ thạc sĩ Trường đại học Bách khoa, Đại học Quốc gia Thành phố Hồ Chí Minh Q TRÌNH CƠNG TÁC 2021 - nay: Nghiên cứu viên, Trường đại học Bách khoa, Đại học Quốc gia Thành phố Hồ Chí Minh

Ngày đăng: 20/06/2023, 21:46

Tài liệu cùng người dùng

Tài liệu liên quan