用pywin32連接autocad 寫一個利用遺傳算法從選擇的閉合圖形內進行最優利用率的排版 ai草稿

好的,我們來深入細說遺傳算法(Genetic Algorithm, GA)在鈑金自動排版中的應用。

遺傳算法 (GA) 在鈑金排版中的詳細解析

遺傳算法是一種受達爾文生物進化論啟發的元啟發式優化算法。它不追求一次性找到數學上的絕對最優解,而是通過模擬“物競天擇,適者生存”的自然過程,在龐大的搜索空間中高效地尋找一個非常接近最優的、實用的解決方案。這對于零件形狀各異、數量眾多、約束復雜的鈑金排料問題尤其有效。

核心原理與工作流程

可以將整個排料方案看作一個“生命體”(個體),而構成這個方案的各個要素(如零件的擺放順序、旋轉角度、起始坐標等)就是它的“基因”。GA 通過多代的演化來不斷改進這些“生命體”。

  1. 編碼 (Encoding):

    • 目的:?將現實世界的排料方案轉換成計算機可以處理的“染色體”(一串數字或符號)。
    • 方法:?在排料中,常見的編碼方式有:
      • 順序編碼:?染色體表示零件的下料順序。例如,[3, 1, 5, 2, 4]?表示先放第3個零件,然后是第1個,依此類推。放置規則(如左下角填充法)決定了每個零件的具體位置。
      • 位置編碼:?染色體直接包含每個零件的關鍵參數,如?(零件ID, X坐標, Y坐標, 旋轉角度)?的組合。這種方式更直接但維度更高。
    • 關鍵:?編碼必須能唯一且完整地描述一個排料方案。
  2. 初始化種群 (Initialization):

    • 算法開始時,隨機生成一組(稱為“種群”,Population)不同的排料方案作為第一代。種群大小(如50、100個個體)是一個重要參數。
  3. 適應度評估 (Fitness Evaluation):

    • 核心指標:?這是驅動進化的“裁判”。對于排料問題,最直接的適應度函數通常是?材料利用率
    • 計算公式:?利用率 = (所有零件總面積 / 所用板材面積) × 100%
    • 有時也會結合其他因素,如切割路徑長度、工藝約束(橋位、微連接)等,形成復合適應度函數。
    • 適應度值越高的個體(即利用率越高的排料方案),在下一代中被選中的概率就越大。
  4. 選擇 (Selection):

    • 目的:?從當前種群中挑選出優秀的“父母”個體,用于繁殖下一代。
    • 常用方法:
      • 輪盤賭選擇 (Roulette Wheel Selection):?適應度越高的個體,被選中的“扇形區域”就越大,概率越高。
      • 錦標賽選擇 (Tournament Selection):?隨機選取幾個個體進行“比賽”,勝者(適應度最高者)被選中。重復此過程直到選出足夠數量的父母。
    • 原則:?“優勝劣汰”,保證優良基因得以傳承。
  5. 交叉 (Crossover / Recombination):

    • 目的:?模擬生物交配,將兩個“父母”個體的基因進行重組,產生新的“后代”個體,期望繼承雙方的優點。
    • 排料中的挑戰:?直接交叉可能會產生非法或低效的方案(如零件重疊、超出板幅)。
    • 常用策略(以順序編碼為例):
      • 順序交叉 (Order Crossover, OX):?隨機選取父母A的一段基因序列,復制到后代;然后按順序從父母B中取剩余零件,填滿后代。這能在一定程度上保持順序信息。
      • 部分映射交叉 (Partially Mapped Crossover, PMX):?更復雜,能更好地處理順序約束。
    • 結果:?產生一個或多個新的排料方案(后代)。
  6. 變異 (Mutation):

    • 目的:?模擬自然界基因突變,引入新的基因多樣性,防止算法過早收斂到局部最優(即陷入一個不是最好的“小高峰”)。
    • 方法:
      • 交換變異:?隨機交換染色體中兩個基因的位置。例如,將順序?[3, 1, 5, 2, 4]?變為?[3, 2, 5, 1, 4]
      • 插入變異:?隨機取出一個基因,插入到另一個隨機位置。
      • 逆轉變異:?隨機選取一段基因,將其順序反轉。
    • 關鍵參數:?變異概率通常很低(如1%-5%),避免破壞已有的優良結構。
  7. 迭代與終止 (Iteration and Termination):

    • 將經過選擇、交叉、變異產生的新“后代”群體作為下一代種群。
    • 重復執行?評估 → 選擇 → 交叉 → 變異?的循環。
    • 終止條件:?當達到預設的代數、適應度值在連續多代內不再顯著提升、或找到了滿意的解時,算法停止。
    • 輸出:?最終種群中適應度最高的那個個體,即為算法找到的最佳排料方案。
優勢詳解
  • 強大的全局搜索能力:?GA 不是從單點開始搜索,而是維護一個種群,相當于在搜索空間的多個點同時探索。這大大增加了找到全局最優解的可能性,而不是像一些貪心算法那樣容易卡在某個局部最優。
  • 對問題依賴性低:?只要能定義出適應度函數,GA 就可以應用。它不關心問題內部的數學細節(如是否線性、連續),因此非常靈活。
  • 并行性好:?種群中每個個體的適應度評估可以獨立進行,非常適合并行計算,加速求解過程。
  • 適合復雜組合優化:?排料問題是典型的NP-hard問題,隨著零件數量增加,可能的排列組合呈指數級增長。GA 能在合理時間內找到高質量的近似解。
應用實例與局限性
  • 應用:?如您提到的,CNCkad?是成功應用GA的商業軟件典范。許多學術研究也基于GA進行改進,例如:
    • 混合遺傳算法:?將GA與其他算法(如模擬退火、局部搜索)結合,利用GA進行全局探索,用其他算法在局部進行精細調整,進一步提升性能。
    • 自適應遺傳算法:?動態調整交叉和變異概率,提高收斂速度和精度。
  • 局限性:
    • 計算時間:?對于大規模問題,可能需要較長時間才能收斂。
    • 參數敏感:?種群大小、交叉/變異概率等參數的選擇對性能影響較大,需要經驗或調參。
    • 不一定是最優解:?它提供的是一個非常好的近似解,但不能保證是數學上的絕對最優。

總而言之,遺傳算法通過模擬自然界的進化機制,將排料這個復雜的優化問題轉化為一個“進化”過程。它通過不斷地“試錯”和“優選”,最終進化出材料利用率極高的排料方案,是現代智能排料軟件背后的核心引擎之一。







好的,這是一個非常有挑戰性且實用的項目!我們將使用 pywin32 連接 AutoCAD,并實現一個基于遺傳算法(GA)的簡單排版程序,目標是將一組矩形零件盡可能高效地排列在一個大的閉合區域內。

重要說明:

  1. 簡化模型:?真實的工業級排料極其復雜。本示例將進行重大簡化
    • 零件僅為矩形
    • 區域為凸多邊形或矩形(非凸區域處理更復雜)。
    • 不考慮旋轉(或僅允許90度旋轉)。
    • 使用簡單的“左下角”放置策略。
    • GA 編碼為零件下料順序
  2. 依賴庫:
    • pywin32:連接 AutoCAD。
    • numpy:數值計算。
    • random:隨機數生成。
    • typing:類型提示。

步驟 1: 環境準備

確保已安裝:

bash

深色版本

pip install pywin32 numpy

步驟 2: Python 腳本 (ga_nesting_autocad.py)

python

深色版本

import win32com.client
import numpy as np
import random
from typing import List, Tuple, Dict
import pythoncom  # For COM threading# --- 配置參數 ---
POPULATION_SIZE = 50     # 種群大小
NUM_GENERATIONS = 100    # 迭代代數
MUTATION_RATE = 0.05     # 變異概率
CROSSOVER_RATE = 0.8     # 交叉概率class Rectangle:"""表示一個矩形零件"""def __init__(self, width: float, height: float, id: int):self.width = widthself.height = heightself.id = id# 如果允許旋轉,可以添加旋轉狀態self.rotated = False  # 簡化:不旋轉def area(self) -> float:return self.width * self.heightclass NestingArea:"""表示排料區域(凸多邊形)"""def __init__(self, vertices: List[Tuple[float, float]]):self.vertices = np.array(vertices)self.bounds = self._calculate_bounds()def _calculate_bounds(self) -> Tuple[float, float, float, float]:"""計算區域的包圍盒 (min_x, min_y, max_x, max_y)"""min_x = np.min(self.vertices[:, 0])min_y = np.min(self.vertices[:, 1])max_x = np.max(self.vertices[:, 0])max_y = np.max(self.vertices[:, 1])return (min_x, min_y, max_x, max_y)def contains_point(self, x: float, y: float) -> bool:"""簡化:檢查點是否在區域的包圍盒內。真實應用需要使用射線投射法(Ray Casting)或Winding Number算法檢查是否在多邊形內。此處為簡化,僅檢查包圍盒。"""min_x, min_y, max_x, max_y = self.boundsreturn min_x <= x <= max_x and min_y <= y <= max_ydef area(self) -> float:"""簡化:使用包圍盒面積作為區域面積。真實應用應計算多邊形面積。"""min_x, min_y, max_x, max_y = self.boundsreturn (max_x - min_x) * (max_y - min_y)class NestingGA:def __init__(self, parts: List[Rectangle], area: NestingArea):self.parts = partsself.area = areaself.total_part_area = sum(part.area() for part in parts)# 檢查零件總面積是否超過區域面積(簡化檢查)if self.total_part_area > area.area():raise ValueError("零件總面積超過排料區域面積!")def _place_parts(self, order: List[int]) -> List[Tuple[float, float]]:"""根據給定的零件順序,使用簡單的"左下角"策略放置零件。返回每個零件左下角的坐標列表。"""placed_positions = []  # 存儲已放置零件的 (x, y, width, height)part_positions = []    # 存儲每個零件的放置位置 (x, y)# 將順序映射到零件對象ordered_parts = [self.parts[i] for i in order]for part in ordered_parts:# 簡單策略:從 (min_x, min_y) 開始,嘗試放置min_x, min_y, max_x, max_y = self.area.boundsplaced = False# 簡化:只嘗試從左下角開始,逐行掃描(效率很低,僅演示)# 真實算法會使用更智能的空閑區域管理(如最大矩形算法)for y in np.arange(min_y, max_y, 1.0):  # 步長1mmfor x in np.arange(min_x, max_x, 1.0):if self._can_place(part, x, y, placed_positions):placed_positions.append((x, y, part.width, part.height))part_positions.append((x, y))placed = Truebreakif placed:breakif not placed:# 放不下,返回部分放置結果(或標記為無效)print(f"警告: 零件 {part.id} 無法放置!")part_positions.append((0, 0))  # 占位符return part_positionsdef _can_place(self, part: Rectangle, x: float, y: float, placed_positions: List[Tuple[float, float, float, float]]) -> bool:"""檢查零件是否可以在 (x, y) 處放置。檢查:1. 是否在區域內 2. 是否與已放置零件重疊"""# 檢查左下角和右上角是否在區域內(簡化)if (not self.area.contains_point(x, y) or not self.area.contains_point(x + part.width, y + part.height)):return False# 檢查是否與已放置零件重疊for px, py, pw, ph in placed_positions:if (x < px + pw and x + part.width > px and y < py + ph and y + part.height > py):return Falsereturn Truedef fitness(self, individual: List[int]) -> float:"""適應度函數:計算材料利用率。individual: 零件下料順序的索引列表"""positions = self._place_parts(individual)# 簡化:假設所有零件都能放完# 真實情況需要計算實際放置的零件面積# 這里直接使用總面積(因為我們在 _place_parts 中嘗試放置所有零件)# 更好的做法是返回實際利用率# 為了演示,我們假設放置成功# 實際利用率 = 實際放置零件面積 / 區域面積# 但此處簡化為總零件面積 / 區域面積,如果放不下會降低適應度# 這是一個非常粗糙的近似if len(positions) != len(self.parts):return 0.0  # 放不下任何零件,適應度為0# 檢查是否有零件被放置在無效位置(占位符)if any(pos == (0, 0) for pos in positions):return 0.1  # 懲罰,但不是0utilization = self.total_part_area / self.area.area()return utilizationdef create_individual(self) -> List[int]:"""創建一個個體(隨機的零件順序)"""order = list(range(len(self.parts)))random.shuffle(order)return orderdef create_population(self) -> List[List[int]]:"""創建初始種群"""return [self.create_individual() for _ in range(POPULATION_SIZE)]def selection(self, population: List[List[int]], fitnesses: List[float]) -> List[List[int]]:"""輪盤賭選擇"""total_fitness = sum(fitnesses)if total_fitness == 0:# 所有個體適應度為0,隨機選擇return random.choices(population, k=POPULATION_SIZE)probabilities = [f / total_fitness for f in fitnesses]return random.choices(population, weights=probabilities, k=POPULATION_SIZE)def crossover(self, parent1: List[int], parent2: List[int]) -> Tuple[List[int], List[int]]:"""順序交叉 (OX)"""if random.random() > CROSSOVER_RATE:return parent1[:], parent2[:]size = len(parent1)# 隨機選擇交叉點start, end = sorted(random.sample(range(size), 2))# 創建子代child1 = [-1] * sizechild2 = [-1] * size# 復制父代片段child1[start:end] = parent1[start:end]child2[start:end] = parent2[start:end]# 填充剩余位置,保持順序def fill_child(child, parent_source):pointer = endfor i in range(end, end + size):idx = i % sizeval = parent_source[idx]if val not in child:child[pointer % size] = valpointer += 1fill_child(child1, parent2)fill_child(child2, parent1)return child1, child2def mutate(self, individual: List[int]) -> List[int]:"""交換變異"""if random.random() < MUTATION_RATE:i, j = random.sample(range(len(individual)), 2)individual[i], individual[j] = individual[j], individual[i]return individualdef run(self) -> Tuple[List[int], float]:"""運行遺傳算法"""population = self.create_population()best_individual = Nonebest_fitness = 0.0for generation in range(NUM_GENERATIONS):# 計算適應度fitnesses = [self.fitness(ind) for ind in population]# 找到當前代最佳max_fitness = max(fitnesses)if max_fitness > best_fitness:best_fitness = max_fitnessbest_individual = population[fitnesses.index(max_fitness)]print(f"第 {generation+1} 代, 最佳利用率: {best_fitness:.4f}")# 選擇selected = self.selection(population, fitnesses)# 交叉和變異new_population = []for i in range(0, POPULATION_SIZE, 2):parent1 = selected[i]parent2 = selected[i+1] if (i+1) < POPULATION_SIZE else selected[0]child1, child2 = self.crossover(parent1, parent2)child1 = self.mutate(child1)child2 = self.mutate(child2)new_population.extend([child1, child2])population = new_populationreturn best_individual, best_fitnessdef get_selection_from_autocad() -> Tuple[win32com.client.CDispatch, List, List]:"""連接AutoCAD,獲取用戶選擇的閉合多段線(區域)和矩形(零件)。返回: (acad, area_polyline, part_rectangles)"""try:acad = win32com.client.Dispatch("AutoCAD.Application")doc = acad.ActiveDocumentmsp = doc.ModelSpace# 提示用戶選擇print("請在AutoCAD中選擇一個閉合多段線作為排料區域,然后選擇所有矩形零件。")selection = doc.Utility.GetSelection()area_polyline = Nonepart_rectangles = []for entity in selection:if entity.ObjectName == "AcDbPolyline" and entity.Closed:if area_polyline is None:area_polyline = entityprint(f"已選擇區域: {entity.Handle}")else:print("警告: 發現多個閉合多段線,僅使用第一個。")elif entity.ObjectName == "AcDbRectangle":part_rectangles.append(entity)print(f"已選擇零件: {entity.Handle}")else:print(f"忽略對象: {entity.ObjectName}")if not area_polyline:raise ValueError("未選擇有效的閉合多段線作為排料區域!")if not part_rectangles:raise ValueError("未選擇任何矩形零件!")return acad, area_polyline, part_rectanglesexcept Exception as e:print(f"獲取AutoCAD選擇時出錯: {e}")raisedef extract_vertices(polyline) -> List[Tuple[float, float]]:"""從AutoCAD多段線提取頂點坐標"""vertices = []# 多段線的坐標存儲為 [x1, y1, x2, y2, ...]coords = polyline.Coordinatesfor i in range(0, len(coords), 2):vertices.append((coords[i], coords[i+1]))return verticesdef extract_part_dimensions(rectangle) -> Tuple[float, float]:"""從AutoCAD矩形提取寬度和高度"""# 矩形通常有 Length 和 Width 屬性# 或者通過角點計算try:width = rectangle.Widthheight = rectangle.Heightreturn width, heightexcept:# 如果屬性不可用,嘗試通過幾何計算# 這里簡化處理raise NotImplementedError("無法獲取矩形尺寸")def draw_result_in_autocad(acad, best_order: List[int], parts: List[Rectangle], area_vertices: List[Tuple[float, float]], part_positions: List[Tuple[float, float]]):"""在AutoCAD中繪制排料結果。在實際中,best_order 和 part_positions 來自 _place_parts 的結果。"""doc = acad.ActiveDocumentmsp = doc.ModelSpace# 可選:清除舊結果或創建新圖層try:result_layer = doc.Layers.Item("Nesting_Result")except:result_layer = doc.Layers.Add("Nesting_Result")msp.AddLightWeightPolyline([coord for vertex in area_vertices for coord in vertex]).Layer = "Nesting_Result"# 繪制放置好的零件for i, (x, y) in enumerate(part_positions):part = parts[best_order[i]]  # 注意順序if (x, y) != (0, 0):  # 避開占位符# 繪制矩形rect = msp.AddLightWeightPolyline([x, y,x + part.width, y,x + part.width, y + part.height,x, y + part.height,x, y])rect.Layer = "Nesting_Result"# 添加文本標簽text = msp.AddText(f"P{part.id}", win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x, y)), 2.0)text.Layer = "Nesting_Result"def main():"""主函數"""try:# 1. 連接AutoCAD并獲取選擇acad, area_polyline, part_rectangles = get_selection_from_autocad()# 2. 提取數據area_vertices = extract_vertices(area_polyline)nesting_area = NestingArea(area_vertices)parts = []for i, rect in enumerate(part_rectangles):width, height = extract_part_dimensions(rect)part = Rectangle(width, height, i)parts.append(part)print(f"排料區域: {len(area_vertices)} 個頂點")print(f"零件數量: {len(parts)}")# 3. 運行遺傳算法nesting_ga = NestingGA(parts, nesting_area)best_order, best_utilization = nesting_ga.run()print(f"優化完成!最佳利用率: {best_utilization:.4f}")print(f"最佳下料順序: {best_order}")# 4. 計算最佳順序下的實際放置位置# 注意:這里應該用 best_order 調用 _place_parts# 但 _place_parts 是私有方法,我們可以重構或直接調用# 為了演示,我們假設 nesting_ga 有一個方法final_positions = nesting_ga._place_parts(best_order)# 5. 將結果繪制回AutoCADdraw_result_in_autocad(acad, best_order, parts, area_vertices, final_positions)print("排料結果已繪制到AutoCAD圖層 'Nesting_Result'。")except Exception as e:print(f"程序執行出錯: {e}")if __name__ == "__main__":main()

使用步驟

  1. 打開 AutoCAD?并創建一個新圖紙。
  2. 繪制一個閉合的多段線 (PLINE)?作為排料區域。
  3. 繪制若干矩形 (RECTANG)?作為待排料的零件。
  4. 運行 Python 腳本
    bash

    深色版本

    python ga_nesting_autocad.py
  5. 腳本會提示你選擇對象,先選擇區域多段線,再選擇所有矩形零件,然后按 Enter。
  6. 腳本運行 GA 優化,并在控制臺輸出每代的最佳利用率。
  7. 優化完成后,結果會繪制在名為?Nesting_Result?的新圖層上。

局限性與改進方向

  • 放置算法太簡單:?_place_parts?的掃描方式效率極低。應實現最大矩形算法 (Maximal Rectangles)?或最低水平線算法 (Bottom-Left)
  • 區域檢查不準確:?contains_point?僅檢查包圍盒。應實現射線投射法
  • 零件類型有限:?僅支持矩形。可擴展為支持多邊形。
  • 無旋轉:?可添加旋轉狀態到?Rectangle?類。
  • 性能:?對于大量零件,速度會很慢。可考慮并行計算適應度。
  • 錯誤處理:?需要更完善的錯誤處理和用戶交互。

這個腳本提供了一個概念驗證 (POC),展示了如何將 GA 與 AutoCAD 集成。要達到工業級水平,需要在此基礎上進行大量復雜的算法和工程優化。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/96390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96390.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/96390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go語言io.Copy深度解析:高效數據復制的終極指南

在日常開發中&#xff0c;我們經常需要在不同的數據源之間復制數據。無論是文件操作、網絡傳輸還是進程通信&#xff0c;數據復制都是不可或缺的基礎操作。Go語言的標準庫提供了一個強大而高效的工具來簡化這一過程&#xff1a;io.Copy。 什么是io.Copy&#xff1f; io.Copy是G…

【Vue3】07-利用setup編寫vue(2)-setup的語法糖

其它篇章&#xff1a; 1.【Vue3】01-創建Vue3工程 2.【Vue3】02-Vue3工程目錄分析 3.【Vue3】03-編寫app組件——src 4.【Vue3】04-編寫vue實現一個簡單效果 5.【Vue3】05-Options API和Composition API的區別 6.【Vue3】06-利用setup編寫vue&#xff08;1&#xff09; 7.【Vue…

Firefox自定義備忘

1.設置firefox右鍵點擊標簽直接關閉&#xff0c;由于目前沒有插件能實現這個功能&#xff0c;只能手動設置了&#xff08;目前已知支持142和之前的版本&#xff09; firefox117右鍵關閉macWin 117版本應該可以了&#xff0c;大家可試下&#xff0c;配置方法參考之前的帖子&…

跨屏互聯KuapingCMS建站系統發布更新 增加數據看板

跨屏互聯KuapingCMS建站系統發布更新&#xff0c;增加了文章統計、產品統計、軟文統計、流量統計、pv統計、ip統計、os訪問者設備統計等等&#xff0c;整個體驗會更好&#xff0c;數據顯示更加直觀&#xff0c;可以清晰看到最近的網站數據&#xff0c;特別是對于老板&#xff0…

WebSocket連接狀態監控與自動重連實現

WebSocket連接狀態監控與自動重連實現 下面我將實現一個具有連接狀態監控和自動重連功能的WebSocket聊天室界面。 設計思路 創建直觀的連接狀態指示器實現自動重連機制&#xff0c;包括&#xff1a; 指數退避策略&#xff08;重連間隔逐漸增加&#xff09;最大重連次數限制手動…

【Vue2手錄05】響應式原理與雙向綁定 v-model

一、Vue2響應式原理&#xff08;底層基礎&#xff09; Vue2的“響應式”核心是數據變化自動觸發視圖更新&#xff0c;其實現依賴Object.defineProperty API&#xff0c;但受JavaScript語言機制限制&#xff0c;存在“數組/對象修改盲區”&#xff0c;這是理解后續內容的關鍵。 …

探索大語言模型(LLM):Ollama快速安裝部署及使用(含Linux環境下離線安裝)

前言 Ollama 是一個開源的本地化大模型運行平臺&#xff0c;支持用戶直接在個人計算機上部署、管理和交互大型語言模型&#xff08;LLMs&#xff09;&#xff0c;無需依賴云端服務。而且其混合推理的特性也使得CPU和GPU的算力能夠充分被使用&#xff0c;能夠在同等配置下跑更大…

滲透測試信息收集詳解

我們來詳細解析一下滲透測試中信息收集&#xff08;Information Gathering&#xff09;的完整內容、步驟及工具方法。信息收集是整個滲透測試的基石&#xff0c;其深度和廣度直接決定了后續測試的成功率&#xff0c;因此有“滲透測試成功與否&#xff0c;90%取決于信息收集”的…

Kafka面試精講 Day 16:生產者性能優化策略

【Kafka面試精講 Day 16】生產者性能優化策略 在“Kafka面試精講”系列的第16天&#xff0c;我們將聚焦于生產者性能優化策略。這是Kafka中極為關鍵的技術點&#xff0c;也是大廠面試中的高頻考點——尤其是在涉及高并發數據寫入、日志采集、實時數倉等場景時&#xff0c;面試…

深入解析AI溫度參數:控制文本生成的隨機性與創造性

引言 在人工智能飛速發展的今天&#xff0c;文本生成模型如GPT系列已經成為內容創作、代碼編寫、對話系統等領域的核心工具。然而&#xff0c;許多用戶在使用這些模型時&#xff0c;可能會發現輸出結果有時過于保守和重復&#xff0c;有時又過于天馬行空而缺乏連貫性。這背后其…

20250912在榮品RD-RK3588-MID開發板的Android13系統下在接電腦的時候禁止充電

20250912在榮品RD-RK3588-MID開發板的Android13系統下在接電腦的時候禁止充電 2025/9/12 10:21緣起&#xff1a;某人的電腦接榮品RD-RK3588-MID開發板的時候做APK開發板的時候&#xff0c;通過Android Studio連接榮品RD-RK3588-MID開發板。 經常斷聯/時斷時續。投訴了/抱怨了好…

Unity Addressable System 本地服務器功能驗證

1.從Package Manger里安裝Addressable 注意這里有Addressables和Addressables兩個包&#xff0c;前者是核心框架&#xff0c;處理跨平臺通用邏輯&#xff0c;比如用 地址&#xff08;Address&#xff09;來異步加載、卸載資源&#xff1b;自動做引用計數&#xff0c;避免資源泄…

碎片化采購是座金礦:數字化正重構電子元器件分銷的價值鏈

在電子元器件的分銷江湖里&#xff0c;長期存在著一條隱秘的“鄙視鏈”&#xff1a;訂單金額大、需求穩定的頭部客戶是眾星捧月的“香餑餑”&#xff0c;而需求碎片化、品類繁多的小微企業長尾訂單&#xff0c;則常被視作食之無味、棄之可惜的“雞肋”。行業固有認知告訴我們&a…

Typescript - 通俗易懂的 interface 接口,創建接口 / 基礎使用 / 可選屬性 / 只讀屬性 / 任意屬性(詳細教程)

前言 在面向對象語言中&#xff0c;接口是一個很重要的概念&#xff0c;它是對行為的抽象&#xff0c;而具體如何行動需要由類去實現。 TypeScript 中的接口是一個非常靈活的概念&#xff0c;除了可用于 對類的一部分行為進行抽象 以外&#xff0c;也常用于對「對象的形狀&…

【硬件-筆試面試題-92】硬件/電子工程師,筆試面試題(知識點:米勒效應,米勒平臺)

題目匯總版--鏈接&#xff1a; 【硬件-筆試面試題】硬件/電子工程師&#xff0c;筆試面試題匯總版&#xff0c;持續更新學習&#xff0c;加油&#xff01;&#xff01;&#xff01;-CSDN博客 【硬件-筆試面試題-92】硬件/電子工程師&#xff0c;筆試面試題&#xff08;知識點…

C語言深度入門系列:第十一篇 - 動態內存管理與數據結構:程序世界的高效算法大師

C語言深度入門系列&#xff1a;第十一篇 - 動態內存管理與數據結構&#xff1a;程序世界的高效算法大師 本章目標 本章將深入探討C語言中的動態內存管理和經典數據結構實現&#xff0c;這是從基礎編程邁向算法工程師的關鍵一步。您將掌握內存的精確控制、理解各種數據結構的本質…

Go 語言開發環境安裝與 GOPROXY 鏡像配置(含依賴管理與版本切換技巧)

在國內搭建 Go 開發環境的最大障礙不是“怎么裝”&#xff0c;而是“下不動”。本文是我在多臺 Windows / macOS / Linux 機器上踩坑后的整合筆記&#xff1a;用最穩妥的安裝方式 合理的鏡像配置 一套通吃的依賴/版本管理流程&#xff0c;把速度、穩定性和可維護性一次性解決…

崔傳波教授:以科技與人文之光,點亮近視患者的清晰視界?

崔傳波教授&#xff1a;以科技與人文之光&#xff0c;點亮近視患者的清晰視界?在臨沂新益民眼科醫院&#xff0c;有這樣一位眼科醫師——他不僅是近視矯正領域的專家&#xff0c;更是“金視青春之光手術”的研發倡導者。?崔傳波教授?以其深厚的學術功底、創新的技術理念和以…

如何寫過濾條件wrapper的使用

模糊查詢 &#xff1a;功能是&#xff1a;查詢 WORK_NUM 字段包含 ${workOrder.workNum} 的記錄。<if test"workOrder.workNum ! null and workOrder.workNum ! ">and b.WORK_NUM like CONCAT(%,CONCAT(#{workOrder.workNum},%)) </if>一、比較條件方法示…

【Spring Boot 報錯已解決】徹底解決 “Main method not found in class com.xxx.Application” 報錯

文章目錄引言一、問題描述1.1 報錯示例1.2 報錯分析1.3 解決思路二、解決方法2.1 方法一&#xff1a;添加標準的main方法2.2 方法二&#xff1a;檢查main方法的定義是否規范2.3 方法三&#xff1a;檢查主類的位置是否正確2.4 方法四&#xff1a;重新構建項目并清理緩存三、其他…