主頁 >  其他 > 解決數獨問題用人工智能還是量子計算?

解決數獨問題用人工智能還是量子計算?

2020-09-25 13:54:21 其他

作為一種有趣的棋盤游戲,數獨誕生100周年之后,它是如何成為計算研究的焦點之一的呢?探索如何使用人工智能或量子計算機從頭開始創建一個智能數獨求解器,

在深入探究之前,先來了解一下歷史

馬克?布洛赫說:“歷史被稱為學科之母,”那么,讓我們來談談著名的數獨游戲是如何誕生的吧,這個故事可以追溯到19世紀末,起源于法國,法國日報《世紀報》(Le Siecle)發布了一款9x9大小的猜謎游戲,它需要算術運算而不是邏輯運算,它的數字是兩位數,而不是1- 9,它的游戲性質與數獨游戲(Sudoku)類似,即把橫排、列和對角線的數字相加,也會得到相同的數字,1979年,退休的建筑師和puzzler Howard Garns被認為是現代數獨游戲的創造者,該游戲以數字地名的名義首次在戴爾雜志上發表,1986年,日本一家名為Nikoli的拼圖公司首次以Sudoku的名字出版了這個拼圖,

在解決數獨游戲的問題框架

數獨是一個約束滿足問題(CSP)的真實體子,因為變數集、域集和約束集都是有限的,我們必須在一個9x9表中輸入1-9之間的數字,這樣每一行、每列和每3x3子表中的數字都只包含一個數字, Sudoku也存在另一種變化,即Diagonal Sudoku,它在表對角線的每個對角線中都規定了一組額外的約束,每個數字必須準確地具有一次特征, 我們知道約束滿足域,最優解必須滿足所有約束,或更具體地說,它應該遵守游戲規則, 最優解將滿足集合中的所有約束,從而解決難題,

計算上,可以用非確定性多項式時間(NP)解決求解數獨的約束,因為可以使用一些非常特殊的蠻力演算法來解決約束,并且也可以在多項式時間內測驗解集的有效性,其中輸入 該問題與多項式長度的一組解有關, 完全解決的數獨就是拉丁方格的示例(如Euler所述,n x n陣列填充有n個不同的符號), 數獨問題可以認為是圖形著色問題,其中我們僅需要使用9種顏色對圖形進行著色,而裸露的字母可以認為是部分顏色,

使用人工智能演算法集滿足約束

計算科學的基本原理是依靠邏輯來滿足某些約束的能力, 在解決數獨問題時,我們必須訓練求解器以尋找除基本規則外的一些特定的獲勝模式, 因此,問題在于系統不僅在盲目地遵循規則,而且在考慮其近期和長期影響的同時做出一些決策, 這些模式稱為啟發式, 類似于巧遇游戲知識和技巧的專家玩家,僅了解基本規則并不能使他們成為游戲專家, 因此,當我們開發演算法并解決問題時,我們必須牢記有用的啟發式方法,我們還應將其包含在程式中,以使其在獲勝時變得更聰明,更有用,

對于我們的Sudoku Solver,我們將輸入81個數字的序列作為字串,并用’,’(句號)表示未解決的數字, 為了解決該問題,我們將“,”替換為可以放入該單元格的所有可能數字,

根據數獨的限制,我們不能在任何單元格附近的行,列或3x3子正方形中多次使用一個數字, 在對角數獨的情況下,我們還必須考慮相同的約束, 我們首先用所有可能的數字1到9替換句點,我們使用以下grid_values函式以編程方式進行此操作,

# For the sake of caluclation we take rows as alphaneumeric and columns as numeric. 
rows = 'ABCDEFGHI' 
columns = '123456789'
boxes = [r + c for r in rows for c in columns]  #every possible cell combination in the grid.

def grid_values(grid):
  """
  Take in the Unsolved Sudoku Sequence and replaces the unsolved boxes initially with all
  possible values which can get into that cell. Lastly returns a dictionary containing the 
  values at all cell positions along with cells. 
  """
  values = []
  every_digits = '123456789'
  for n in grid:
    if c == '.':   # replacing every unsolved value with every possible value initially.
      values.append(every_digits)
    else:          # if already solved, causing it no change. 
      values.append(c)
   assert len(values) == 81
   return dict(zip(boxes, values)) #returning the sudoku grid with all possible cell values. 

首先在所有未解決的單元格中分配所有可能的值,

現在,我們用1到9之間的所有可能數字替換了未解決的單元格,從數獨的基本規則中我們知道,如果數字已經在該行,列和3x3子欄位中使用過,我們就不能使用它兩次, 因此,讓我們消除它們,如果我們在未解決的網格中遇到它們時,我們最初已經用所有可能的數字填充了它們, 因此,讓我們看一下如何使用消除python方法從未解決的單元中消除那些不相關的數字,

columns_reversed = columns[::-1] #reversing the columns for calculating the Diagonal Units.

def make_combinations(m, n):
  """
  Takes in input of generally iterables and creates all possible combintation out of them.
  args:
   a: string iterable
   b: string iterable
   return : list of all possible combination. 
  """
  return [x + y for x in m for y in n]

row_units = [make_combinations(r, columns) for r in rows]
column_units = [make_combinations(rows, c) for c in columns]
sub_square_units = [make_combinations(m, n) for m in ('ABC', 'DEF', 'GHI') 
                    for n in ('123','456','789')]
diagonal_1_units = [[rows[i]+columns[i] for i in range(len(rows))]]
diagonal_2_units = [[rows[i]+columns_reversed[i] for i in range(len(rows))]]
diagonal_units = diagonal_1_units + diagonal_2_units
all_units = row_units + column_units + square_units + diagonal_units
units = dict((b, [u for u in all_units if b in u]) for b in boxes)
peers = dict((b, set(sum(units[b], [])) - {b}) for b in boxes)

def eliminate(values):
  """
  Eliminate the redundant numbers from the unsolved cells if the number already appeared once 
  in the peer of the current cell. 
  What we do here is we erase that redundant number from the unsolved value cells if appeared once. 
  """
  solved_cells = [box for box in values.keys() if len(values[box]) == 1] # cell is solved if there's only one digit
  for box in solved_cells:
    value_at_cell = values[box]   # retrieve the current value at that cell.
    for peer in peers[box]:       # check for the cell's peers if the value appears again.
      values[peer] = values[peer].replace(value_at_cell, '')
   return values   # return the modified values dictionary.

因此,在滿足這些約束的同時,有時我們會遇到一些只能放置一個數字的單元格,但除該數字外,其他數字對于該特定單元格都不再可行, 我們首先要填寫這些內容, 有了適當的解決方案, 我們稱此為“唯一選擇”,它是解決數獨網格單元的最簡單的啟發式方法,

def only_choice(values):
  """
  If in order to satisfy the constraints of the Sudoku Puzzle there is only a single viable option
  we fill in the Cell with that option only and thereby obtain a solve for the cell. 
  
  """
  for unit in all_units:     #searching across all the vicinity of the cell.
    for digit in '123456789':  
      to_be_filled = [cell for cell in unit if unit in values[unit]]
      if len(to_be_filled) == 1:  # if there exists only a single cell in the unit which is not solved
        values[to_be_filled[0]] = digit  # We fill in the cell with its proper answer.    
  return values

在迄今為止圍繞約束滿足的程序中,可能會出現以下情況:一個單元中將有兩個未解決的像元(考慮行,列和3x3子正方形),其中只能分配兩個特定的剩余數, 因此,這兩個數字可以有效地從同一單元中其他單元格上的可能數字中洗掉, 這種啟發式方法稱為裸雙胞胎, 該演算法的實作專門制作了網格值的深層副本,并檢查了裸胎雙胞胎的可行性,即是否存在兩個僅能接受兩個特定值的未解決像元,如果可行,它將繼續進行并從其他兩個值中洗掉這兩個值 同一單元中的單元格, 我們使用如下所示的nude_twins函式以編程方式實作它:

def naked_twins(values):
	"""
	If there are two unsolved cells in a same unit exist such that it can only be filled by only 
	two specific digits, then those two digits can be safely removed from all other cells in the same unit.
	"""
	twins_possible = [unit for unit in values.keys() if len(values[unit]) == 2]  
	twins = [[unit1, unit2] for unit1 in twins_possible for unit2 in peers[unit1] 
					 if set(values[unit1]) == (set(values[unit2]))]    #confimed Naked Twins
	for twin in twins:
		unit1 = twin[0] 
		unit2 = twin[2]
		peers1 = set(peers[unit1])  
		peers2 = set(peers[unit2])
		common_peers = peers1 & peers2  #finding the intersection between the peers of the two naked twin element
		for peer in common_peers:
			if len(values[peer]) >  1:
				for value in values[unit1]:
					values[peer] = values[peer].replace(val, ''))  # Erasing the values. 
	return values

現在,我們嘗試通過重復應用這三個約束滿足演算法并檢查它是否卡住并且無法進一步減少,來盡可能地減少難題, 我們通過使用reduce_puzzle函式以編程方式執行此操作, 我們要做的是在for回圈中呼叫前三個函式,并在網格值的輸入和輸出序列中的已解決單元數相同時終止該函式,這意味著不能再進一步減小它 僅約束滿足演算法,

def reduce_puzzle(values):
	"""
	Applying the 4 Constraint Satisfaction Algorithms until it is not further reducible. 
	Checking if the Number of Solved Cells between the iteration.
	"""
	solved_values = [unit for unit in values.keys() if len(values[unit]) == 1] # considering solved cells
	stuck = False #boolean flag to determine the end of loop
	while not stuck:
		prev_solved_values = len([unit for unit in values.keys() if len(values[unit]) == 1]) #checkpoint 1
		values = eliminate(values) # applying Elimination CSP
		values = only_choice(values) # applying Only Choice CSP
		values = naked_twins(values)  # applying Naked Twins CSP
		after_solved_values = len([unit for unit in values.keys() if len(values[unit]) == 1])
		stuck = after_solved_values == prev_solved_values  # Getting out of loop is the number of solved cell is still the same as the previous iteration.
		
		if len([unit for unit in values.keys() if len(values[unit]) == 0]):
			return False   # if there's problems in the internal representation of the sudoku grid return False. 
	return values			# return the reduced grid values. 	

如果數獨網格仍未通過約束滿足問題解決,則部分解決方案將到達輸出,其中一些單元格仍將分配給某些可能的值, 在這種情況下,我們要做的是使用搜索樹搜索那些位置中的最佳數字集, 我們使用深度優先搜索(DFS)演算法遍歷搜索樹, 因此,基本上,使用DFS,我們用相同的網格創建了幾個實體,并為每個尚未解決的單元嘗試了不同的可能分配, 我們遞回地要求CSP演算法根據搜索結果減少網格, 我們以編程方式實作它,如下所示:

def search(values):
	"""
	Recursive Depth-First Search: If the sudoku grid is not further reducible by constraint satisfaction
	a few of the cells will be left with different options and with DFS with search for the optimal 
	values for those yet-unsolved cells.  
	"""
	values = reduce_puzzle(values) # We call the Reduction Function to reduce the puzzle further based on the search results across iterations. 
	if values is False:
		return False
	if all(len(values[b]) == 1 for b in boxes):
		print("Sudoku Problem Solved!")
		return values
	m, n = min((len(values[b]), b) for b in boxes if len(values[b]) > 1)
	for value in values[n]:
		new_sudoku = values.copy()
		new_sudoku[n] = value
		attempted = search(new_sudoku)
		if attempted:
			return attempted		

我們使用display sudoku函式將輸入的字串序列顯示為二維9x9 Sudoku網格:

def display(values):
    """
    Display the values as a 2-D grid.
    Input: The sudoku in dictionary form
    """
    width = 1 + max(len(values[b]) for b in boxes)
    line = '+'.join(['-' * (width * 3)] * 3)
    for r in rows:
        print(''.join(values[r + c].center(width) + ('|' if c in '36' else '')
                      for c in cols))
        if r in 'CF':
            print(line)
    return

為了解決數獨序列,我們將上述函式呼叫如下:

if __name__ == "__main__":
    diag_sudoku_grid = '2.............62....1....7...6..8...3...9...7...6..4...4....8....52.............3'
    values = grid_values(diag_sudoku_grid)
    values = reduce_puzzle(values)
    values = search(values)
    display(values)

輸出如下所示,其中一組演算法已成功計算出答案,

解決數獨作為約束滿足問題的量子方法

現在,我們將嘗試使用“量子模擬退火”解決簡單的Sudoku網格, 首先,什么是模擬退火? 對于這樣的優化問題,我們的想法是使用一些次優啟發式演算法,并獲得最優的啟發式演算法集以獲得最優解, 我們在這里使用DWave AQC模型(糖尿病量子計算)來采樣滿足前面討論的約束的最佳解決方案,…

使用DWave Kerberos混合采樣器:

在本示例中,我們正在使用DWave隨附的混合求解器, 它通過運行并行搜索來找出最佳的啟發式方法, 它是一種混合求解器,因為它同時使用了量子計算和經典的計算特性, 它也是一個分解采樣器,在處理時使用異步作業流, 它包含在DWave Systems的Ocean SDK軟體包中, 要開始本地開發,請確保您的系統上安裝了Python 3.5+,然后發出以下命令,

python -m pip install --upgrade pip
pip install dwave-ocean-sdk

使用二進制二次模型(BQM)進行計算

我們無法構造直接準備將其饋送到Quantum Computers的約束,我們需要一個中間表示來將其饋入, 這就是為什么我們將使用BQM的原因,幸運的是,DWave Ocean SDK已經提供了一種稱為“組合”的工具,可用于將約束滿足問題歸結為BQM, 首先,顧名思義,二進制二次模型本身就是一個方程系統,它是二次的,用二進制表示, 由于計算的復雜性更高,Quantum計算機使用這些計算可以大大加快開發程序, 因此,在游戲中,我們決定使用dimod的組合工具,該工具將回傳一個二進制二次模型,該模型對于其輸入變數和內部變數的k個組合中的每一個均最小,

我們首先從dwave-ocean-sdk匯入必要的軟體包,并在實際讀入Sudoku Grid之前進行一些完整性檢查,

import dimod  
import math 
import sys
import dimod.generators.constraints import combinations
from hybrid.reference import KerberosSampler

def prettify(row, col, digit):
    return "{row}, {col}_{digit}".format(row, col, digit)

def read_matrix(filename):
    with open(filename, 'r') as f:
        all_lines = f.read()
    lines = []
    for line in all_lines:
        new_line = line.rstrip()
        if new_line:
            new_line = list(map(int, new_line.split(' ')))
            lines.append(new_line)
    return lines 


def sanity_check(matrix):
    n = len(matrix)
    m = int(math.sqrt(n))
    unique_digits = set(range(1, 1+n))

    for row in matrix:
        if set(row) != unique_digits:
            print("Error in row", row)
            return false
    for j in range(n):
        col = [matrix[i][j] for i in range(n)]
        if set(col) != unique_digits:
            print("Error in column", col)

    subsquare_idx = [(i, j) for i in range(m) for j in range(m)]
    for r_scalar in range(m):
        for c_scalar in range(m):
            subsquare = [matrix[i + r_scalar * m ][j + c_scalar * m] for i, j in subsquare_idx]
            if set(subsquare) != unique_digits:
                print('Error in sub-square', subsquare)
                return True

    return True

現在,我們使用Sudoku Grid的行,列和子正方形索引的所有可用變陣列合,使用組合工具來創建二進制二次模型,

def main():

    if len(sys.argv) > 1:
        filename = sys.argv[1]
        
    matrix = read_matrix(filename)
    n = len(matrix)
    m = int(math.sqrt(n))
    digits = range(1, n+1)

    bqm = dimod.BinaryQuadraticModel({}, {}, 0.0, dimod.SPIN)

    for row in range(n):
        for col in range(n):
            node_digits = [prettify(row, col, digit) for digit in digits]
            one_digit_bqm = combinations(node_digits, 1)
            bqm.update(one_digit_bqm)

    for row in range(n):
        for digit in digits:
            row_nodes = [prettify(row, col, digit) for col in range(n)]
            row_bqm = combinations(row_nodes, 1)
            bqm.update(row_bqm)
    for col in range(n):
        for digit in digits:
            col_nodes = [prettify(row, col, digit) for row in range(n)]
            col_bqm = combinations(col_nodes, 1)
            bqm.update(col_bqm)


if __name__ == "__main__":
    main()

就是這樣, 我們已經成功實作了兩種智能解決方案,其中一種使用經典計算,并且使用了功能非常強大的人工智能啟發式演算法,甚至可以解決對角數獨網格, 第二種方法使用異步混合啟發式采樣器,該采樣器也恰好使用絕熱量子計算模型的模擬退火來將約束滿足問題轉換為二進制二次模型以對其進行采樣,從而獲得最佳采樣解,

作者:Swastik Nath

deephub翻譯組

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/125975.html

標籤:其他

上一篇:微軟與 OpenAI 達成合作,獲得 GPT-3 獨家使用授權!

下一篇:渣渣本科的2021屆秋招總結-淚目

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more