0. Viết trước
Việc triển khai thuật toán ủ mô phỏng siêu đơn giản ε٩(๑> ₃ <)۶з được giải thích bằng mô hình lập trình tuyến tính đơn giản nhất! Nhưng nếu cần, bạn có thể trực tiếp sửa đổi bài toán lập trình phi tuyến ('つヮ⊂︎).
1. Mô tả và xử lý mô hình
1.1 Mô hình quy hoạch tuyến tính
\[max\,f(x)=10x_1+9x_2 \]
\(thứ\) 。
\[6x_1+5x_2\leq{60}\tag{1} \]
\[10x_1+20x_2\leq{150}\tag{2} \]
\[0\leq{x_1}\leq{8}\thẻ{3} \]
\[0\leq{x_2}\leq{8}\thẻ{4} \]
1.2 Giới thiệu mô hình xử lý hàm phạt
Giới thiệu hàm phạt cho các ràng buộc:
-
Đối với ràng buộc (1), hàm phạt là: \(p_1=max(0,6x_1+5x_2-60)^2\) .
-
Đối với ràng buộc (2), hàm phạt là: \(p_2=max(0,10x_1+20x_2-150)^2\).
Khi đó, hàm phạt của bài toán này có thể được biểu diễn dưới dạng:
\[P(x)=p_1+p_2 \]
Từ đó, các ràng buộc của bài toán có thể được đưa vào hàm mục tiêu và mô hình trở thành:
\[min\,g(x)=-(10x_1+9x_2)+P(x)\quad\forall{x_1,x_2}\in{[0,8]} \]
2. Thực hiện chương trình
# Chương trình thuật toán ủ mô phỏng: Giải bài toán quy hoạch tuyến tính (lập trình số nguyên) # Chương trình: Mô phỏng luyện kim_v4.py # Mục đích: Thuật toán ủ mô phỏng để tối ưu hóa hàm # v4.0: Lập trình số nguyên: Giá trị của biến quyết định là một số nguyên (giá trị ban đầu và giá trị mới) Các đáp án đều là số nguyên được tạo ngẫu nhiên) # Copyright 2021 YouCans, XUPT # Crated: 2021-05-01 # = Theo dõi Youcans và chia sẻ loạt bài gốc https://blog.csdn.net/youcans = # -*-coding: utf-8 -*- import math # Nhập mô-đun nhập ngẫu nhiên # Nhập mô-đun nhập gấu trúc dưới dạng pd # Nhập mô-đun YouCans, XUPT import numpy as np # Nhập mô-đun numpy và viết tắt nó là np import matplotlib.pyplot as plt from datetime import datetime # Chương trình con: Xác định hàm mục tiêu của bài toán tối ưu def cal_Energy(X, nVar, mk): # m(k): Hệ số phạt, tăng dần theo số lần lặp k p1 = (max(0, 6*X[0 ]+5 *X[1]-60))**2 p2 = (max(0, 10*X[0]+20*X[1]-150))**2 fx = -(10*X[0]+9*X[1]) return fx+mk*(p1+p2) # Chương trình con: thiết lập tham số của thuật toán ủ mô phỏng def ParameterSetting(): cName = "funcOpt" # Xác định tên bài toán YouCans, XUPT nVar = 2 # Cho số lượng biến độc lập, y=f(x1,..xn) xMin = [0, 0] # Cho giới hạn dưới của không gian tìm kiếm, x1_min,..xn_min xMax = [8, 8] # Cho giới hạn trên của không gian tìm kiếm, x1_max,..xn_max tInitial = 100.0 # Đặt nhiệt độ ủ ban đầu (nhiệt độ ban đầu) tFinal = 1 # Set Đặt nhiệt độ ủ dừng (nhiệt độ dừng) alfa = 0,98 # Đặt tham số làm mát, T(k)=alfa*T(k-1) MeanMarkov = 100 # Độ dài chuỗi Markov, tức là số vòng lặp bên trong chạy tỉ lệ = 0,5 # Xác định kích thước bước tìm kiếm, có thể đặt thành giá trị cố định hoặc giảm dần trả về cName, nVar, xMin, xMax, tInitial, tFinal , alfa, MeanMarkov, thang đo # Thuật toán ủ mô phỏng def Tối ưu hóaSSA(nVar,xMin,xMax,tInitial,tFinal,alfa,meanMarkov,scale): # ====== Khởi tạo trình tạo số ngẫu nhiên ====== Randseed = Random.randint(1, 100) Random.seed(Randseed) # Đặt hạt giống của trình tạo số ngẫu nhiên hoặc đặt nó thành một số nguyên được chỉ định # ===== = Được tạo ngẫu nhiên Giải pháp ban đầu cho bài toán tối ưu hóa ====== xInitial = np.zeros((nVar)) # Khởi tạo, tạo mảng cho v trong range(nVar): # xInitial[v] = Random.uniform(xMin[v], xMax[v]) # Tạo các số thực ngẫu nhiên trong phạm vi [xMin, xMax] xInitial[v] = Random.randint(xMin[v], xMax[v]) # Tạo [xMin , xMax ] phạm vi số nguyên ngẫu nhiên # Gọi hàm con cal_Energy để tính giá trị hàm mục tiêu của nghiệm hiện tại fxInitial = cal_Energy(xInitial, nVar, 1) # m(k): Hệ số phạt, giá trị ban đầu là 1 # ====== Khởi tạo thuật toán ủ mô phỏng ====== xNew = np.zeros((nVar)) # Khởi tạo, tạo mảng xNow = np.zeros( (nVar)) # Khởi tạo, tạo mảng xBest = np.zeros((nVar)) # Khởi tạo, tạo mảng xNow[:] = xInitial[:] # Khởi tạo lời giải hiện tại và đặt lời giải ban đầu thành lời giải hiện tại xBest[:] = xInitial[:] # Khởi tạo lời giải tối ưu và đặt lời giải hiện tại thành lời giải tối ưu fxNow = fxInitial # Đặt hàm mục tiêu của lời giải ban đầu thành giá trị hiện tại fxBest = fxInitial # Đặt hàm mục tiêu của giải pháp hiện tại thành giá trị tối ưu print('x_Initial:{:.6f},{:.6f},\tf(x_Initial):{:.6f}'.format(xInitial[0], xInitial [ 1], fxInitial)) recordIter = [] # Khởi tạo, số vòng lặp bên ngoài recordFxNow = [] # Khởi tạo, giá trị hàm mục tiêu của giải pháp hiện tại recordFxBest = [] # Khởi tạo, giá trị hàm mục tiêu của giải pháp tốt nhất recordPBad = [] # Khởi tạo, xác suất chấp nhận của giải pháp kém hơn kIter = 0 # Số lần lặp vòng ngoài, số trạng thái nhiệt độ TotalMar = 0 # Tổng chiều dài chuỗi Markov TotalImprove = 0 # fxSố lượng tốt nhất cải tiến nMarkov = MeanMarkov # Chuỗi Markov có độ dài cố định # ====== Bắt đầu tối ưu hóa quá trình ủ mô phỏng ====== # Vòng ngoài, kết thúc khi nhiệt độ hiện tại đạt đến nhiệt độ kết thúc tNow = tInitial # Khởi tạo nhiệt độ hiện tại (nhiệt độ hiện tại) while tNow >= tFinal: # Vòng lặp bên ngoài cho đến khi nhiệt độ hiện tại đạt đến nhiệt độ kết thúc # Ở nhiệt độ hiện tại, thực hiện đủ số lần chuyển đổi trạng thái (nMarkov) để đạt được cân bằng nhiệt kBetter = 0 # Đạt được Số giải pháp tốt kBadAccept = 0 # Số lần chấp nhận giải pháp kém kBadRefuse = 0 # Số lần từ chối giải pháp kém # --- Vòng lặp bên trong, số chu kỳ là độ dài chuỗi Markov cho k trong phạm vi (nMarkov): #Vòng lặp bên trong, số chu kỳ là tổng chiều dài chuỗi MarkovMar += 1 #Bộ đếm chiều dài chuỗi tổng Markov# ---Tạo giải pháp mới #Tạo giải pháp mới: Tạo giải pháp mới bằng nhiễu loạn ngẫu nhiên gần hiện tại lời giải, Lời giải mới phải nằm trong khoảng [min,max] # Cách 1: Chỉ một biến n phần tử bị nhiễu, còn n-1 biến còn lại không đổi xNew[:] = xNow[:] v = Random.randint(0, nVar-1) # Tạo một số ngẫu nhiên giữa [0, nVar-1] xNew[v] = round(xNow[v] +scale * (xMax[v]-xMin[v]) * ngẫu nhiên .normalvariate(0, 1)) # Nếu biến quyết định là số nguyên, giải pháp đơn giản nhất được áp dụng: giải pháp mới được tạo được làm tròn thành số nguyên xNew[v] = max(min(xNew[v], xMax[v]),xMin[v]) # Đảm bảo nghiệm mới nằm trong khoảng [min, max] # --- Tính hàm mục tiêu và hiệu năng lượng # Gọi hàm con cal_Energy để tính giá trị hàm mục tiêu của nghiệm mới fxNew = cal_Energy(xNew, nVar, kIter) deltaE = fxNew - fxNow # --- Chấp nhận giải pháp mới theo tiêu chí Metropolis # Phán quyết chấp nhận: Quyết định có chấp nhận giải pháp mới theo tiêu chí Metropolis hay không nếu fxNew < fxNow: # Giải pháp tốt hơn: Nếu hàm mục tiêu của giải pháp mới tốt hơn giải pháp hiện tại thì chấp nhận giải pháp mới Accept = True kBetter += 1 else: # Dung sai: Nếu hàm mục tiêu của giải pháp mới kém hơn giải pháp cũ lời giải hiện tại, sau đó với một xác suất nhất định Chấp nhận lời giải mới pAccept = math.exp(-deltaE / tNow) # Tính xác suất chuyển trạng thái của lời giải dung sai nếu pAccept > Random.random(): Accept = True # Chấp nhận lời giải kém hơn kBadChấp nhận += 1 else: Accept = False # Từ chối giải pháp kém hơn kBadRefuse += 1 # Lưu giải pháp mới nếu chấp nhận == True: # Nếu chấp nhận giải pháp mới, lưu giải pháp mới làm giải pháp hiện tại xNow[:] = xNew[:] fxNow = fxNew if fxNew < fxBest: # Nếu hàm mục tiêu của lời giải mới tốt hơn lời giải tối ưu, hãy lưu lời giải mới làm lời giải tối ưu fxBest = fxNew xBest[:] = xNew[:] TotalImprove += 1 thang đo = thang đo*0,99 # Kích thước bước tìm kiếm thay đổi, giảm dần phạm vi tìm kiếm, cải thiện độ chính xác của tìm kiếm # --- Sắp xếp dữ liệu sau khi kết thúc vòng lặp bên trong # Hoàn thành tìm kiếm nhiệt độ hiện tại, lưu dữ liệu và đầu ra pBadAccept = kBadAccept / (kBadAccept + kBadRefuse) # Xác suất chấp nhận lời giải kém hơn recordIter.append(kIter) # Số vòng lặp bên ngoài hiện tại recordFxNow.append(round(fxNow, 4)) # Giá trị hàm mục tiêu của giải pháp hiện tại recordFxBest.append(round(fxBest, 4)) # Giá trị hàm mục tiêu của giải pháp tốt nhất recordPBad.append(round(pBadAccept, 4)) # Giá trị hàm mục tiêu của giải pháp tốt nhất nếu kIter %10 == 0: # Hoạt động modulo, phần còn lại của thương print('i:{},t(i):{:.2f}, badAccept:{:.6f}, f(x)_best:{:.6f}'.\ format(kIter, tNow, pBadAccept, fxBest)) # Làm nguội từ từ đến nhiệt độ mới, đường cong làm mát: T(k)= alfa *T(k-1) tNow = tNow * alfa kIter = kIter + 1 fxBest = cal_Energy(xBest, nVar, kIter) # Vì hệ số phạt tăng sau khi lặp, nên hàm mục tiêu tăng cường cần được xây dựng lại cho phù hợp # ====== Kết thúc quá trình ủ mô phỏng ====== print('improve:{:d}'.format ( TotalImprove)) return kIter,xBest,fxBest,fxNow,recordIter,recordFxNow,recordFxBest,recordPBad # Xác minh kết quả và def đầu ra ResultOutput(cName,nVar,xBest,fxBest,kIter,recordFxNow,recordFxBest,recordPBad,recordIter): # ====== Xác minh và đầu ra kết quả tối ưu hóa====== fxCheck = cal_Energy(xBest, nVar, kIter) if abs(fxBest - fxCheck)>1e-3: # Kiểm tra hàm đích print("Lỗi 2: Sai tổng số millage!") return else: print("\nTối ưu hóa bằng thuật toán ủ mô phỏng:") for i in range(nVar): print('\tx[{}] = {:.1f}'.format(i,xBest [i])) print('\n\tf(x) = {:.1f}'.format(cal_Energy(xBest,nVar,0))) return # Chương trình chính def main(): # YouCans, , xMin, xMax, tInitial, tFinal, alfa, MeanMarkov, tỉ lệ]) # Thuật toán ủ mô phỏng [kIter,xBest,fxBest,fxNow,recordIter,recordFxNow,recordFxBest,recordPBad] = OptimizationSSA(nVar,xMin,xMax,tInitial,tFinal,alfa,meanMarkov,scale) # print(kIter, fxNow, fxBest, pBadAccept) # Xác minh kết quả và xuất ra ResultOutput(cName, nVar,xBest,fxBest,kIter,recordFxNow,recordFxBest,recordPBad,recordIter) if __name__ == '__main__': main()] fxNow = fxNew if fxNew < fxBest: # Nếu hàm mục tiêu của giải pháp mới tốt hơn giải pháp tối ưu, hãy lưu giải pháp mới làm giải pháp tối ưu fxBest = fxNew xBest[:] = xNew[:] TotalImprove += 1 thang đo = tỷ lệ *0,99 # Kích thước bước tìm kiếm thay đổi, giảm dần phạm vi tìm kiếm, cải thiện độ chính xác tìm kiếm # --- Sắp xếp dữ liệu sau khi kết thúc vòng lặp bên trong # Hoàn tất tìm kiếm nhiệt độ hiện tại, lưu dữ liệu và xuất ra pBadAccept = kBadAccept / (kBadAccept + kBadRefuse) # Xác suất chấp nhận lời giải kém hơn recordIter.append(kIter) # Số vòng lặp bên ngoài hiện tại recordFxNow.append(round(fxNow, 4) ) # Giải pháp hiện tại Giá trị hàm mục tiêu recordFxBest.append(round(fxBest, 4)) # Giá trị hàm mục tiêu của giải pháp tốt nhất recordPBad.append(round(pBadAccept, 4)) # Giá trị hàm mục tiêu của giải pháp tốt nhất if kIter%10 == 0: # Phép toán Modulo, phần còn lại của thương print('i: {},t (i):{:.2f}, badAccept:{:.6f}, f(x)_best:{:.6f}'.\ format(kIter, tNow, pBadAccept, fxBest)) # Làm nguội từ từ đến nhiệt độ mới, đường cong làm mát: T(k)=alfa*T(k-1) tNow = tNow * alfa kIter = kIter + 1 fxBest = cal_Energy(xBest, nVar, kIter) # Do to iteration Sau khi hệ số phạt tăng lên, hàm mục tiêu tăng cường cần được xây dựng lại cho phù hợp # ====== Kết thúc quá trình ủ mô phỏng ====== print('improve:{:d}'.format(totalImprove)) return kIter,xBest,fxBest,fxNow,recordIter,recordFxNow,recordFxBest,recordPBad # Xác minh kết quả và đầu ra def ResultOutput(cName,nVar,xBest,fxBest,kIter , recordFxNow,recordFxBest,recordPBad,recordIter): # ====== Xác minh và đầu ra kết quả tối ưu hóa ====== fxCheck = cal_Energy(xBest, nVar, kIter) if abs(fxBest - fxCheck)>1e-3: # Kiểm tra hàm mục tiêu print("Lỗi 2: Tổng số Millage sai!") return else: print("\nTối ưu hóa bằng thuật toán ủ mô phỏng:") for i in range(nVar): print('\tx[{}] = {:.1f}'.format(i,xBest[i])) print('\n\tf(x) = {:.1f}'.format(cal_Energy(xBest,nVar,0))) return # Main Chương trình def main(): # YouCans, XUPT # Cài đặt tham số, định nghĩa tham số bài toán tối ưu, cài đặt tham số thuật toán ủ mô phỏng [cName, nVar, xMin, xMax, tInitial, tFinal, alfa,meanMarkov,scale] = ParameterSetting() # print([nVar, xMin, xMax, tInitial, tFinal, alfa,meanMarkov,scale]) # Thuật toán ủ mô phỏng [kIter,xBest,fxBest,fxNow,recordIter,recordFxNow, recordFxBest,recordPBad] = OptimizationSSA(nVar,xMin,xMax,tInitial,tFinal,alfa,meanMarkov,scale) # print(kIter, fxNow, fxBest, pBadAccept) # Xác minh kết quả và đầu ra ResultOutput(cName, nVar,xBest,fxBest,kIter,recordFxNow,recordFxBest , recordPBad,recordIter) nếu __name__ == '__main__': chính()] fxNow = fxNew if fxNew < fxBest: # Nếu hàm mục tiêu của giải pháp mới tốt hơn giải pháp tối ưu, hãy lưu giải pháp mới làm giải pháp tối ưu fxBest = fxNew xBest[:] = xNew[:] TotalImprove += 1 thang đo = tỷ lệ *0,99 # Kích thước bước tìm kiếm có thể thay đổi, giảm dần phạm vi tìm kiếm, cải thiện độ chính xác của tìm kiếm # --- Sắp xếp dữ liệu sau khi kết thúc vòng lặp bên trong # Hoàn tất tìm kiếm nhiệt độ hiện tại, lưu dữ liệu và xuất ra pBadAccept = kBadAccept / (kBadAccept + kBadRefuse) # Xác suất chấp nhận lời giải kém hơn recordIter.append(kIter) # Số vòng lặp bên ngoài hiện tại recordFxNow.append(round(fxNow, 4) ) # Giải pháp hiện tại Giá trị hàm mục tiêu recordFxBest.append(round(fxBest, 4)) # Giá trị hàm mục tiêu của giải pháp tốt nhất recordPBad.append(round(pBadAccept, 4)) # Giá trị hàm mục tiêu của giải pháp tốt nhất if kIter%10 == 0: # Phép toán Modulo, phần còn lại của thương print('i: {},t (i):{:.2f}, badAccept:{:.6f}, f(x)_best:{:.6f}'.\ format(kIter, tNow, pBadAccept, fxBest)) # Làm nguội từ từ đến nhiệt độ mới, đường cong làm mát: T(k)=alfa*T(k-1) tNow = tNow * alfa kIter = kIter + 1 fxBest = cal_Energy(xBest, nVar, kIter) # Do to iteration Sau khi hệ số phạt tăng lên, hàm mục tiêu tăng cường cần được xây dựng lại cho phù hợp # ====== Kết thúc quá trình ủ mô phỏng ====== print('improve:{:d}'.format(totalImprove)) return kIter,xBest,fxBest,fxNow,recordIter,recordFxNow,recordFxBest,recordPBad # Xác minh kết quả và đầu ra def ResultOutput(cName,nVar,xBest,fxBest,kIter , recordFxNow,recordFxBest,recordPBad,recordIter): # ====== Xác minh và đầu ra kết quả tối ưu hóa ====== fxCheck = cal_Energy(xBest, nVar, kIter) if abs(fxBest - fxCheck)>1e-3: # Kiểm tra hàm mục tiêu print("Lỗi 2: Tổng số Millage sai!") return else: print("\nTối ưu hóa bằng thuật toán ủ mô phỏng:") for i in range(nVar): print('\tx[{}] = {:.1f}'.format(i,xBest[i])) print('\n\tf(x) = {:.1f}'.format(cal_Energy(xBest,nVar,0))) return # Main Chương trình def main(): # YouCans, XUPT # Cài đặt tham số, định nghĩa tham số bài toán tối ưu, cài đặt tham số thuật toán ủ mô phỏng [cName, nVar, xMin, xMax, tInitial, tFinal, alfa,meanMarkov,scale] = ParameterSetting() # print([nVar, xMin, xMax, tInitial, tFinal, alfa,meanMarkov,scale]) # Thuật toán ủ mô phỏng [kIter,xBest,fxBest,fxNow,recordIter,recordFxNow, recordFxBest,recordPBad] = OptimizationSSA(nVar,xMin,xMax,tInitial,tFinal,alfa,meanMarkov,scale) # print(kIter, fxNow, fxBest, pBadAccept) # Xác minh kết quả và đầu ra ResultOutput(cName, nVar,xBest,fxBest,kIter,recordFxNow,recordFxBest , recordPBad,recordIter) nếu __name__ == '__main__': chính()kIter) if abs(fxBest - fxCheck)>1e-3: # Kiểm tra hàm mục tiêu print("Lỗi 2: Tổng số Millage sai!") return else: print("\nTối ưu hóa bằng thuật toán ủ mô phỏng:") cho i trong phạm vi ( nVar): print('\tx[{}] = {:.1f}'.format(i,xBest[i])) print('\n\tf(x) = {:.1f}'.format(cal_Energy(xBest,nVar,0))) return # Chương trình chính def main(): # YouCans, XUPT # Cài đặt tham số, tham số bài toán tối ưu hóa Định nghĩa, cài đặt tham số thuật toán ủ mô phỏng [cName, nVar, xMin, xMax, tInitial, tFinal, alfa,meanMarkov,scale] = ParameterSetting() # print([nVar, xMin, xMax, tInitial, tFinal, alfa,meanMarkov,scale]) # Thuật toán ủ mô phỏng [kIter,xBest,fxBest,fxNow,recordIter,recordFxNow,recordFxBest,recordPBad] = OptimizationSSA(nVar,xMin,xMax, tInitial,tFinal,alfa,meanMarkov,scale) # print(kIter, fxNow, fxBest, pBadAccept) # Xác minh kết quả và xuất ra ResultOutput(cName, nVar,xBest,fxBest,kIter,recordFxNow,recordFxBest,recordPBad,recordIter) if __name__ == '__main__': main()kIter) if abs(fxBest - fxCheck)>1e-3: # Kiểm tra hàm mục tiêu print("Lỗi 2: Tổng số Millage sai!") return else: print("\nTối ưu hóa bằng thuật toán ủ mô phỏng:") cho i trong phạm vi ( nVar): print('\tx[{}] = {:.1f}'.format(i,xBest[i])) print('\n\tf(x) = {:.1f}'.format(cal_Energy(xBest,nVar,0))) return # Chương trình chính def main(): # YouCans, XUPT # Cài đặt tham số, tham số bài toán tối ưu hóa Định nghĩa, cài đặt tham số thuật toán ủ mô phỏng [cName, nVar, xMin, xMax, tInitial, tFinal, alfa,meanMarkov,scale] = ParameterSetting() # print([nVar, xMin, xMax, tInitial, tFinal, alfa,meanMarkov,scale]) # Thuật toán ủ mô phỏng [kIter,xBest,fxBest,fxNow,recordIter,recordFxNow,recordFxBest,recordPBad] = OptimizationSSA(nVar,xMin,xMax, tInitial,tFinal,alfa,meanMarkov,scale) # print(kIter, fxNow, fxBest, pBadAccept) # Xác minh kết quả và xuất ra ResultOutput(cName, nVar,xBest,fxBest,kIter,recordFxNow,recordFxBest,recordPBad,recordIter) if __name__ == '__main__': main()
Kết quả đầu ra:
x_Initial:0.000000,4.000000, f(x_Initial):-36.000000 i:0,t(i):100.00, badAccept:0.925373, f(x)_best:-152.000000 i:10,t(i):81.71, badAccept:0.671053, f(x)_best:-98.000000 i:20,t(i):66.76, badAccept:0.722892, f(x)_best:-98.000000 i:30,t(i):54.55, badAccept:0.704225, f(x)_best:-98.000000 i:40,t(i):44.57, Không chấp nhận: 0,542169, f(x)_best: -98,000000 i: 50, t(i): 36,42, Không chấp nhận: 0,435294, f(x)_best: -98,000000 i: 60, t(i): 29,76, Không chấp nhận: 0,359551, f(x)_best: -98,000000 i: 70, t(i): 24,31, Không chấp nhận: 0,717647, f(x)_best: -98,000000 i: 80, t(i): 19,86, Không chấp nhận: 0,388235, f(x)_best: -98,000000 i: 90, t(i): 16,23, Không chấp nhận: 0,555556, f(x)_best:-98.000000 i:100,t(i):13.26, chấp nhận kém:0.482353, f(x)_best:-98.000000 i:110,t(i):10.84, chấp nhận kém:0.527473, f(x)_best:-98.000000 i:120,t(i):8.85, chấp nhận kém:0.164948, f(x)_best:-98.000000 i:130,t(i):7.23, chấp nhận kém:0.305263, f(x)_best:-98.000000 i:140,t(i):5.91, chấp nhận kém:0.120000, f(x)_best:-98.000000 i:150,t(i):4.83, chấp nhận kém:0.422680, f(x)_best:-98.000000 i:160,t(i):3.95, chấp nhận kém:0.111111, f(x)_best:-98.000000 i:170,t(i):3.22, chấp nhận kém:0.350000, f(x)_best:-98.000000 i:180,t(i):2.63, chấp nhận kém:0.280000, f(x)_best:-98.000000 i:190,t(i):2.15, chấp nhận kém:0.310000, f(x)_best:-98.000000 i:200,t(i):1.76, badAccept:0.390000, f(x)_best:-98.000000 i:210,t(i):1.44, badAccept:0.390000, f(x)_best:-98.000000 i:220,t(i):1.17, badAccept:0.380000, f(x)_best:-98.000000 cải thiện:10 Tối ưu hóa bằng thuật toán ủ mô phỏng: x[0] = 8.0 x[1] = 2.0 f(x) = -98.0
Cuối cùng, bài viết về giải quyết các vấn đề lập kế hoạch vận hành với các ràng buộc (triển khai thuật toán ủ mô phỏng) kết thúc tại đây. Nếu bạn muốn biết thêm về cách giải quyết các vấn đề lập kế hoạch vận hành với các ràng buộc (triển khai thuật toán ủ mô phỏng), vui lòng Tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt. các bài viết liên quan tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!