Differential Evolution [algorithm] by 바죠

Differential evolution 
http://en.wikipedia.org/wiki/Differential_evolution
http://www1.icsi.berkeley.edu/~storn/code.html

컴퓨터 사이언스에서 사용되는 최적화 방법이다. 함수 미분없이 함수 최적화할 때 사용하는 방법이다. 
확률론적 문제 풀이 방식이다. 이 문제 풀이 방식은 항상 정답을 보장하지 못한다.
다차원 독립변수를 가지는 함수의 최적화에 적용될 수 있다.

함수가 미분가능할 필요가 없는 상황에 적합하다.
물론, 함수가 미분가능(다시 말해서 연속이면)이면 해석적으로 미분한 형태를 이용해서 국소 최적화를 동시에 활용할 수 있다.
일반으로 국소 최적화가 병행될 때, 광역 최적화가 수월하게 진행된다.
항상 국소 최적화된 해만 고려하는 형식으로 광역 최적화를 진행할 수 있다.

Differential evolution은 하나의 병렬알고리듬이다. 유전 알고리듬과 차이가 없다고 생각해도 무방하다.
유전 알고리듬과 차이점이 있다면, 해를 표현하는 방법으로 비트표현을 사용하지 않는다는 점이다.
실제 표현형을 사용한다. 또한, 표현형을 직접 활용하여 변이, 교차를 동시에 이루어낸다.
따라서, 변이, 교차 실행에서 새로운 형식이 수반된다.
서로 다른 시도해를  체계적으로 만들어낸다. 보다 구체적으로 crossover를 할 수 있도록 설계된 방식을 제공한다. 

사실, 변이, 교차가 각각 중요하다는 것이 유전알고리듬의 결론이다.
그렇다면 실제 문제 풀이에서 어떻게 변이, 교차를 해 낼 수 있는가?
이것은 문제에 따라서 달라지는 것이고, 굉장히 다양한 방법으로 이루어질 수 있다.
주요 파라메터로서 differential weight, crossover probability가 있다.
population size는 최소 4 이상이어야 한다. 
그렇지 않으면 안된다. 하지만, 대부분의 응용 계산에서는 이 보다 훨씬 큰 값을 사용하기 때문에, 
이 부분은 전혀 문제가 되지 않는다.
변이와 교차를 상당한 수준에서 일반적으로 행할 수 있게 해준다.
실제 표현형을 그대로 사용한다는 특징이 있다. 
비교적 간단한 방법으로 교차 및 변이를 동시에 취급하게 해 준다.
어느 정도 일반성을 가지고 있다.
소위 비트 표현보다는 훨씬 일반적인 방법으로 보인다.

x : vector, solution

 y =  a + F*(b-c) 처럼 새로운 시도해를 만들 수 있음을 제안한다. 이 부분은 사실 변이에 해당한다.
a, b, c는 서로 다른 해들이다. 또한 추가로 x를 하나 더 확보해야 한다. x, a, b, c, 모두 서로 다른 것들이다.
이들 서로 다른 해, a, b, c로 부터 새로운 시도해를 조직적으로 만들어 낸다. 변이를 만들어 낸다.  
여기에 추가로 확보한 해를 사용하여 변이에 이은 교차까지 완료할 수 있다.
이것 떄문에, 최소 4개이상의 population size가 되어야 한다.
실질적으로 4보다 훨씬 큰 population size를 취급하기 때문에 사실상 제약이 안된다.
추가적인 절차를 통해서 교차를 하는 방법을 지원한다.
최종 목표는 변이와 교차를 순서적으로 이룩하는 것이다.

x, a, b, c 가 서로 다른 해들일 때, y라는 시도해를 만들어 낸다.  결국, 변이, 교차를 체계적으로 지원한다.

{x, a, b, c} ---> y

x라는 해에서 또 다른 시도해를 고려해 볼 수 있다. x'
x---> x' 으로 변환할 때, 사실 이것이 모든 알고리듬에서 공통으로 항상 요구된다. 
가능하면 최대한 일반적인 것이 될 수 있으면 좋다. 특정 공간에 국한 되지 말아야 한다.
광범위하게 이러한 변환을 만들 수 있으면 좋다.
그런데, 일반적인 문제에서 이를 이룩하기는 매우 어렵다.
이는 Monte Carlo 시뮬레이션의 끝도 없는 숙제중의 숙제이며, 광역최적화 방법에 있어서 핵심 요소중 하나라고 볼 수 있다.
그 이외의 대부분의 샘플링 문제에서도 공통으로 나타나는 해결해야할 숙제이다.

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

genetic algorithm:
http://incredible.egloos.com/4856511
particle swarm optimization:
http://incredible.egloos.com/4731015
simulated annealing:
http://incredible.egloos.com/4784592
replica-exchange Monte Carlo, replica-exchange Molecular dynamics, super simulated annealing:
http://incredible.egloos.com/4587643


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


!234567890
       implicit none
       integer ndim,npop
       real*8, allocatable :: x(:,:),xnew(:,:)
       integer ij,kl
       integer i,j
       real ranmar

       ndim=3
       npop=15
       allocate(x(ndim,npop),xnew(ndim,npop))
       ij=111
       kl=112
       call rmarin(ij,kl)
       do i=1,npop
       do j=1,ndim
       x(j,i)=i*10+j
       enddo
       enddo
       write(6,*) x(:,:)

       call dffvltn(ndim,npop,x,xnew)

       write(6,*) xnew(:,:)
       write(6,*)
       write(6,*) xnew-x
       deallocate(x,xnew)
       stop
       end
       subroutine dffvltn(ndim,npop,x,xnew)
       implicit none
       integer ndim,npop
       real*8 x(ndim,npop),xnew(ndim,npop)
       integer iarr(4),jbrr,i,j
       real*8 tmt
       real*8 cr,ff
       real ranmar
!      ff :  differential weight
!      cr :  crossover probability
       xnew=x
       do i=1,npop
       if(npop >=4 )then
       iarr(1)=dble(ranmar())*npop+1
  111  continue
       iarr(2)=dble(ranmar())*npop+1
       if(iarr(2) == iarr(1)) goto 111
  112  continue
       iarr(3)=dble(ranmar())*npop+1
       if(iarr(3) == iarr(1) .or. iarr(3) == iarr(2)) goto 112
  113  continue
       iarr(4)=dble(ranmar())*npop+1
       if(iarr(4) == iarr(3) .or. iarr(4) == iarr(2) .or. iarr(4) == iarr(1)) goto 113
       print*, i
       jbrr=dble(ranmar())*ndim+1 ; cr=ranmar() ; ff=2.d0*dble(ranmar())+0.d0
       do j=1,ndim
       tmt=ranmar()
       if(jbrr == j .or. tmt <= cr)then
       xnew(j,i)=x(j,iarr(2))+ff*(x(j,iarr(3))-x(j,iarr(4)))
                                   endif
       if(jbrr /= j .and. tmt > cr)then
       xnew(j,i)=x(j,iarr(1))
                                   endif
       enddo
                    else
       tmt=-1.d0
       do j=1,ndim
       if(tmt < abs(x(j,i))) tmt=abs(x(j,i))
       enddo
       tmt=tmt/10.d0
       do j=1,ndim
       xnew(j,i)=x(j,i)+(ranmar()-0.5)*tmt
       enddo
                    endif
       enddo
       end


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



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



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


공유하기 버튼

 

ppt 파일 == 남은 발표 시간을 분/초 단위로 표시해 주는 시계? by 바죠


PresentationTimer4Speakers


This is a countdown timer for speakers, showing the remaining time in minute. You may display the slide-shows for speakers with lap-topand/or projected screen. Sound effects are also included especially at theslide-transitions at “slide-5” and “slide-0.”

shift + F5 : start slide-showfrom the present slide

F5 : from the firstslide



정해진 시간안에 발표를 마치는 것이 중요하다.
하지만, 발표 중간에 자신이 얼마의 시간을 소모 했는지 아는 것은 대단히 어렵다.
중간에 사람들이 알려주어야 하는데, 이것 또한 쉽지 않다.

첨부된 ppt파일을 활용하면 좋다.
랩탑 컴퓨터가 있으면 좋다.
첨부한 파일을 실행시키고 발표자가 컴퓨터 스크린을 볼 수 있게 해 주면 된다.


휴대가 간편하다.
아니 다운로드 받아서 사용하면 된다.
ppt가 실행되는 컴퓨터가 있으면 된다.
사용이 직관적이다.
쉽게 원하는 내용을 추가할 수 있고, 바꿀 수 있다.


http://incredible.egloos.com/4391745


다운로드:
presentation_timer4speakers1.1.pptx

presentation_timer4speakers1.11.pptx


http://www.online-stopwatch.com/



공유하기 버튼

 

awk [컴퓨터 언어] by 바죠

awk는 프로그래밍 언어이다.

문서에서 데이터를 찾아내고 출력하고 간단한 일을 하는데 아주  특화된 프로그래밍 언어이다.
기계적으로 처리되어야 할 내용들이 많이 있지만, 매번 프로그램을 새로 만든다는 것은 비효율적일 수 있다.
지적한 일들을 매우 간단하게 처리할 수 있는 기능이 있어야 한다.
매우 짧은 프로그램으로 작성이 가능하다.

또한, 추출한 숫자들을 가지고 간단한 산수를 할 수 있다.
이는 추출한 데이터를 다시 bc -l같은 프로그램에 붙여넣어서 추가로 산수를 하지 않아도 되게 해 주는 효과가 있다.
추출과 동시에 산수를 수행할 수 있게 해 준다. 유닉스/리눅스 명령어들과의 연계 작업에서도 그 유용성은 탁월하다. 
어떻게 보느냐에 따라서 달라질수 있다. grep, xargs등과 같이 명령어로서 사용될 수도 있다.
물론, 명백한 언어로서의 기능을 가지고 있지만,
매우 간단한 일들을 수행할 수 있을 정도로, 유닉스/리눅스 명령어처럼 간결하고도 효과적으로 사용될 수 있다.

장담하는데, awk 같은 것 없어도 연구하는데 지장이 전혀없다.

필요한 경우가 있다면 있을 것이다.
매우 많은 데이터를 반복적으로 처리해야만 할 경우가 있다.
이러한 경우에는 상황이 다소 달라진다.
간단한 스크립트가 필요하다.
또는 프로그램을 만들어야만 한다.
당연하다.

결국, 대용량 데이터 처리에서, 특별히 간단한 대용량 처리에서 효능을 볼 수 있는 것이 awk 같은 언어이다.
유닉스/리눅스 명령어에서 딱 한 발만 더 나아간 수준이면 해결될 수 있는 문제들이 많이 있다.
매우 간단하면서도 효과적으로 대용량 데이터 처리를 도와준다.

문자열 처리에 매우 뛰어난  python 언어가 효율적일 것이다.
여기서 언급한 awk는 보다 더 간결하다. 유닉스 명령어에서 딱 한 발 더 나아간 것처럼 보인다.
매우 간결하게 유닉스/리눅스 명령어처럼 일들을 처리해 준다. 
파이프를 활용하면 연속적으로 많은 명령어들을 조합하여 사용할 수 있다. 
이 때, awk를 이용한 짧은 프로그램도 연동되어 사용될 수 있다.
간단하게 특정 데이터를 뽑아내어서 정리할 때에도 편리하다.

확실한 프로덕션 프로그램들로 부터 많은 데이터가 쏟아져 나오는 상황에서는 awk 같은 것이 효율적으로 활용될 수 있다.
일반적인 개발 언어로서는 부족한 부분이 많을 것이다.
awk 언어로 프로젝트를 하는 것에는 무리가 있다.
용도가 전혀 다르다.
파일속의 특정 패턴---행동으로 이어지는 구조가 특징이다.
특정 패턴에 대한 즉각적인 일처리가 이루어진다.

패턴 비교                           : 숫자, 문자열 탐색하고 비교함, 파일속의 행 단위로 모든 행에 대해서 처리함.
패턴 비교와 연관된 행동       : 패턴 비교를 마치고 나면, 특정 조건에 따라서, 계산과  특정 양식의 출력을 행한다.

pattern-action
여기에서, 패턴은 대략 6가지 종류가 있다.
action 부분은 다른 언어와 같이, 계산, 반복, 선택하는 것들로 만들어져 있다.
컴퓨터 언어라고 생각하지 말고, 또다른 유닉스/리눅스 명령어라고 생각하고 먼저 접근하면 친숙해질 수 있다.
실제로 명령어처럼 사용되는 경우가 많다.

http://en.wikipedia.org/wiki/AWK
http://cm.bell-labs.com/cm/cs/awkbook/
http://en.wikibooks.org/wiki/An_Awk_Primer/Awk_Command-Line_Examples
The_AWK_Programming_Language.pdf
errata (awk 언어의 창시자가 3명이 있다. 이들이 직접 적은 책, 정오표)

-------------------------------------------------------------------------------------------------
 awk 'system("wc "$1)' myfile
 130337  729770 8171254 g1
 130337  729770 8171254 g1
[ihlee@tucana-master C12]$ cat myfile
g1
g1

 awk '{print }' myfile
g1
g1
[ihlee@tucana-master C12]$ awk '{print $0}' myfile
g1
g1

 awk 'NR==1 {print $0}' myfile
g1

 awk '{t+= $1} END{print t}' myfile
6
[ihlee@tucana-master C12]$ cat myfile
1
2
3

awk 'NR>6 {print $1,$2}' DOSCAR >g2

awk 'NR>6 {print $1,$3}' DOSCAR >g3

-------------------------------------------------------------------------------------------------
cat team_kill.sh
foreach num (`seq -s" " 41 42`)
ssh c${num} ps -ef | grep mm_tinker | awk '{print $2}' | xargs kill -9
end

-------------------------------------------------------------------------------------------------
cat kill.sh

ps -ef | grep remd_tinker | awk '{print $2}' | xargs kill -9
ps -ef | grep sp | awk '{print $2}' | xargs kill -9


-------------------------------------------------------------------------------------------------
cat run.sh
foreach num (`seq -s" " 41 42`)
ssh c${num} "kill.sh"
end

-------------------------------------------------------------------------------------------------
$ ls
one.c  one.h  two.c  two.h

$ find . -name "*.c" | xargs rm -rf

$ ls
one.h  two.h


$ ls
one.c  one.h  two.c  two.h The Geek Stuff.c

$ find . -name "*.c" -print0 | xargs -0 rm -rf

$ ls
one.h  two.h


$ find . -name '*.c' | xargs grep 'stdlib.h'
./tgsthreads.c:#include
./valgrind.c:#include
./direntry.c:#include
./xvirus.c:#include
./temp.c:#include
...
...
...

#find . -name "*.sh" | xargs grep "ksh"


um@server#ls -1 *.sh
linux_sysinfo.sh
aix_sysinfo.sh
audit_script.sh
chperm_messages.sh

um@system#ls -1 *.sh | xargs
linux_sysinfo.sh aix_sysinfo.sh audit_script.sh chperm_messages.sh


-------------------------------------------------------------------------------------------------
 awk '/entropy=/ {print $7}'  OUTCAR
-70.140755


 awk '/energy\(sigma->0\)/' OUTCAR
  energy without entropy =      137.45246924  energy(sigma->0) =      137.45245256
  energy without entropy =      -62.11565870  energy(sigma->0) =      -62.11565755
  energy without entropy =      -70.00741394  energy(sigma->0) =      -70.00741336
  energy without entropy =      -70.13755881  energy(sigma->0) =      -70.13755824
  energy without entropy =      -70.14063029  energy(sigma->0) =      -70.14062971
  energy without entropy =      -70.14075319  energy(sigma->0) =      -70.14075262
  energy without entropy =      -70.14075592  energy(sigma->0) =      -70.14075534
  energy  without entropy=      -70.140756  energy(sigma->0) =      -70.140755

 head -n1 CONTCAR >z1 ;  awk '/entropy=/  {print $7}'  OUTCAR >z2 ; cat z1 z2 >z3 ;awk 'ORS=NR%2?FS:RS' z3 >z4
[ihlee@tucana-master TEST_15]$ vi z4
[ihlee@tucana-master TEST_15]$ cat z4
          15                             -70.140755

awk  ' /entropy=/ {a=$7/12.; b=a+18.195715/2;  print  b} ' out.out3
awk  ' /volume\/ion/ {print $5}  ' out.out3

 tail -n +2 CONTCAR >>z4

원래 목표:
CONTCAR 첫줄을 바꾸는 게 목표이다.
OUTCAR 에서 읽어 들인 특정한 값을 새로운 CONTCAR 파일 첫줄에 넣어주는것이다. 첫번째 숫자 다음에 넣어주는것이다.

 head -n1 CONTCAR >z1 ;  awk '/entropy=/  {print $7}'  OUTCAR >>z1 ; awk 'ORS=NR%2?FS:RS' z1>z2 ; tail -n +2 CONTCAR >>z2

 awk '/entropy=/ {print $7}' OUTCAR  |tail -n 1
-166.640525

head -n1 CONTCAR >z1 ;  awk '/entropy=/  {print $7}'  OUTCAR |tail -n 1 >>z1 ; awk 'ORS=NR%2?FS:RS' z1>z2 ; tail -n +2 CONTCAR >>z2

awk '/enthalpy/ {print $5}' OUTCAR  |tail -n 1

 head -n 1 CONTCAR >z1 ;  awk '/entropy=/  {print $7}'  OUTCAR |tail -n 1 >>z1 ; awk 'ORS=NR%2?FS:RS' z1>z2 ; tail -n +2 CONTCAR >>z2

 head -n 1 CONTCAR >z1 ;  awk '/enthalpy/  {print $5}'  OUTCAR |tail -n 1 >>z1 ; awk 'ORS=NR%2?FS:RS' z1>z2 ; tail -n +2 CONTCAR >>z2

mv z2 CONTCAR

 head -n 1 CONTCAR >z1 ;  awk '/entropy=/  {print $7}'  OUTCAR |tail -n 1 >>z1 ;  awk '{ if ( ( NR % 2 ) == 0 ) { printf("%s\n",$0) } else { printf("%s ",$0) } }'  z1>z2 ; tail -n +2 CONTCAR >>z2

 head -n 1 CONTCAR >z1 ;  awk '/enthalpy/  {print $5}'  OUTCAR |tail -n 1 >>z1 ;  awk '{ if ( ( NR % 2 ) == 0 ) { printf("%s\n",$0) } else { printf("%s ",$0) } }'   z1>z2 ; tail -n +2 CONTCAR >>z2

awk 'ORS=NR%2?FS:RS' 
보다는 아래가 더 안전함.
두 줄이 아닐경우를 대비함.
awk '{ if ( ( NR % 2 ) == 0 ) { printf("%s\n",$0) } else { printf("%s ",$0) } }' 


아래와 같이 CONTCAR 파일을 정리하면 좋은것 같습니다.

 
계산 끝나고 나면, CONTCAR가 나오는데, CONTCAR 첫줄에 에너지 또는 엔탈피를, 첫줄 뒷쪽에다, 적어두는 것이죠.
다시말해서, 새로운 CONTCAR를 만들어서 보관합니다.
 
입력: CONTCAR, OUTCAR
출력: CONTCAR
 
 head -n 1 CONTCAR >z1 ;  awk '/entropy=/  {print $7}'  OUTCAR |tail -n 1 >>z1 ; awk 'ORS=NR%2?FS:RS' z1>z2 ; tail -n +2 CONTCAR >>z2

 head -n 1 CONTCAR >z1 ;  awk '/enthalpy/  {print $5}'  OUTCAR |tail -n 1 >>z1 ; awk 'ORS=NR%2?FS:RS' z1>z2 ; tail -n +2 CONTCAR >>z2

mv z2 CONTCAR
  
PBS 배치 뒤에다 붙여두면 좋을 것 같습니다.

head -n 1 CONTCAR >z1 ;  awk '/entropy=/  {print $7}'  OUTCAR |tail -n 1 >>z1 ; awk 'ORS=NR%2?FS:RS' z1>z2 ; tail -n +2 CONTCAR >>z2
mv z2 CONTCAR
rm z1 z2

--------------------------------------------------------------------------------------------------------------
 awk '/entropy=/ {a=$7/12;   print a}  END {b=-18.195715/2.; print a-b}' out.out3
-9.93689
-0.839036

 awk '/volume\/ion/ {print $5}' out.out3
6.65

 awk '/outcar/ {print $2, $3}' g1
 awk '/outcar/ {print $2/12, $3}' g1
 awk '/outcar/ {print $2/12, $3/12}' g1


awk '/outcar/ {print $0}' g1 | awk '{print $2, $3}'


 cat g1
1 U,N,UNIX,000
3 I,M,UNIX,222
3 I,M,LNIX,222
[ihlee@tucana-master Si12_p1]$ awk '{split($2,arr,","); if (arr[3] == "UNIX") print $0}' g1
1 U,N,UNIX,000
3 I,M,UNIX,222
[ihlee@tucana-master Si12_p1]$ awk '{split($2,arr,","); if (arr[3] == "LNIX") print $0}' g1
3 I,M,LNIX,222


 awk '/NELECT/ {print $3}' OUTCAR

 awk '/direct lattice vectors/,/length of vectors/  { NF ==6 ; print $1,$2,$3}' OUTCAR | awk 'NR >1 && NR<5 {print $0}'



--------------------------------------------------------------------------------------------------------------
# print the line immediately after a regex, but not the line
# containing the regex
awk '/regex/{getline;print}'

# print the line immediately before a regex, but not the line
# containing the regex
awk '/regex/{print x};{x=$0}'
awk '/regex/{print (NR==1 ? "match on line 1" : x)};{x=$0}'

http://www.pement.org/awk/awk1line.txt
--------------------------------------------------------------------------------------------------------------
awk 'NR > 6 {print $1, $2}' DOSCAR_20141231_033738_18795>g1
6번째 라인 뒤에 있는 데이터를 뽑아 내어서 다른 파일에 저장한다.

유사한 것들로 아래와 같은것이 있을 수 있다.
awk 'NR > 6 {print $1, $3}' DOSCAR_20141231_033738_18795>g1

awk 'NR > 6 {print $3, $2}' DOSCAR_20141231_033738_18795>g1
--------------------------------------------------------------------------------------------------------------
qstat |awk '/g087lih/' |wc

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

--------------------------------------------------------------------------------------------------------------
http://www.thegeekstuff.com/2010/03/awk-arrays-explained-with-5-practical-examples/
http://www.thegeekstuff.com/2010/03/9-powerful-awk-numeric-built-in-functions/

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

공유하기 버튼

 

2014 노벨 화학상 by 바죠

Prize in Chemistry for 2014 to

Eric Betzig
Janelia Farm Research Campus, Howard Hughes Medical Institute, Ashburn, VA, USA,

Stefan W. Hell
Max Planck Institute for Biophysical Chemistry, Göttingen, and German Cancer Research Center, Heidelberg, Germany

and

William E. Moerner
Stanford University, Stanford, CA, USA

“for the development of super-resolved fluorescence microscopy”


공유하기 버튼

 

1 2 3 4 5 6 7 8 9 10 다음