2016年6月29日 星期三

Java SocketServer的運用

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

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

我把SocketServer分為四個部分
public static void main (String[] args)
{
SocketServer socketServer=new SocketServer();
socketServer.initLayout();
socketServer.setIPAdrress();
socketServer.initRequestListener();
socketServer.serverReceiver();
}
view raw Main hosted with ❤ by GitHub

第一部分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部分,也分為四個部分
public static void main (String[] args)
{
SocketClient socketClient=new SocketClient();
socketClient.initLayout();
socketClient.setIPAdrress();
socketClient.initSocketClient("10.105.1.56", LISTEN_PORT);
socketClient.initRequestListener();
}
view raw Main hosted with ❤ by GitHub
前兩個部分和Server一樣,
第三部分是initSocketClient(String host,int port)利用new Socket( host, port );連線遠端的Server給他一個Thread執行傾聽遠端Server的訊息這部分和Server一樣

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

以下是程式碼,可以直接執行
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import javax.swing.*;
public class SocketClient {
String[] test={"cat","dog","fish"};
JFrame fame;
JPanel panel;//setLayout=null
JLabel LBmsg;
JTextField TFmsg;
JLabel LBIpAds;
JTextArea TAcontent;
JScrollPane SPcontent;
JButton BTdisconnectAll;
JButton BTdisconnectUser;
JComboBox CBuser;
public static final int LISTEN_PORT = 2525;
String msg="";
Socket socket = null;
public static void main (String[] args)
{
SocketClient socketClient=new SocketClient();
socketClient.initLayout();
socketClient.setIPAdrress();
socketClient.initSocketClient("10.105.1.56", LISTEN_PORT);
socketClient.initRequestListener();
}
public void initLayout()
{
fame=new JFrame("Socket Client");
panel=new JPanel(null);//setLayout=null
LBmsg=new JLabel("由此傳送訊息:");
TFmsg=new JTextField();
LBIpAds=new JLabel("IP Address:");
TAcontent=new JTextArea("");
SPcontent=new JScrollPane(TAcontent,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
BTdisconnectAll=new JButton("斷開Server");
BTdisconnectUser=new JButton("斷開所選用戶");
CBuser=new JComboBox(test);
fame.setBounds(0,0,600,500);
fame.setVisible(true);
fame.setResizable(false);
LBmsg.setLocation(10,10);
LBmsg.setSize(100,30);
TFmsg.setLocation(110,10);
TFmsg.setSize(450,30);
LBIpAds.setLocation(10,50);
LBIpAds.setSize(400,30);
TAcontent.setLineWrap(true);
SPcontent.setLocation(10,90);
SPcontent.setSize(400,350);
BTdisconnectAll.setLocation(420,90);
BTdisconnectAll.setSize(150,50);
BTdisconnectUser.setLocation(420,150);
BTdisconnectUser.setSize(150,50);
CBuser.setLocation(420,220);
CBuser.setSize(150, 20);
panel.add(LBmsg);
panel.add(TFmsg);
panel.add(LBIpAds);
panel.add(SPcontent);
panel.add(BTdisconnectAll);
panel.add(BTdisconnectUser);
panel.add(CBuser);
fame.add(panel);
fame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
fame.revalidate() ;
}
public void setIPAdrress()
{
InetAddress adr = null;
try {
adr = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
LBIpAds.setText("IP Address:"+adr.getHostAddress());
}
public void initSocketClient(String host,int port)
{
try
{
socket = new Socket( host, port );
socket.setSoTimeout(100000);//處理時間過長,SocketTimeoutException
new Thread(new ClientReceiveThread()).start();
new Thread(new ClientRequestThread("test1")).start();
new Thread(new ClientRequestThread("test2")).start();
}
catch ( IOException e )
{
e.printStackTrace();
}
}
public void initRequestListener()
{
TFmsg.addKeyListener(new TFmsgKeyListener());
}
/**
* 處理Server端 User想要發送訊息。
*/
class TFmsgKeyListener implements KeyListener
{
@Override
public void keyReleased(KeyEvent event)
{
if(event.getKeyCode()==10)
{
TAcontent.append("ClientSelf:"+TFmsg.getText()+"\t\n");
new Thread(new ClientRequestThread(TFmsg.getText())).start();;
TFmsg.setText("");
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
}
class ClientReceiveThread implements Runnable
{
DataInputStream input = null;
public ClientReceiveThread()
{
try
{
input = new DataInputStream( socket.getInputStream() );
}
catch (IOException e)
{
// TODO Auto-generated catch block
System.out.println("ClientReceiveThread error:"+e);
}
}
@Override
public void run() {
String content = null;
try
{
content=input.readUTF();
while((content=input.readUTF()) !=null) //input.readUTF()會等待stream,直到傳東西回來
{
TAcontent.append(content +"\r\n");
}
}
catch(SocketTimeoutException e)
{
TAcontent.append("連線超時:"+ e +"\r\n");
try
{
socket.close();
} catch (IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
System.out.println("ClientReceiveThread run error:"+e);
try
{
socket.close();
} catch (IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
class ClientRequestThread implements Runnable
{
DataOutputStream output = null;
String msg;
public ClientRequestThread(String msg)
{
try
{
output = new DataOutputStream(socket.getOutputStream());
this.msg=msg;
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run()
{
try
{
output.writeUTF( msg );
output.flush();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
view raw SocketClient hosted with ❤ by GitHub
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.*;
public class SocketServer {
/*------------Layout Panel-------------*/
JFrame fame;
JPanel panel;
JLabel LBmsg;
JTextField TFmsg;
JLabel LBIpAds;
JTextArea TAcontent;
JScrollPane SPcontent;
JButton BTdisconnectAll;
JButton BTdisconnectUser;
JComboBox CBuser;
/*------------Use Variable-------------*/
public static final int LISTEN_PORT = 2525;
//define store all ArrayList of Socket and then package is sofe thread
public static List<Socket> socketList=Collections.synchronizedList(new ArrayList());
public static void main (String[] args)
{
SocketServer socketServer=new SocketServer();
socketServer.initLayout();
socketServer.setIPAdrress();
socketServer.initRequestListener();
socketServer.serverReceiver();
}
public void initLayout()
{
fame=new JFrame("Socket Server");
panel=new JPanel(null);//setLayout=null
LBmsg=new JLabel("由此傳送訊息:");
TFmsg=new JTextField();
LBIpAds=new JLabel("IP Address:");
TAcontent=new JTextArea("");
SPcontent=new JScrollPane(TAcontent,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
BTdisconnectAll=new JButton("斷開Server");
BTdisconnectUser=new JButton("斷開所選用戶");
CBuser=new JComboBox();
fame.setBounds(0,0,600,500);
fame.setVisible(true);
fame.setResizable(false);
LBmsg.setLocation(10,10);
LBmsg.setSize(100,30);
TFmsg.setLocation(110,10);
TFmsg.setSize(450,30);
LBIpAds.setLocation(10,50);
LBIpAds.setSize(400,30);
TAcontent.setLineWrap(true);
SPcontent.setLocation(10,90);
SPcontent.setSize(400,350);
BTdisconnectAll.setLocation(420,90);
BTdisconnectAll.setSize(150,50);
BTdisconnectUser.setLocation(420,150);
BTdisconnectUser.setSize(150,50);
CBuser.setLocation(420,220);
CBuser.setSize(150, 20);
panel.add(LBmsg);
panel.add(TFmsg);
panel.add(LBIpAds);
panel.add(SPcontent);
panel.add(BTdisconnectAll);
panel.add(BTdisconnectUser);
panel.add(CBuser);
fame.add(panel);
fame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
fame.revalidate() ;
}
public void setIPAdrress()
{
InetAddress adr = null;
try {
adr = InetAddress.getLocalHost(); //IPv6
adr =Inet4Address.getLocalHost();//IPv4
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
LBIpAds.setText("IP Address:"+adr.getHostAddress());
}
public void initRequestListener()
{
TFmsg.addKeyListener(new TFmsgKeyListener());
}
public void serverReceiver()
{
ServerSocket serverSocket = null;
ExecutorService threadExecutor = Executors.newCachedThreadPool(); //建立Thread Pool,讓Client可以連進來不斷線
try
{
serverSocket = new ServerSocket( LISTEN_PORT );
TAcontent.append("Server listening requests..."+"\r\n");
while ( true )// 不斷接收來自網路客戶端的連接請求
{
Socket socket = serverSocket.accept();
synchronized(socketList)
{
socketList.add(socket);
System.out.println("123sum:"+socketList.size());
threadExecutor.execute( new ServerReceiveThread( socket ) );
}
}
}
catch ( IOException e )
{
e.printStackTrace();
}
finally
{
if ( threadExecutor != null )
threadExecutor.shutdown();
if ( serverSocket != null )
try
{
serverSocket.close();
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}
/**
* 處理Server端 User想要發送訊息。
*/
class TFmsgKeyListener implements KeyListener
{
@Override
public void keyReleased(KeyEvent event)
{
if(event.getKeyCode()==10)
{
TAcontent.append("Server:"+TFmsg.getText()+"\t\n");
new Thread(new ServerRequestThread(TFmsg.getText())).start();;
TFmsg.setText("");
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
}
/**
* 處理Server端的Receive接收執行緒。
*/
class ServerReceiveThread implements Runnable
{
private Socket clientSocket;
DataInputStream input = null;
public ServerReceiveThread( Socket clientSocket )
{
this.clientSocket = clientSocket;
}
@Override
public void run()
{
TAcontent.append("有"+clientSocket.getRemoteSocketAddress() +"連線進來!"+"\r\n");
UpdateCBuser(String.valueOf(clientSocket.getRemoteSocketAddress()),"add"); //CBuser新增user
try
{
input = new DataInputStream( this.clientSocket.getInputStream() );
while ( true )
{
//這部分,Server回應太快,Client還沒開啟所以訊息會loss
new Thread(new ServerRequestThread(String.format("Hi, %s!\n", clientSocket.getRemoteSocketAddress() ))).start();
break;
}
String content=null;
while((content=readFromClient())!=null)
{
TAcontent.append(content + "\r\n");
new Thread(new ServerRequestThread(content)).start();
}
}
catch ( IOException e )
{
e.printStackTrace();
}
finally
{
try
{
if ( input != null )
{
input.close();
System.out.println("input close");
}
if ( this.clientSocket != null || !this.clientSocket.isClosed() )
{
this.clientSocket.close();
System.out.println("clientSocket close");
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}
private String readFromClient()
{
try
{
return input.readUTF();
}
catch(IOException e)
{
socketList.remove(clientSocket);
UpdateCBuser(String.valueOf(clientSocket.getRemoteSocketAddress()),"remove"); //CBuser新增user
}
return null;
}
}
/**
* 處理Client端的Request請求執行緒。
*/
class ServerRequestThread implements Runnable
{
DataOutputStream output = null;
String msg="";
public ServerRequestThread(String msg)
{
this.msg=msg;
}
@Override
public void run() //這部分不知道Runnable run完會不會自動清除DataOutputStream output
{
// TODO Auto-generated method stub
synchronized(socketList)
{
System.out.println("sum:"+socketList.size());
for(Socket socket:socketList)
{
try
{
output = new DataOutputStream( socket.getOutputStream() );
output.writeUTF(this.msg);
output.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
void UpdateCBuser(String User ,String action)
{
if(action=="add")
{
CBuser.addItem(User);
CBuser.setSelectedIndex(0);
System.out.println(CBuser.getSelectedIndex());
}
else if(action=="remove")
{
CBuser.removeItem(User);
}
CBuser.revalidate();
CBuser.repaint();
panel.revalidate();
panel.repaint();
fame.revalidate();
fame.repaint();
}
}
view raw SocketServer hosted with ❤ by GitHub

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迭代圖



import java.util.Timer;
import java.util.TimerTask;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
public class JFreeLineChart extends ApplicationFrame
{
DefaultCategoryDataset dataset = new DefaultCategoryDataset( );
JFreeChart lineChart;
public JFreeLineChart(String title,String chartTitle)
{
super(title);
lineChart = ChartFactory.createLineChart(
chartTitle,
"Period","Fitness Number",
dataset,
PlotOrientation.VERTICAL,
true,true,false);
ChartPanel chartPanel = new ChartPanel( lineChart );
chartPanel.setPreferredSize( new java.awt.Dimension( 1000 , 500 ) );
setContentPane(chartPanel);
CategoryPlot plot = (CategoryPlot)lineChart.getPlot();
}
public void UpdataDataset(double fitness,String name,int period)
{
dataset.addValue( fitness , name , String.valueOf(period));
}
public void UpdataLayout(int timerStart,int timerSpeed)
{
Timer t = new Timer();
CategoryPlot plot = (CategoryPlot)lineChart.getPlot();
t.schedule(new TimerTask()
{
public void run()
{
plot.setDataset(dataset);;
}
},timerStart,timerSpeed);
}
}
view raw JFreeLineChart hosted with ❤ by GitHub
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Random;
import org.jfree.ui.RefineryUtilities;
/*
* topic
*
* find min number problem
*
* z=x1^2+2*x2^2-0.3cos(3*3.14*x1)-0.4cos(4*3.14*x2)+0.7
* x1,x2 belong -100~100
*
* first step ,define initialization
*/
public class main
{
private static int groupCount=100;
private static int period=1000000;
private static int max=100,min=-100;
private static int maxV=(max-min)/50; // max velocity
private static double varyVector1=0.1,varyVector2=0.1; //controller vary vector
private static ArrayList<Parameter> listParticle=new ArrayList<Parameter>();
private static Parameter gBest=new Parameter();
private static Particle particle;
private static JFreeLineChart jFreeLineChart;
public static void main(String args[])
{
createParticle();
createJFreeLineChart();
for(int i=0;i<period;i++)
{
listParticle=particle.ParticleMove(listParticle,gBest);
Parameter beforegBest=gBest; // not print too much value
gBest=particle.FindGlobalBest(listParticle.get(0),gBest);
if(beforegBest.pBestFitness>gBest.pBestFitness)
{
particle.showGlobal(i,gBest);
jFreeLineChart.UpdataDataset(gBest.pBestFitness, "Particle", i);
}
}
System.out.println("happy end");
}
private static void createParticle()
{
particle=new Particle(groupCount,max,min,maxV,varyVector1,varyVector2);
listParticle=particle.Initialization(listParticle);
gBest=listParticle.get(0);
}
private static void createJFreeLineChart()
{
jFreeLineChart=new JFreeLineChart("Particle Line Chart","Fitness of Particle");
jFreeLineChart.pack( );
RefineryUtilities.centerFrameOnScreen( jFreeLineChart );
jFreeLineChart.setVisible( true );
jFreeLineChart.UpdataLayout(1000,1000);
}
}
view raw main hosted with ❤ by GitHub
public class Parameter {
public double positionX1,positionX2,vectorX1,vectorX2;
public double fitness;
public double pBestFitness;
public double pBestPositionX1;
public double pBestPositionX2;
}
view raw Parameter hosted with ❤ by GitHub
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Random;
public class Particle
{
private int groupCount;
private int max,min;
private int maxV; // max velocity
private double varyVector1,varyVector2; //controller vary vector
private final DecimalFormat df = new DecimalFormat("###.#######"); //controller decimal format
private Random rand=new Random();
Particle(int groupCount,int max,int min,int maxV,double varyVector1,double varyVector2)
{
this.groupCount=groupCount;
this.max=max;
this.min=min;
this.maxV=maxV;
this.varyVector1=varyVector1;
this.varyVector2=varyVector2;
}
public ArrayList<Parameter> Initialization(ArrayList<Parameter> list)
{
Parameter parameter;
double number;
for(int i=0;i<groupCount;i++)
{
parameter=new Parameter();
number=rand.nextDouble()*(max-min)+min;
parameter.positionX1=number;
number=rand.nextDouble()*maxV-maxV/2;
parameter.vectorX1=number;
number=rand.nextDouble()*(max-min)+min;
parameter.positionX2=number;
number=rand.nextDouble()*maxV-maxV/2;
parameter.vectorX2=number;
parameter=FitnessEquation(parameter);
parameter.pBestFitness=parameter.fitness;
parameter.pBestPositionX1=parameter.positionX1;
parameter.pBestPositionX2=parameter.positionX2;
list.add(parameter);
}
list=sortList(list);
return list;
}
public ArrayList<Parameter> ParticleMove(ArrayList<Parameter> list,Parameter gBest)
{
ArrayList<Parameter> listMove=new ArrayList<Parameter>();
Parameter parameter;
for(int i=0;i<groupCount;i++)
{
parameter=new Parameter();
parameter.vectorX1=list.get(i).vectorX1
+varyVector1*(rand.nextDouble()*2-1)*(list.get(i).pBestPositionX1-list.get(i).positionX1)
+varyVector2*(rand.nextDouble()*2-1)*(gBest.positionX1-list.get(i).positionX1);
if(parameter.vectorX1>4) //avoid too large vector
parameter.vectorX1=4;
else if(parameter.vectorX1<-4)
parameter.vectorX1=-4;
parameter.positionX1=list.get(i).positionX1+list.get(i).vectorX1;
if(parameter.positionX1>max) // avoid x1 exceed range
parameter.positionX1=max;
if(parameter.positionX1<min)
parameter.positionX1=min;
parameter.vectorX2=list.get(i).vectorX2
+varyVector1*(rand.nextDouble()*2-1)*(list.get(i).pBestPositionX2-list.get(i).positionX2)
+varyVector2*(rand.nextDouble()*2-1)*(gBest.positionX2-list.get(i).positionX2);
if(parameter.vectorX2>4)//avoid too large vector
parameter.vectorX2=4;
else if(parameter.vectorX2<-4)
parameter.vectorX2=-4;
parameter.positionX2=list.get(i).positionX2+list.get(i).vectorX2;
if(parameter.positionX2>max)// avoid x2 exceed range
parameter.positionX2=max;
if(parameter.positionX2<min)
parameter.positionX2=min;
parameter=FitnessEquation(parameter);
listMove.add(parameter);
if(list.get(i).pBestFitness>listMove.get(i).fitness) //find
{
listMove.get(i).pBestFitness=listMove.get(i).fitness;
listMove.get(i).pBestPositionX1=listMove.get(i).positionX1;
listMove.get(i).pBestPositionX2=listMove.get(i).positionX2;
}
else
{
listMove.get(i).pBestFitness=list.get(i).pBestFitness;
listMove.get(i).pBestPositionX1=list.get(i).positionX1;
listMove.get(i).pBestPositionX2=list.get(i).positionX2;
}
}
listMove=sortList(listMove);
return listMove;
}
public Parameter FindGlobalBest(Parameter list,Parameter gbest)
{
if(gbest.pBestFitness>list.pBestFitness)
gbest=list;
return gbest;
}
public void showList(int age,ArrayList<Parameter> list)
{
System.out.println("第"+age+"代");
for(int i=0;i<groupCount;i++)
{
System.out.println("x1="+list.get(i).positionX1+",vx1="+list.get(i).vectorX1+
",x2="+list.get(i).positionX2+",vx2="+list.get(i).vectorX2+",適應值="+list.get(i).fitness);
}
}
public void showGlobal(int age,Parameter parameter)
{
System.out.println("第"+age+"代");
System.out.println("x1="+parameter.positionX1+",v1="+parameter.vectorX1+
",x2="+parameter.positionX2+",v2="+parameter.vectorX2+",適應值="+parameter.pBestFitness);
}
public Parameter FitnessEquation(Parameter parameter)
{
parameter.fitness=Math.pow(parameter.positionX1,2)+Math.pow(parameter.positionX2,2)-0.3*Math.cos(3*Math.PI*parameter.positionX1)-0.4*Math.cos(4*Math.PI*parameter.positionX2)+0.7;
return parameter;
}
public ArrayList<Parameter> sortList(ArrayList<Parameter> list)
{
//sort array
Collections.sort(list,new Comparator<Parameter>()
{
@Override
public int compare(Parameter o1, Parameter o2)
{
// TODO Auto-generated method stub
if(Double.compare(o1.fitness, o2.fitness)==-1)
return -1;//o1>o2 ,higher then the front
else if(Double.compare(o1.fitness, o2.fitness)==0)
return 0;
else
return 1;
}
});
return list;
}
}
view raw Particle hosted with ❤ by GitHub