當前位置:首頁 » 操作系統 » 遺傳演算法的應用

遺傳演算法的應用

發布時間: 2022-01-17 22:47:56

A. 遺傳演算法 簡單程序應用

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

class Best {
public int generations; //最佳適應值代號
public String str; //最佳染色體
public double fitness; //最佳適應值
}

public class SGAFrame extends JFrame {

private JTextArea textArea;
private String str = "";
private Best best = null; //最佳染色體
private String[] ipop = new String[10]; //染色體
private int gernation = 0; //染色體代號
public static final int GENE = 22; //基因數
/**
* Launch the application
* @param args
*/
public static void main(String args[]) {
try {
SGAFrame frame = new SGAFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Create the frame
*/
public SGAFrame() {
super();

this.ipop = inialPops();

getContentPane().setLayout(null);
setBounds(100, 100, 461, 277);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JLabel label = new JLabel();
label.setText("X的區間:");
label.setBounds(23, 10, 88, 15);
getContentPane().add(label);

final JLabel label_1 = new JLabel();
label_1.setText("[-255,255]");
label_1.setBounds(92, 10, 84, 15);
getContentPane().add(label_1);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
SGAFrame s = new SGAFrame();
str = str + s.process() + "\n";
textArea.setText(str);
}
});
button.setText("求最小值");
button.setBounds(323, 27, 99, 23);
getContentPane().add(button);

final JLabel label_2 = new JLabel();
label_2.setText("利用標准遺傳演算法求解函數f(x)=(x-5)*(x-5)的最小值:");
label_2.setBounds(23, 31, 318, 15);
getContentPane().add(label_2);

final JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBounds(23, 65, 399, 164);
getContentPane().add(panel);

final JScrollPane scrollPane = new JScrollPane();
panel.add(scrollPane, BorderLayout.CENTER);

textArea = new JTextArea();
scrollPane.setViewportView(textArea);
//
}

/**
* 初始化一條染色體(用二進制字元串表示)
* @return 一條染色體
*/
private String inialPop() {
String res = "";
for (int i = 0; i < GENE; i++) {
if (Math.random() > 0.5) {
res += "0";
} else {
res += "1";
}
}
return res;
}

/**
* 初始化一組染色體
* @return 染色體組
*/
private String[] inialPops() {
String[] ipop = new String[10];
for (int i = 0; i < 10; i++) {
ipop[i] = inialPop();
}
return ipop;
}

/**
* 將染色體轉換成x的值
* @param str 染色體
* @return 染色體的適應值
*/
private double calculatefitnessvalue(String str) {
int b = Integer.parseInt(str, 2);
//String str1 = "" + "/n";
double x = -255 + b * (255 - (-255)) / (Math.pow(2, GENE) - 1);
//System.out.println("X = " + x);
double fitness = -(x - 5) * (x - 5);
//System.out.println("f(x)=" + fitness);
//str1 = str1 + "X=" + x + "/n"
//+ "f(x)=" + "fitness" + "/n";
//textArea.setText(str1);

return fitness;
}

/**
* 計算群體上每個個體的適應度值;
* 按由個體適應度值所決定的某個規則選擇將進入下一代的個體;
*/
private void select() {
double evals[] = new double[10]; // 所有染色體適應值
double p[] = new double[10]; // 各染色體選擇概率
double q[] = new double[10]; // 累計概率
double F = 0; // 累計適應值總和
for (int i = 0; i < 10; i++) {
evals[i] = calculatefitnessvalue(ipop[i]);
if (best == null) {
best = new Best();
best.fitness = evals[i];
best.generations = 0;
best.str = ipop[i];
} else {
if (evals[i] > best.fitness) // 最好的記錄下來
{
best.fitness = evals[i];
best.generations = gernation;
best.str = ipop[i];
}
}
F = F + evals[i]; // 所有染色體適應值總和

}
for (int i = 0; i < 10; i++) {
p[i] = evals[i] / F;
if (i == 0)
q[i] = p[i];
else {
q[i] = q[i - 1] + p[i];
}
}
for (int i = 0; i < 10; i++) {

double r = Math.random();
if (r <= q[0]) {
ipop[i] = ipop[0];

} else {
for (int j = 1; j < 10; j++) {
if (r < q[j]) {
ipop[i] = ipop[j];
break;
}
}
}
}
}

/**
* 交叉操作
* 交叉率為25%,平均為25%的染色體進行交叉
*/
private void cross() {
String temp1, temp2;
for (int i = 0; i < 10; i++) {
if (Math.random() < 0.25) {
double r = Math.random();
int pos = (int) (Math.round(r * 1000)) % GENE;
if (pos == 0) {
pos = 1;
}
temp1 = ipop[i].substring(0, pos)
+ ipop[(i + 1) % 10].substring(pos);
temp2 = ipop[(i + 1) % 10].substring(0, pos)
+ ipop[i].substring(pos);
ipop[i] = temp1;
ipop[(i + 1) / 10] = temp2;
}
}
}

/**
* 基因突變操作
* 1%基因變異m*pop_size 共180個基因,為了使每個基因都有相同機會發生變異,
* 需要產生[1--180]上均勻分布的
*/
private void mutation() {
for (int i = 0; i < 4; i++) {
int num = (int) (Math.random() * GENE * 10 + 1);
int chromosomeNum = (int) (num / GENE) + 1; // 染色體號

int mutationNum = num - (chromosomeNum - 1) * GENE; // 基因號
if (mutationNum == 0)
mutationNum = 1;
chromosomeNum = chromosomeNum - 1;
if (chromosomeNum >= 10)
chromosomeNum = 9;
//System.out.println("變異前" + ipop[chromosomeNum]);
String temp;
if (ipop[chromosomeNum].charAt(mutationNum - 1) == '0') {
if (mutationNum == 1) {
temp = "1" + ipop[chromosomeNum].substring

(mutationNum);
} else {
if (mutationNum != GENE) {
temp = ipop[chromosomeNum].substring(0, mutationNum -

1) + "1" + ipop

[chromosomeNum].substring(mutationNum);
} else {
temp = ipop[chromosomeNum].substring(0, mutationNum -
1) + "1";
}
}
} else {
if (mutationNum == 1) {
temp = "0" + ipop[chromosomeNum].substring

(mutationNum);
} else {
if (mutationNum != GENE) {
temp = ipop[chromosomeNum].substring(0, mutationNum -

1) + "0" + ipop

[chromosomeNum].substring(mutationNum);
} else {
temp = ipop[chromosomeNum].substring(0, mutationNum -
1) + "1";
}
}
}
ipop[chromosomeNum] = temp;
//System.out.println("變異後" + ipop[chromosomeNum]);
}
}
/**
* 執行遺傳演算法
*/
public String process() {
String str = "";
for (int i = 0; i < 10000; i++) {
this.select();
this.cross();
this.mutation();
gernation = i;
}
str = "最小值" + best.fitness + ",第" + best.generations + "個染色體";
return str;
}

}

B. 電力系統中關於遺傳演算法的應用

可以直接將X設為一個母體,每個母體由X1,X2,X3,X4組成。每一組解為一個母體。

種群大小就是你取的母體(X)的個數。

約束條件在函數中可以用if等語句實現。

我也只是用遺傳演算法做了一下畢業設計,沒有深究,夠用就行了

歡迎LL單Q我討論.....

C. 遺傳演算法有什麼經典應用

遺傳演算法(Genetic Algorithm)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法。遺傳演算法是從代表問題可能潛在的解集的一個種群(population)開始的,而一個種群則由經過基因(gene)編碼的一定數目的個體(indivial)組成。每個個體實際上是染色體(chromosome)帶有特徵的實體。染色體作為遺傳物質的主要載體,即多個基因的集合,其內部表現(即基因型)是某種基因組合,它決定了個體的形狀的外部表現,如黑頭發的特徵是由染色體中控制這一特徵的某種基因組合決定的。因此,在一開始需要實現從表現型到基因型的映射即編碼工作。

D. 高分懸賞:遺傳演算法應用實例

柔性生產計劃?我想在這方面,遺傳演算法應用的例子還是有一些的。比如說人員的安排,機器設備的調度等

E. 遺傳演算法的程序應用,最好舉例說明。

這種很主流的演算法能搜到很多。
比如遺傳演算法合集,包括遺傳演算法簡介、研究熱點、著作、站點、參考論文下載等:
http://www.chinaai.org/ai/neural-network/genetic-algorithm.html

看之前記得打開殺毒軟體跟防火牆。

F. 遺傳演算法在數學上的應用

應用遺傳演算法搜索邊坡最小安全系數的研究
陸峰 陳祖煜 李素梅
(中國水利水電科學研究院結構材料所)

提 要
本文簡要介紹了滑坡滑裂面搜索問題和遺傳演算法,並試用遺傳進化演算法從邊坡任意形狀滑裂面組合中搜索最有可能的滑裂面,也就是使安全系數最小的滑裂面。作為實例,分析了遺傳演算法在天生橋二級電站首部樞紐進水口右岸滑坡分析中的應用。

關鍵詞 邊坡;安全系數;遺傳演算法;EMU程序。

1.前言

在應用條分法進行邊坡穩定分析的過程中,從可能的滑裂面集合中確定相應最小安全系數的臨界滑裂面是很關鍵的一步。這是一個確定安全系數這個泛函對滑裂面形狀這個自變函數的極小值問題。由於實際情況的復雜性,求這一極小值的解析方法很難付諸實施。從實用角度出發,基於最優化原理發展起來的求邊坡最小安全系數的方法是比較有效而且便於應用。這些方法有"窮舉法"、"黃金分割法"、"鮑威爾法"等,但它們都只能應用於圓弧形滑裂面或圓弧-直線形(改良圓弧法)滑裂面的情形。對於比較符合岩質邊坡的具有多個自由度的折線形滑裂面情形,孫君實用復形法取得較好的效果;陳祖煜提出了單純形法,使最優化方法搜索邊坡最危險滑裂面更加有效,且不會漏掉可能的最小值。單純形法程序已在國內外多家工程、科研和教育單位得到應用,並不斷隨著應用工程案例數量的增加而不斷完善[1]。單純形法使最優化方法應用於岩質邊坡穩定性分析的研究和應用前進了一大步。同為最優化方法,遺傳演算法是最近發展起來的一種仿生尋優演算法。國內外已有一些學者試圖將遺傳演算法應用於搜索安全系數最小的邊坡滑裂面,以期獲得更優的結果。文獻[2]將此演算法應用於基於圓弧滑裂面假定的任意形狀坡面的非均質土坡情況,搜索的目標是使邊坡安全系數最小的圓弧滑裂面圓心和半徑。本文將在文獻[1]和文獻[2]的基礎上,應用遺傳演算法搜索邊坡安全系數最小的任意形狀滑裂面,根據工程實踐經驗,主要是折線組合的滑裂面。 2.遺傳演算法及其應用於岩土工程的基礎

如前所述,搜索邊坡最危險滑裂面問題是安全系數對滑裂面形狀的泛函極值問題。數值方法求解這一問題的主要手段是迭代運算。一般的迭代方法容易陷入局部極小的陷阱而出現"死循環"現象,使迭代無法進行。遺傳演算法很好地克服了這個缺點,是一種全局優化演算法。
生物在漫長的進化過程中,從低等生物一直發展到高等生物,可以說是一個絕妙的優化過程。這是自然環境選擇的結果。人們研究生物進化現象,總結出進化過程包括復制、雜交、變異、競爭和選擇。一些學者從生物遺傳、進化的過程得到啟發,提出了遺傳演算法(GA)。演算法中稱遺傳的生物體為個體(indivial),個體對環境的適應程度用適應值(fitness)表示。適應值取決於個體的染色體(chromosome),在演算法中染色體常用一串數字表示,數字串中的一位對應一個基因(gene)。一定數量的個體組成一個群體(population)。對所有個體進行選擇、交叉和變異等操作,生成新的群體,稱為新一代(new generation)。
遺傳演算法計算程序的流程可以表示如下[3]:
第一步 准備工作
(1)選擇合適的編碼方案,將變數(特徵)轉換為染色體(數字串,串長為m)。通常用二進制編碼。
(2)選擇合適的參數,包括群體大小(個體數M)、交叉概率PC和變異概率Pm。
(3)確定適應值函數f(x)。f(x)應為正值。
第二步 形成一個初始群體(含M個個體)。在邊坡滑裂面搜索問題中,取已分析的可能滑裂面組作為初始群體。
第三步 對每一染色體(串)計算其適應值fi,同時計算群體的總適應值 。
第四步 選擇
計算每一串的選擇概率Pi=fi/F及累計概率 。選擇一般通過模擬旋轉滾花輪(roulette,其上按Pi大小分成大小不等的扇形區)的演算法進行。旋轉M次即可選出M個串來。在計算機上實現的步驟是:產生[0,1]間隨機數r,若r<q1,則第一串v1入選,否則選v2,使滿足qi-1<r<qi(2≤i≤m)。可見適應值大的入選概率大。
第五步 交叉
(1) 對每串產生[0,1]間隨機數,若r>pc,則該串參加交叉操作,如此選出參加交叉的一組後,隨機配對。
(2) 對每一對,產生[1,m]間的隨機數以確定交叉的位置。
第六步 變異
如變異概率為Pm,則可能變異的位數的期望值為Pm ×m×M,每一位以等概率變異。具體為對每一串中的每一位產生[0,1]間的隨機數r,若r<Pm,則該位發生反轉,如對染色體二進制編碼為數字0變為1,1變為0。
如新個體數達到M個,則已形成一個新群體,轉向第三步;否則轉向第四步繼續遺傳操作。直到找到使適應值最大的個體或達到最大進化代數為止。
由於選擇概率是由適應值決定的,即適應值大的染色體入選概率也較大,使選擇起到"擇優汰劣"的作用。交叉使染色體交換信息,結合選擇規則,使優秀信息得以保存,不良信息被遺棄。變異是基因中得某一位發生突變,以達到產生確實有實質性差異的新品種。遺傳演算法雖是一種隨機演算法,但它是有導向的,它所使用的"按概率隨機選擇"方法是在有方向的搜索方法中的一種工具。正是這種獨特的搜索方法,使遺傳演算法自然地避開了其它最優化演算法常遇到的局部最小陷阱。遺傳演算法搜索最優結果的效果在數學上還沒有嚴格的證明,但它的有效性已在許多專業的應用的得到體現。對於岩質邊坡安全系數對滑裂面形狀這樣不可微的泛函極值問題,就目前的科學認識水平來講,遺傳演算法不失為一種可以信賴的方法。 3.用遺傳演算法搜索安全系數最小的邊坡任意形狀滑裂面

在邊坡(尤其是岩質邊坡)最危險滑裂面搜索問題中,滑裂面的實際形狀是很復雜的,起控製作用的是岩體的主要結構面和邊坡的體型。從以往實際工程經驗看,可以總結出岩質邊坡滑裂面在順滑方向上的剖面形狀為折線,由岩體結構面和局部岩土材料的剪切破壞面連接而成。這樣,搜索最危險滑裂面的問題就可以簡化為從折線滑裂面組合中尋優的問題。本文用遺傳進化演算法解決這個問題。
(1) 定義遺傳演算法的目標函數
目標函數定義為邊坡的安全系數,用安全系數的大小表示解的適應值。在邊坡最危險滑裂面搜索問題中,解的安全系數越小,適應性能越好。
(2) 初始群體的確定
根據邊坡的工程地質調查記錄,根據經驗初步擬定出一批滑裂面形狀。如圖1所示,滑裂面由點序列Ai(xi,yi)(i=1,?,N)表示。將點序列AI的坐標(xi,yi)依次排列成x1y1x2y2?xNyN的形式,經二進制編碼形成一條染色體。對於擬定的滑裂面形狀,其對應的安全系數用EMU程序[4]進行計算。
(3) 確定搜索范圍
根據經驗對每個點Ai,確定其坐標(xi,yi)的可能變化范圍。在此范圍內搜索導致最小安全系數的邊坡滑裂面形狀。
(4) 計算
將初始種群的所有擬定滑裂面形狀(染色體)交給遺傳演算法程序進行計算。具體過程參見前文。

4.算例分析[4]

圖1 天生橋二級電站首部樞紐進水口右岸滑坡示意圖

選用天生橋二級電站首部樞紐進水口右岸滑坡作為算例,圖1為其計算簡圖。滑坡高約30m,總方量為7000餘m3,主要為第四系沖坡積物和施工堆碴。物理力學參數見表1。

表1 各土層物理力學性能指標
土層 密度(g/cm3) 抗剪強度指標
內摩擦角 凝聚力(kPa)
① 施工棄碴 1.85 21.8° 19.6
② 坡積土 1.85 21.8° 0.0
③ 砂土 1.85 21.8° 29.4
④ 砂質淤泥 1.85 20.8° 34.3
⑤ 河卵石、礫石 1.90 24.2° 0.0

滑坡發生前,靠近坡腳處因修建擋土牆被開挖而削弱邊坡的整體穩定性,可以斷定滑坡的滑裂面將從此經過。本例題還將忽略實際工程中坡頂張裂縫的影響。選用5個點的折線來模擬滑裂面形狀,初步確定AiBiCiDiE(i=1~4)為可能的滑裂面。滑裂面上端點Ai的y坐標已受限制,下端點E的x、y坐標均已確定,故滑裂面只有7個自由度。按遺傳演算法的要求將滑裂面表示成如下形式:
xAxByBxCyCxDyD
四個模擬滑裂面的坐標和由EMU程序分析的安全系數列於表2。
表2 模擬滑裂面坐標及安全系數(坐標單位 m)
滑裂面 xA xB yB xC yC xD yD 安全系數
A1B1C1D1E 35.44 27.69 16.82 18.79 9.25 11.39 4.49 0.92
A2B2C2D2E 38.15 30.60 20.69 23.14 14.60 14.12 8.37 0.99
A3B3C3D3E 39.02 34.18 18.47 26.28 10.41 16.07 4.58 1.02
A3B3C4D4E 39.02 34.18 18.47 25.12 11.39 14.70 4.97 1. 03

限制搜索范圍為每個自由度可在2.0m范圍內變化。將4個排列好的數字串作為輸入數據交給遺傳演算法程序進行編碼、計算。經過大量運算,最後在最大種群代數(1000)群體中找到使安全系數最小的坐標數字串,經解碼形成如下坐標:
(36.89,30.07)(33.25,21.52)(21.71,9.34)(13.54,5.07)(0.0,0.0)
即為圖1中的ABCDE滑裂面。由遺傳演算法求出其相應的安全系數為0.90。滑裂面形式和安全系數都比較接近實際情況。

5.結語

遺傳演算法是一種高效的尋優演算法,而且能有效地解決局部最小問題、非線性映射關系的表示、非線性映射關系不可微等普通優化演算法常遇到的問題。算例的成果證明了這一特點。將遺傳演算法應用於滑坡滑裂面搜索問題,主要的工作是將工程問題簡化成遺傳演算法需要的形式,簡化時需詳細參考地質調查資料和工程經驗,務使簡化的形式接近實際情況。對於簡化的搜索樣本,其安全系數的計算必須可靠,為此可應用一些比較成熟的計算程序,如EMU等。充分考慮實際工程地質情況和選取切合實際的搜索樣本後,遺傳演算法程序必將能為滑坡搜索出最有可能的滑裂面。

參考文獻

1 陳祖煜,邵長明,最優化方法在確定邊坡最小安全系數方面的應用,岩土工程學報,Vol.10, No.4, 1998.7。
2 肖專文,張奇志,梁力,林韻梅,遺傳進化演算法在邊坡穩定性分析中的應用,岩土工程學報,Vol.20, No.1, 1998.1。
3 周明,孫樹棟,遺傳演算法原理及應用,國防工業出版社,1999.6。
4 陳祖煜,岩質高邊坡穩定分析程序EMU,1995.5。

Research on Searching Least Factor of Safety of Slopes with Genetic Algorithm

Lu Feng Chen Zuyu Li Sumei
(Department of Structure and Material, IWHR)

Abstract

The problem of searching least factor of safety of slopes and the theory of Genetic Algorithm have been introced in this paper. This theory has been employed to solve this problem to find the most possible slide of slopes. As an example, the application of genetic algorithm on the Tianshengqiao Power Station Right Bank Slide has been presented.

Keywords: Slope, Factor of Safety, Genetic Algorithm, EMU Program.

G. 為什麼遺傳演算法能被廣泛的應用到各個領域

遺傳演算法在很多領域都得到應用;從神經網路研究的角度上考慮,最關心的是遺傳演算法在神經網路的應用。在遺傳演算法應用中,應先明確其特點和關鍵問題,才能對這種演算法深入了解,靈活應用,以及進一步研究開發。一、遺傳演算法的特點 1.遺傳演算法從問題解的中集開始嫂索,而不是從單個解開始。這是遺傳演算法與傳統優化演算法的極大區別。傳統優化演算法是從單個初始值迭代求最優解的;容易誤入局部最優解。遺傳演算法從串集開始搜索,復蓋面大,利於全局擇優。 2.遺傳演算法求解時使用特定問題的信息極少,容易形成通用演算法程序。由於遺傳演算法使用適應值這一信息進行搜索,並不需要問題導數等與問題直接相關的信息。遺傳演算法只需適應值和串編碼等通用信息,故幾乎可處理任何問題。 3.遺傳演算法有極強的容錯能力遺傳演算法的初始串集本身就帶有大量與最優解甚遠的信息;通過選擇、交叉、變異操作能迅速排除與最優解相差極大的串;這是一個強烈的濾波過程;並且是一個並行濾波機制。故而,遺傳演算法有很高的容錯能力。 4.遺傳演算法中的選擇、交叉和變異都是隨機操作,而不是確定的精確規則。這說明遺傳演算法是採用隨機方法進行最優解搜索,選擇體現了向最優解迫近,交叉體現了最優解的產生,變異體現了全局最優解的復蓋。 5.遺傳演算法具有隱含的並行性

H. 遺傳演算法具體應用

1、函數優化

函數優化是遺傳演算法的經典應用領域,也是遺傳演算法進行性能評價的常用算例,許多人構造出了各種各樣復雜形式的測試函數:連續函數和離散函數、凸函數和凹函數、低維函數和高維函數、單峰函數和多峰函數等。

2、組合優化

隨著問題規模的增大,組合優化問題的搜索空間也急劇增大,有時在目前的計算上用枚舉法很難求出最優解。對這類復雜的問題,人們已經意識到應把主要精力放在尋求滿意解上,而遺傳演算法是尋求這種滿意解的最佳工具之一。

此外,GA也在生產調度問題、自動控制、機器人學、圖象處理、人工生命、遺傳編碼和機器學習等方面獲得了廣泛的運用。

3、車間調度

車間調度問題是一個典型的NP-Hard問題,遺傳演算法作為一種經典的智能演算法廣泛用於車間調度中,很多學者都致力於用遺傳演算法解決車間調度問題,現今也取得了十分豐碩的成果。

從最初的傳統車間調度(JSP)問題到柔性作業車間調度問題(FJSP),遺傳演算法都有優異的表現,在很多算例中都得到了最優或近優解。


(8)遺傳演算法的應用擴展閱讀:

遺傳演算法的缺點

1、編碼不規范及編碼存在表示的不準確性。

2、單一的遺傳演算法編碼不能全面地將優化問題的約束表示出來。考慮約束的一個方法就是對不可行解採用閾值,這樣,計算的時間必然增加。

3、遺傳演算法通常的效率比其他傳統的優化方法低。

4、遺傳演算法容易過早收斂。

5、遺傳演算法對演算法的精度、可行度、計算復雜性等方面,還沒有有效的定量分析方法。

熱點內容
C語言tf 發布:2024-11-15 14:36:22 瀏覽:810
違反密碼法是什麼意思 發布:2024-11-15 14:36:20 瀏覽:920
androidmp3錄音 發布:2024-11-15 14:32:50 瀏覽:493
英朗自動擋哪個配置最好 發布:2024-11-15 14:27:44 瀏覽:253
編譯原理斷言有哪幾種 發布:2024-11-15 14:25:29 瀏覽:200
資料庫數據重復 發布:2024-11-15 14:23:17 瀏覽:781
安卓端開發用什麼IDE 發布:2024-11-15 14:13:51 瀏覽:554
阿里雲查看訪問ip 發布:2024-11-15 14:08:58 瀏覽:544
隨機字元串php 發布:2024-11-15 14:03:46 瀏覽:122
怎樣用資料庫搭建伺服器 發布:2024-11-15 13:58:39 瀏覽:478