2016年6月29日 星期三

Java SocketServer的運用

最近實作簡單的SocketServer,可以互相多人通訊

先來講講 我實作的 Server Client 概念

我把SocketServer分為四個部分

第一部分initLayout(),我利用swing來繪製程式,主要是宣告一個panel,然後把繪圖元件都丟進去panel裡,再利用fame新增panel,在更新畫面(fame.ravalidate())

第二部分setIPAdrress(),利用InetAddress物件,把自身IP放入在LBIpAds.setText()。

第三部分initRequestListener(),把TFmsg TextField增加傾聽者(KeyListener),傾聽
TFmsgKeyListener物件,裡面主要功能是keyReleased(KeyEvent event),當按下按鈕放開時,會觸發這個功能。

第四部分是serverReceiver(),我宣告兩個變數ServerSocket和ExecutorService,ServerSocket放入自身接收Port,LISTEN_PORT=2525,而ExecutorService 則是接收當有ServerSocket回應(
serverSocket.accept)把 ServerReceiveThread( socket )放入threadExecutor(Thread Pool)


我們來講解一下ServerReceiveThread部分,這是當有Client回應時,Server會專門創立一個Thread給它,一直傾聽有沒有訊息回來。而ServerRequestThread部分,則是Server想要發送訊息,或者是當有Client傳訊息到Serever再轉發給其他Client時,會使用的物件。


再來是SocketClient部分,也分為四個部分
前兩個部分和Server一樣,
第三部分是initSocketClient(String host,int port)利用new Socket( host, port );連線遠端的Server給他一個Thread執行傾聽遠端Server的訊息這部分和Server一樣

而initRequestListener()部分,也是和Server一樣,傾聽鍵盤回應,然後發送給ClientRequestThread,讓他傳送到Server。

以下是程式碼,可以直接執行

2016年6月21日 星期二

字元與字串

講串流之前,先釐清字元與字串

字元
一個英文字母、數字、或其他符號,我們稱為字元,要表示成一個字元時,我們可以用一對單引號

e.gs.,   char a='b'

而java中有一些特殊字元可以使用,通常用反斜線與一個字元作組合,我們稱之為 逸出序列(escape sequence),而反斜線又稱為逸出字元(escape character)

常見的逸出序列有以下:
1.\n   換行符號
2.\t   水平定位鍵
3.\r   歸位字元
4.\\   列印反斜線
5.\"   列印雙引號

而電腦儲存字元的方式是以八位元整數(1 Byte)來儲存而儲存的整數與符號的對應關係我們稱之為ASCII碼(American Standard Code for Information Interchange) 以前常聽到的對應就是'a'=36 'A'=97

字串
字串顧名思義是一段文字,通常使用一對雙引號將一段文字夾起來,而英文字會佔1Byte,中文字佔2Bytes,而我們要判斷一段文字是否有中文則可以使用

String s="您好";
System.out.println((s.getBytes().length==s.length())?"無中文":"有中文");

利用Bytes總數和字串長度做比對。

2016年6月1日 星期三

粒子群演算法運用及Java程式碼


粒子群主要決策利用「自身經驗」與「其他人經驗」進行決策。

粒子每一次自身經驗都有適應值,可以衡量這次經驗的好壞,
並且有記憶性可以紀錄每次經驗的位置與適應值。

PSO流程圖


PSO表達式





Vid(t+1):下一次粒子的速度
Vid(t):這次粒子的速度
Pid(T):粒子所經過最好的位置(每個粒子都有一個最好位置)
Xid(t):粒子這次的位置
Gid(T):粒子群所經過最好的位置(一個粒子群只會有一個最好位置)
C1,C2:控制且避免數值太大
Xid(t+1):粒子下次的位置


演算法練習:

1.主要是初始化一開始粒子群Initialization,然後依據繁延代數,進行移動ParticleMove,在這個方法裡我有利用varyVector1、varyVector2來控制,避免數值太大,最後如果數值出過-4~4間,強迫介於在這,不然變化量太大造成位置移動有問題。

2.Parameter沒有使用到封裝,如果需要再自行更改程式碼。

3.利用JFreeChart free lib來畫出JFreeLineChart迭代圖



2016年5月18日 星期三

Scala shell for Eclipse

在終端機下達指令brew install scala

Scala IDE for Eclipse 安裝

Help->Install New Software->Add

Name: Scala IDE
Location: http://download.scala-ide.org/sdk/lithium/e44/scala211/stable/site

把 Scala IDE for Eclipse 和 Scala IDE for Eclipse Development Support兩個選項打勾

然後等待一段時間下載


開一個Scala專案

輸入HolloWorld.scala 檔案

object HellWorld extends App {
  println("hello,")
}

執行看看有沒有差

不能使用Application 因為
Application has been deprecated from scala 2.9, probably it has been deleted in scala 2.11 (it still exists in scala 2.10) even though at the moment I can't find proofs for that, use App instead.

2016年5月8日 星期日

基因演算法運用及程式碼

碩士期間剛好有一堂是最佳演算法,講到基因演算法的運用和作業

剛好有機會記下來,與網友們一起討論使用

題目是:


1. 題目
Max f (x1, x2 ) = 21.5 + x1 sin(4πx1) + x2 sin(20πx2 )
−3.0 ≤ x1 ≤ 12.1, 4.1 ≤ x2 ≤ 5.8
試以基因演算法求最大值f
2. 基因演算法(以流程圖或虛擬碼表示即可)
3. 設計編碼方式 (使用二進位編碼來代表 x1 x2 的值)
4. 決定群體規模 (族群數量)
5. 設計適應函數 (決定個體適應度的評估標準)
6. 決定挑選與複製方法
7. 定義交配與交配機率
8. 定義突變與突變機率
9. 決定終止條件
10. 結果與討論(含收斂過程圖)

我的解法

2.基因演算法流程圖


3.編碼方式

假設某個數值x1=11.1
X1==11.1;
If(x1==11.1)
{
  x1=(x1+3)*10;
  x1_binary=
Integer.toBinary (x1);
}
x1_binary==10001101;

假設某個數值x1 二進位= 10001101
x1_binary==10001101;
If(x1_binary==10001101)
{
  x1=Integer.valueOf(x1_binary);
  x1=x1/10-3;
}
X1==11.1;
假設某個數值x1=-3.0
X1==0;
If(x1==-3.0)
{
  x1=(x1+3)*10;
  x1_binary=
Integer.toBinary (x1);
}x1_binary== 00000000;

假設某個數值x1 二進位= 00000000
x1_binary== 00000000;
If(x1_binary==00000000)
{
  x1=Integer.valueOf(x1_binary);
  x1=x1/10-3;
}
X1==0;

4.群體規模 (族群數量)

初始群體規模為
int groundCount=10;
經過第一次交配,以後規模擴增為
copulationCount=groundCount*2;
5.適應函數
直接代入
Max f (x1, x2 ) = 21.5 + x1 sin(4πx1) + x2 sin(20πx2 )
f當適應函數

6.
挑選與複製方法
樣本基因利用公式計算出來的各個f
取出
10%優秀f樣本基因、前30%優秀樣本基因、前70%優秀樣本基因、前90%優秀樣本基因(輪盤式選擇)
複製完後放入交配池(激增兩倍基因)

7.
交配與交配機率
一開始隨機取出兩對基因
把第一對x1前四碼和第二對x2前四碼交配出新基因的x1
把第一對x2前四碼和第二對x1前四碼交配出新基因的x2
強制交配出特定數量

8.
突變與突變機率   
 在交配的時候,有十分之一的機率發生突變,當發生突變的時候,隨機x1x2發生突變,突變是隨機挑選binary的其中一個做改變。

e.gs., 10001101=>10101101(第三位發生突變)

9.
終止條件 

其繁延代數跑完,就是終止條件


10.結果與討論

 因為我起始基因個數非常的低(設定為10),所以我依靠演化(交配、突變)來使基因越來越好,但非常依靠繁延代數。

總而言之,每一代的基因都有往好的地方發展出去!所以繁延代數越高,基因品質越好。



以下是程式碼:

2016年4月9日 星期六

Java- Collection 和 Map 集合物件

集合物件快速記法

Java集合主要由兩個介面衍伸出來Collection and Map

Collection的子介面有 Set, Queue, List

而分別為
Collection => 無序集合
Set => 無序集合,元素不可重複
Queue => 佇列(Fist In Fist out)
List =>有序結合,元素可以重複

Map=>每筆資料都是Key-Value組成

--------------------------------------------------------------------------------------------

所以需存取元素的話
Set => 根據元素本身來做存取(所以不可重複)
List => 根據索引值存取(所以有序)
Map =>根據關鍵字存取(所以Key不可重複)

--------------------------------------------------------------------------------------------

最常使用到的集合類別
TreeSet, HashSet, ArrayDeque, LinkedList, ArrayList, HashMap, TreeMap

--------------------------------------------------------------------------------------------

Set
有些實作的類別HashSet、TreeSet、EnumSet都是執行緒不安全的,
所以需手動保證該集合的同步性,可以用Collections的synchronizeSortedSet
包裝該集合。
e.gs.,
SortedSet sortedSet=Collections.synchronizeSortedSet(new TreeSet(...));

HashSet
1.順序是無序,添加時有可能順序會變化
2.非同步機制
3.集合可以是null
4.依照hashCode值,決定儲存位置
5.判斷元素相等 => equals 和 hashCode 相等
6.存取元素是用hashcode快速尋找

LinkedHashSet
1.維護元素的插入順序(效能略低於HashSet)

TreeSet
1.SortedSet介面實作出來
2.依照實際元素的大小進行排序(除非沒自訂排序)
3.如果要自訂排序,可以參考test1、test2檔案

EnumSet
1.元素必須為enum的列舉值
2.依照enum中的排列順序依序排列

--------------------------------------------------------------------------------------------

List
1.可依靠索引值進行插入、刪除、查詢
2.可往前迭代(previous)和往後迭代(iterator)

ArrayListVector
1.可以動態配置陣列(可用ensureCapacity來一次配置,提高性能)
2.ArrayList執行緒安全、Vector執行緒不安全
3.推薦使用ArrayList,因Vector太古老

--------------------------------------------------------------------------------------------
Queue
1.先進先出(Frist In Frist out)

priorityQueue
1.是用元素大小排列,並不是存放順序(並不是絕對標準的佇列實作)

Deque(interface)
1.雙端佇列
2.實作ArrayDeque、LinkedList

ArrayDeque
1.相比Stack(較古老),推薦使用
2.push=>作為堆疊(FILO),add/offer=>作為佇列(FIFO)
3.可以參考test3檔案,看輸出狀況為[3,2,1,5,4]

--------------------------------------------------------------------------------------------

LinkedList
1.實作Deque、List介面
2.雙端佇列
3.List功能

--------------------------------------------------------------------------------------------
Map(Interface)
1.可以利用keySet返回所有key組成的set
2.實作HashMap、LinkedHashMap、SortedMap(interface)、TreeMap
    EnumMap

HashMapHashtable
1.Hashtable是一個古老的Map實作類別
2.Hashtable是一個執行緒安全的實作,反之HashMap是不安全(但速度較快)
3.Hashtable不允許key and value為null,反之HashMap則可以
4.與Set一樣,無法保證元素順序
5. key請勿隨意使用程式修改值,容易找不到對應的值

LinkedHashMap
1.插入時可以保持添加(put)順序(鏈結串列)

Properties
1.Hashtable的子類別
2.key、value都是字串類型
3.可用InputStream、OutputStream存取*.ini檔
4.可已把key-value對以XML檔的形式存放或載入
5.可以參考test4檔案

TreeMap
1.SortedMap介面實作出來
2.保證所有key-value處於有序狀態

WeakHashMap
1.相比於HashMap(強參照),當key所參照的物件沒被其他強參照變數所參照,
   則所參照的物件有可能被垃圾回收,而WeakHashMap也會自動刪除所對應
   的Key-Value

IdentityHashMap
1.處理新增進來的key-value比較特殊,當兩個key嚴格相等時(key1==key2,true)
   才會認為兩個key相等(正常來說key1.equals(key2),true 和 hashCode相等就行了)

EnumMap
1.元素必須為enum的列舉值
2.依照enum中的排列順序依序排列
3.不允許key為null,但value可以



*陣列元素是連續的,且長度是固定,無法自由增加長度,但hashCode是
依照hashCode值運算其儲存位置,所以可以自由增加長度。

*一般來說,陣列(Array)是一塊連續的記憶體,所以存取時效能最好,而以鏈結
串列(Linked)來說,執行插入、刪除操作時有較好效能。

*Java先實作Map,然後通過包裝一個所有value都為null的Map集合,
  實作出Set集合類別,所以Set和Map關係非常密切。


參考於細說Java 8 異常處理與圖形介面程式設計