Sunday, July 27, 2008

java.net.ServerSocket and connections in our brains

The day of 25th of July 2008 was my Name day.

It was really the hottest name day since ages...
Thank You for all best wishes from You.

I needed recently a parallel processing of multiple
threads in a specified maximum number of slots in Java.

I also needed to connect with  acceptance of an incoming call.
Let us consider how to approach the subject...
I create a class object for a socket connection java.net.ServerSocket:

java.net.ServerSocket serverSocket = new ServerSocket(port);
where "port" is the port number on which we want to open the socket

I look forward to getting a connection, and I get
the class object (java.net.Socket):

java.net.Socket socketConn = serverSocket.accept ();

For each connection call I create a new thread
(socketConn is a thread’s variable) that it supports.

This can be a class object that inherits from java.lang.Thread
or implements the interface java.lang.Runnable.
I apply the appropriate queue and synchronizing
objects in order to reach the purpose ...

  private Thread t;
  public synchronized void start() {
    stopping = false;
    if (t == null) {
      t = new Thread(this);
      t.start();
    }
  }

  public synchronized void stop() {
    stopping = true;
  }

 public void run() {
    try {
      ServerSocket serverSocket;
      serverSocket = new ServerSocket(port);
      while (true) {
        Socket socketConn = serverSocket.accept();
        host = socketConn.getInetAddress().getHostName();
        doRequest(socketConn);
        socketConn.close();
      }
    } catch (IOException e) {
      logger.show("IOException: " + e + "\n");
    } catch (Exception e) {
      logger.show("Exception: " + e);
    }
  }

And what about connections in our brains?
A human mind is fascinating, isn't it?
     Especially the human thinking and memory
management system. In my opinion,
a human mind is like a perfect tree with dynamic
and controlled "network" connections.
We can learn and "feel" a little
bit of it by programming of digital machines,
which can simulate some aspects of human
mind functionality.
     I really felt it when I touched the capability
of the Object Oriented Programming (OOP)
and Unix systems, first time in my life. I have
realized that the model of structure of
human thinking has two levels: the layer of words
and the layer of their meaning. Next
I have learnt the model of deep structure of
human language.
     I was disappointed when I discovered that the
simple neural networks and simple genetic
algorithms did not use "a human thinking"
and any kinds of data associations.
In general they use only statistical forcing rules
(called "brutal force") and
there is no secret in it. But in practice, it runs
well and it can help solve the problem,
so there is a "magick" in it!
A very interesting experience for me was
a discovery of learning technology
of Neuro-Linguistic Programming (NLP)
"philosophy" by self-testing
it on my own mind... But the most fascinating
one for me always are C++ and
Java languages. That is why I am the SCJP
(J2SE 5.0) certified, SCWCD (J2EE 1.4)
certified.
     Short-term and long-term human memory
system have to use some kinds of visual
and voice (audio) internal symbols and patterns
in order to manage it well. So I have
had to learn the Hidden Markov Models (HMM)
and Viterbi algorithm to understand
the acoustic modelling, the voice patterns
and the speech recognizing by machines.
     A human mind also is fascinating, because
of capability of recording all the ideas
and information of our life and whole our
civilisation in books or digital data
in computer systems or libraries. Our brain also
is kind of storage and distributed back-up
system, that can have the redundant but
asymmetrical functionality.
The "tree" of such knowledge flow,
data libraries, databases of experience
(e.g. like Google forums!), ideas, designers life
and programmers passions allow to design
machines that can reach another planets
today (Sejourner and Pathfinder on Mars)!
     A human mind also is so interesting, because
it has hidden structure like an onion,
and it is secret like an Nordic iceberg.
But the most fascinating, in my opinion,
is complex data mining and "metadata"
mechanism. We cannot reach
roots of this tree yet. This is a magic tree...
     So we cannot understand a human mind yet,
but we can use it like a black box
and create a visual "virtual life" systems
(e.g. Second Life, LSL, Linden
Script Language) and for example, we can go
there to the virtual cinema (or watch it
with YouTube)...
     So, an artificial chain of "superStrings"
called "tags" can create a virtual,
multidimensional and fractal view of another world.
I am curious of the future of such
our own, personal "another life" window,
which is similar to the personal "small Matrix"
system. One aspect is very interesting: the
future of real education and real information
services in such artificial world. There are many
chances in it... for imagination consumers.
This what we write, talk or listen is a kind of extension
of our physical connections in our brains.
     Yes, the human mind is my passion.
     :-)

Welcome to my personal site at http://grathor33.110mb.com

I have decided to stop blogging at the same time in Polish
and English on my twin blogs, where my fun started
in 2007 (only http://kdabrowski.blogspot.com is my current blog):

http://kjdabrowski.blogspot.com

http://grathor33.blogspot.com

 

TRSeeMe


No wreszcie uporałem się z konfiguracją czytnika Google więc mogę się zająć przedstawieniem rzeczy dla mnie ważnych...

W swojej pracy magisterskiej pod tytułem "Optymalizacja rozmieszczenia stacji bazowych i ich parametrów w systemie radiokomunikacji ruchomej lądowej" zająłem się praktycznym wykorzystaniem algorytmów genetycznych w języku C++.

Należałoby podkreślić, że rozwój systemów telekomunikacyjnych umożliwia tworzenie podstaw społeczeństwa informacyjnego, a projektowanie konkretnych
realizacji systemów jest procesem bardzo złożonym i czasochłonnym. W pracy dyplomowej zbadałem możliwości optymalizacji rozmieszczenia stacji bazowych i wysokości zawieszenia ich anten w systemach radiokomunikacji ruchomej lądowej.
W części teoretycznej pracy omówiłem zagadnienia związane z modelowaniem propagacji fal elektromagnetycznych w systemach radiokomunikacji ruchomej lądowej oraz przedstawiłem reguły stosowane przy rozmieszczaniu stacji bazowych w tych systemach na przykładzie systemu GSM (Global System for Mobile communications). Omówiłem także podstawy teoretyczne metod służących do wyznaczania tzw. zasięgów optycznych oraz metod wykorzystywanych do optymalizacji, w których zastosowano algorytmy genetyczne.
W celu optymalizacji rozmieszczenia stacji bazowych i wysokości zawieszenia
ich anten w systemie  radiokomunikacji ruchomej lądowej napisałem program TRSeeMe
realizujący wiele funkcji użytkowych (dostępny w językach: polskim, angielskim i francuskim z możliwością dynamicznego ich przełączania). Przed rozpoczęciem obliczeń wymagane jest wprowadzenie odpowiednio sformatowanych danych dotyczących ukształtowania terenu.
Przy optymalizacji zastosowałem kryterium bezpośredniej widoczności optycznej pomiędzy
anteną odbiorczej stacji ruchomej, a anteną bazowych stacji nadawczych.
W programie wykorzystałem mechanizmy programowania obiektowego (Object Oriented
Programming) dostępne w języku C++. W jednej z  procedur optymalizacyjnych
zastosowałem klasyczny algorytm genetyczny.
W rozdziale czwartym rozważałem sytuację teoretyczną, w której w systemie istnieje
tylko jedna stacja bazowa i bada się jaki obszar jest widoczny w każdym punkcie terenu.
Program optymalizuje rozmieszczenie stacji bazowej wybierając miejsce (trzema różnymi
metodami), z którego widać procentowo najwięcej pozostałych punktów badanego terenu.
Program podaje odpowiedź w postaci odpowiedniego raportu oraz umożliwia odpowiednią
prezentację wyników w postaci graficznej.
W rozdziale piątym omówiłem sytuację, w której system składa się z trzech
stacji bazowych (jest to wtedy tzw.  system wielostrefowy), podane są parametry stacji
bazowych, które mają podlegać optymalizacji  oraz dane są przedziały w jakich te parametry
mają być optymalizowane. Program optymalizuje rozmieszczenie stacji wykorzystując
algorytm genetyczny i podaje odpowiedź w postaci odpowiedniego raportu oraz w formie
graficznej.
Wyniki zastosowanych metod optymalizacyjnych (w rozdziałach czwartym i piątym)
posłużyły następnie do przeprowadzenia symulacji rozkładu natężenia pola (składowej
elektrycznej pola elektromagnetycznego) oraz rozkładu mocy za pomocą specjalistycznej
aplikacji R-Model. W pracy przedstawiłem wyniki dla dwóch systemów: z jedną stacją
bazową oraz z trzema (wszystkie o tej samej wysokości zawieszenia ich anteny
nadawczej równej 20 m). Wysokość zawieszenia stacji ruchomej była określona na 2 m.
Na podstawie wyników (w postaci graficznej) stwierdziłem występowanie różnic
w określaniu zasięgów optycznych uzyskiwanych dla stacji bazowych za pomocą
obu programów (R-Model i TRSeeMe). Zauważyłem jednak, że występowanie tych różnic
nie powoduje uzyskiwania niezadawalających rezultatów dla metod optymalizacyjnych.
Otrzymywane rozwiązania dla różnych typów cyfrowych map terenu za pomocą
programu TRSeeMe są bliskie rozwiązaniom optymalnym (pomimo występowania
różnic w wyznaczaniu bezpośredniej widoczności optycznej).

Celem pracy dyplomowej było zaproponowanie skutecznej metody optymalizacji rozmieszczenia stacji bazowych i wysokości zawieszenia ich anten w systemach radiokomunikacji ruchomej lądowej. Udało mi się osiągnąć ten cel opracowując takie narzędzie programowe, które pozwala projektantowi takich systemów skrócić czas  i zmniejszyć nakłady pracy potrzebne do osiągnięcia zadowalających rozwiązań w projektowaniu i realizacji współczesnych systemów radiokomunikacji ruchomej.

Polecam rewelacyjną książkę "Algorytmy genetyczne struktury danych programy ewolucyjne" (Zbigniew Michalewicz), która natchnęła mnie do napisania TRSeeMe.

Główna pętla klasycznego algorytmu genetycznego wygląda w TRSeeMe następująco:

while(GEN_Generation < GEN_MAXGENS){
      GEN_Generation++;
      if (GEN_IfPoweredSelection==YES) //jest znane z dialogu
          GEN_SelectPowered(Population, NewPopulation, GEN_Power);
        else
          GEN_SelectRWheel(Population, NewPopulation);
      GEN_CrossOver(Population);
      GEN_Mutate(Population);
      GEN_Evaluate(Population, IfSlowMethod);
      GEN_Elitist(Population);
      GEN_Report(streamFile2, GEN_Generation, Population);
      GEN_XLSRprt(streamFile3, GEN_Generation, Population);
}

Przy oszacowywaniu funkcji celu wyznaczam dopasowanie w następujących etapach:

   double sum = 0;
   int mem;
   // wyznaczanie całkowitego dopasowania populacji
   for (mem =0; mem < GEN_POPSIZE; mem++)
     {
        sum += Population[mem].Fitness;
     }

   // wyznaczanie dopasowania względnego = prawdopodobieństwo selekcji chromosomu mem: ps(mem)
   for (mem =0; mem < GEN_POPSIZE; mem++)
     {
        Population[mem].rFitness = (double)(Population[mem].Fitness)/sum;
     }
   Population[0].cFitness = Population[0].rFitness;

   // wyznaczanie dopasowania łącznego => na kole ruletki określane są wycinki koła
   for (mem =1; mem < GEN_POPSIZE; mem++)
     {
        Population[mem].cFitness = Population[mem-1].cFitness +Population[mem].rFitness;
     }

Dzięki takiemu algorytmowi TRSeeMe usyskuje całkiem niezłe rezultaty stosując trzy metody wyznaczania zasięgu: wolną (bez pamięci co odkrył), szybką (z zapamiętywaniem historii obliczeń) i kompromis pomiędzy nimi!

Teraz nadszedł czas, żeby zastosować algorytm genetyczny w Javie! A czy wiecie, że Java nazywała się OAK (ang. DĄB)?

Repetitio est mater studiorum (Powtarzanie jest matką wiedzy)...

Zacznę jednak od tworzenia najprostszego POJO:

package com.kdabrowski.beanmaster;

public class Person implements java.io.Serializable {
  protected String firstName;
  protected String lastName;
  protected int age;

  public Person() {
  }

  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String aFirstName) {
    firstName = aFirstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String aLastName) {
    lastName = aLastName;
  }

  public int getAge() {
    return age;
  }
  public void setAge(int anAge) {
    age = anAge;
  }
}


W tym celu zapiszemy w pliku web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
            xmlns="http://java.sun.com/xml/ns/j2ee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
            http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
        <servlet-name>BrainServlet</servlet-name>
        <servlet-class> com.kdabrowski.beanmaster.BrainServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BrainServlet</servlet-name>
        <url-pattern>/BrainServlet</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


I napiszemy najprostszą implementację servletu HttpServlet:

package com.kdabrowski.beanmaster;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class BrainServlet extends HttpServlet {

            static final long serialVersionUID = 1L;
           
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World!</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello World! This is BrainServlet!</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

 Główna pętla mojego klasycznego algorytmu genetycznego może tutaj wyglądać następująco:

  private runG33Genetics(void){
   
        while(g33Generation < g33MAXGENS){
            g33Generation++;
            if (g33IfPwrdSlction==YES) //jest znane z dialogu
                g33SelectPowered(Population, g33NewPopulation, g33Power);
            else
                g33SelectRWheel(Population, g33NewPopulation);
            g33CrossOver(Population);
            g33Mutate(Population);
            g33Evaluate(Population, IfSlowMethod);
            g33Elitist(Population);
            g33Report(streamFile2, g33Generation, g33Population);
            g33
XLSRprt(streamFile3, g33Generation, g33Population);

        }
    }    

Natomiast wybór najlepszego osobnika zaczynam następująco:

private g33Elitist(G33Genotype[] g33Population)
{
   int i;
   double best, worst; // najlepsza i najgorsza wartość dopasowania
   int best_mem, worst_mem; // wsk. najlepszego i najgorszego osobnika

   best = g33Population[0].dFitness;
   worst = g33Population[0].dFitness;
   for (i=0; i < g33POPSIZE-1; i++)
     {
       if (g33Population[i].dFitness > g33Population[i+1].dFitness)
         {
           if (g33Population[i].dFitness >= best)
             {
               best = g33Population[i].dFitness;
               best_mem = i;
             }
           if (g33Population[i+1].dFitness <= worst)
             {
               worst = g33Population[i+1].dFitness;
               worst_mem = i+1;
             }
         }
         else
         {
           if (g33Population[i].dFitness <= worst)
             {
               worst = g33Population[i].dFitness;
               worst_mem = i;
             }
           if (g33Population[i+1].dFitness >= best)
             {
               best = g33Population[i+1].dFitness;
               best_mem = i+1;
             }
         }
     }

(...)

25 lipca 2008 to moje imieniny. To były naprawdę
najgorętsze imieniny od wieków. Dzięki za wszystkie życzenia!

Postanowiłem zaprzestać prowadzenia blogów jednocześnie po polsku i angielsku na bliźniaczych blogach, na których rozpocząłem tę zabawę w 2007 roku (pozostanie jedynie http://kdabrowski.blogspot.com):

http://kjdabrowski.blogspot.com

http://grathor33.blogspot.com