'yong's'에 해당되는 글 154건

  1. 2010.07.12 다른컴퓨터로 DB 복사
  2. 2010.07.10 내장 프로시저(사용법)
  3. 2010.06.21 유전알고리즘(2)
  4. 2010.06.18 DB에 이미지 저장 / 로드 하기
  5. 2010.06.10 유전 알고리즘
  6. 2010.06.10 영향력 분포도
  7. 2010.05.28 DB모델링
  8. 2010.05.25 문자열 포인터
  9. 2010.05.25 2차원 포인터 배열
  10. 2010.05.25 배열포인터의 특징
원래는 해당 데이터베이스를 마우스로 우클릭하면 데이터베이스 복사 항목이 있는데

잘되지않아서 꼼수로 해보았다~~프로그램은 sql server 2005를 사용하였다.

1. 먼저 원본컴퓨터에서 Sql 2005를 키고 접속하여 백업시킬 데이터베이스를 마우스로 선택하여 우클릭하면 복원이라는
  항목이 있다. 클릭한다.



2.백업할 위치를 선택하고 확인을 눌른다. 그러면 백업이 된다.


3.방금 백업한 위치에 .bak 파일을 복사하여 복사할 다른 컴퓨터로 옮긴다.
  그리고 해당 컴퓨터에서 sql 2005에 접속하여 데이터베이스를 마우스로 우클릭 한 다음 데이터베이스 복원을 눌른다.


4.장치를 선택하고 백업할 파일을 찾는다.






5. 백업할 셋을 선택하고 확인버튼을 누른다.
 


6. 접속해보면 DB가 생긴걸 볼 수 있다.

'.NET > ADO.NET' 카테고리의 다른 글

내장 프로시저  (0) 2010.08.04
회원탈퇴시 모든정보 날리기  (0) 2010.07.26
내장 프로시저(사용법)  (0) 2010.07.10
DB에 이미지 저장 / 로드 하기  (0) 2010.06.18
DB모델링  (0) 2010.05.28
Posted by 아몰라



1. 내부 스칼라변수 선언

ALTER PROCEDURE INSERT_CROP_BIONAME 
 (
 @CROP_NAME varchar(250), 
 @MEM_NUM int,
 @BIO_NAME varchar(250) 
 )
 
AS

declare @CROP_NUM int   - 이렇게 선언한다. 외부와 직접적인 상관없이 프로시저 내부에서 어떠한
declare @RESULT int          연산이나 처리를 해서 외부에 값을 줄 때 유용하게 사용 할 수 있다.

 select @CROP_NUM = Number from CROPS where  @CROP_NAME = Crop_Name and @MEM_NUM = Mem_Num
 
 select @RESULT = count(*) from CROP_ACCOUNT where @CROP_NUM = Crop_Number
 
 if(@RESULT = 0)
 begin
  insert into CROP_ACCOUNT values(@CROP_NUM ,@BIO_NAME, NULL , NULL)
 end
 else
 begin
  update CROP_ACCOUNT set Crop_Biomial_Name = @BIO_NAME where @CROP_NUM = Crop_Number
 end
  
  
 RETURN




2. 스칼라 변수 초기화

declare @TEST int

SET @TEST  =  0     - 위와 같이 어떠한 변수가 생기면 어떠한 값을 초기화 시키고싶을때 이렇게 한다.d


3. 반복문 사용법

ALTER PROCEDURE WEATHER_SAVE 
 (
 @City varchar(250) 
 )
 
AS

declare @i int
declare @j int


set @i = 2007
set @j = 1

while (@i <= 2009)
begin
 while(@j <=12)
  begin
   insert into WEATHER_INFO values(@City, @i, @j , NULL, NULL, NULL, NULL, NULL)
   set @j = @j + 1    - 보는 바와 같이 이렇게 SET은 초기화뿐만 아니라 이러한 연산을 할 때도 사용된다.
  end
set @j = 1
set @i = @i + 1
end


 RETURN









 

'.NET > ADO.NET' 카테고리의 다른 글

회원탈퇴시 모든정보 날리기  (0) 2010.07.26
다른컴퓨터로 DB 복사  (0) 2010.07.12
DB에 이미지 저장 / 로드 하기  (0) 2010.06.18
DB모델링  (0) 2010.05.28
SqlDataAdapter  (0) 2010.04.02
Posted by 아몰라

유전 알고리즘을 이해하기 위한 간단한 프로그램을 짜보자.


시나리오 -  { } 중 3개를 골라서 20으로 만드는 문제가 있다고 하자. 여기서 유전체는 각 숫자이며, 유전자는 (1,5,3)와 같이 유전체 3개의 집합으로 이루어진다. 적합도 함수를 20과 얼마나 가까운지를 나타내는 값으로 둔다면, (1,5,3)에 대한 적합도는 f( (1,5,3) ) = 11이 된다.

먼저 첫 세대를 아무렇게나 생성한다. 첫 세대가 만약 { (1,5,3) (8,0,9) (9,9,8) (3,7,5) } 으로 형성되었다고 하자. 각각의 적합도를 구하면, { 11, 3, 7, 5 }이 되며, 이 값이 높을수록 20에서 멀기 때문에 해로서 부적당하다는 것을 의미하며, 따라서 세대를 거침에 따라 살아남을 확률이 낮게 된다.

다음 세대를 형성하기 위해, 이 세대의 개체중 2개의 유전자를 선택한다. 이때 선택은 적합도를 기준으로 확률적선택(룰렛 알고리즘이 자주 쓰인다)이다. 따라서 위의 예에서 (8,0,9)는 (9,9,8)에 비해 훨씬 높은 선택 기회를 가진다. 선택된 2개의 유전자의 유전체는 랜덤한 위치에서 교환되어 새로운 세대가 형성된다. 예로 (8,0,9), (9,9,8) 이 선택되었고 교배위치가 2번째 자리로 무작위로 결정되었다면 다음 세대의 개체는 (8,9,8) ,(9,0,9)로 된다.

출처 - 위키백과


1. 먼저 {1~15} 까지 만들고 여기서 랜덤하게 유전자를 3개를 선택하였다.

2. 유전자 3개중 적합도 함수를 통해 20에 가까운 유전자 2개를 선택하였다. (부모유전자) - 선택연산

3. 선택된 2개의 유전자를 부분 결합하여 새로운 해를 만들어 낸다. - 교차연산

4. 부모유전자중 적합도가 낮은 2개의 유전자를 새롭게 만든 유전자 2개랑 바꿔준다. -대치연산

5. 값들이 20이 되기전에 3개가 모두 같아져 버리는 현상이 있다. 이런 현상이 생길때 변이를 시켜준다. -변이연산




원래대로라면 변이연산을 특정한 확률로 랜덤하게 해줘야 되는 거 같은데

프로그램을 하다보니까 대치연산을 하다보면 어느 순간부터 모든 유전자들이 같게 되는 순간이 있다.

그래서 그 순간에 변이연산을 시켜줘서 20이 나올 때 까지 계속 찾게만들었다.

유전알고리즘에 대해서 아주~~~사아아알~~짝 어떤것인지 알 것 같다.

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

유전 알고리즘  (0) 2010.06.10
영향력 분포도  (0) 2010.06.10
연결리스트를 이용한 이진트리의 순회방법  (0) 2010.05.14
트리의 배열표현 방법  (0) 2010.05.14
큐 만들기  (0) 2010.05.14
Posted by 아몰라

저장하기


1. 파일주소 가져오기

            OpenFileDialog openFileDialo1 = new OpenFileDialog();
            openFileDialo1.Filter = "이미지 files(*.bmp)|*.bmp";
            if (openFileDialo1.ShowDialog() == DialogResult.OK)
            {
                ImageSave(openFileDialo1.FileName);  //파일주소를 넘겨줬다
            }


2. 바이트배열에 저장하기

FileStream stream = new FileStream(파일주소, FileMode.Open, FileAccess.Read); //파일입출력을 할 수 있게한다.
BinaryReader reader = new BinaryReader(stream);    //이진값으로 읽는다.                                      

byte[] photo = reader.ReadBytes((int)stream.Length); //이진화시킨값을  바이트배열에 넣는다.


3.DB에 바이트배열을 넣는다.

SqlParameter sparam2 = new SqlParameter("@TEST_IMAGE", SqlDbType.Image, photo.Length);            sparam2.Value = photo;


로드하기


SqlDataReader dr = scom.ExecuteReader(); 
//ExecuteReader()를 날려서 CommandText을 Connection에 날려주고 SqlDataReader를 반환해준다.
//select Crop_Image from Image_Table where @CROP_NAME = Crop  쿼리는 이렇다.

while (dr.Read())
{
       MyData = (byte[])dr.GetValue(0);
       ArraySize = MyData.GetUpperBound(0); //배열크기의 상한값을 넣어준다.
}

MemoryStream ms = new MemoryStream(MyData, 0, ArraySize+1);
//파일을 읽을수 있게 스트림형식으로 바꿔준다.

pictureBox1.Image = Image.FromStream(ms);
//사진을 보여준다.





'.NET > ADO.NET' 카테고리의 다른 글

다른컴퓨터로 DB 복사  (0) 2010.07.12
내장 프로시저(사용법)  (0) 2010.07.10
DB모델링  (0) 2010.05.28
SqlDataAdapter  (0) 2010.04.02
DataSet  (0) 2010.04.02
Posted by 아몰라

열심히 알고리즘도 찾는 중인데 우선 유전 알고리즘이라는걸 찾아서 정리해봤다.

책에 나온 내용은 거의 400 ~500쪽이라서 대략 어떠한 알고리즘인지만 이해했고

더 조사해서 우리 프로젝트에 적합한지 확인해봐야겠다.


유전알고리즘

 

 

100개의 초기 염색체 집단을 만들고 다음과 같이 해보자.

1. 각 염색체게 문제를 푸는데 얼마나 적당한가를 검사하고 그에 상응하는 적응도를 부여한다.

2. 현재 집단에서 두 개를 선택한다. 선택되는 확률은 적응도에 비례한다. 이런 선택 방법은 흔히 룰렛 선택이라고 한다.

3. 두 염색체의 비트들 중에서 임의의 비트를 선택하여 교차 확률로 교차시킨다.

4. 선택된 염색체의 비트들을 돌연변이 확률로 뒤집는다.

5. 100개의 새로운 염색체가 생길 때까지 2, 3, 4단계를 반복한다.

 

 

룰렛선택 염색체를 적응도에 비례하여 선택하는 방법입니다. 적응도가 높은 염색체일수록 선택될 확률은 높다. 적응도가 가장 높은 염색체가 반드시 다음 세대로 유전된다는 것을 보장하지 않는다.

 

  

 


교차 선택된 두 염색체가 새로운 자식 염색체를 만들기 위해서 그들의 비트를 서로 바꾸는 것

 

 

돌연변이 염색체에서 어떤비트가 뒤집어지는 것을 말한다. , 0 1이 되고 1 0이 되는 것을 말한다. 돌연변이는 매우 희박하게 일어난다. 0.001의 확률로 일어난다.

 

 

갼략한 시나리오

-       염색체 집단에서 염색체를 염색체를 선택할 때마다 교차를 적용해야 하는지를 검사해야 한다. 교차 과정이 끝난 자식 염색체들은 돌연변이 적용 여부를 검사한다. , 자식 염색체의 각 비트들에 대해서 돌연변이 확률로 돌연변이를 적용한다.

 

 

 

 

상세 시나리오

1.     초기 염색체 집단을 임의로 생성합니다.

2.     인공 신경망을 훈련시키고 에러에 따라서 적응도를 부여한다. 인공 신경망이 커질수록 적응도를 삭감하는 것도 좋다. 이렇게 하면 적은 수의 뉴런과 연결을 가진 인공 신경망을 얻을 수 있다.

3.     선택 방법(적응도 비례 선택 혹은 토너먼트 선택 등)으로 두 개의 염색체를 선택한다. 선택된 염색체들은 부모가 된다.

4.     교차 연산자를 적용한다.

5.     돌연변시 연산자를 적용한다.

6.     새로운 집단이 원하는 크기의 다다를 때까지 3~5단꼐를 반복한다.

7.     만족스러운 인공 신경망을 얻을 때까지 2단계로 돌아간다.

 

실시간 진화 게임이 실행되는 동안 악당들을 진화시킬 수 있는 간단한 테크닉

              (악당들의 풀을 관리한다.)

 


 

시나리오

1.     게임에서 필요한 개체는 이 풀에서 만들어진다.

2.     게임에서 개체가 사라지는 즉시 새로운 개체가 게임으로 투입된다.

3.     , 게임에서 사라진 개체보다 적응도가 높은 개체를 선택하여(퓰에 있는 최소 적응도보다 낮으면 풀에 들어갈 수 없다) 돌연변이를 적용한 다음 그것을 게임에 투입한다.




참고 - 쉽게 풀어 쓴 인공지능 게임 프로그래밍  (정보문화사)

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

유전알고리즘(2)  (0) 2010.06.21
영향력 분포도  (0) 2010.06.10
연결리스트를 이용한 이진트리의 순회방법  (0) 2010.05.14
트리의 배열표현 방법  (0) 2010.05.14
큐 만들기  (0) 2010.05.14
Posted by 아몰라

시작할 때 밭을 구성할 때 쓰면 괜찮을 것 같은 알고리즘
이것 역시 가능한지 더 조사해봐야함~


영향력분포도 기법 – AI 에이전트가 세계에 대해 지니고 있는 지식을 공간적으로 표현한 것으로, 게임 환경의 물리적/지형적 표현과 현재의 게임 상태(유닛 배치 등등)에 기반해서 전략적 결정에 필요한 정보만을 적절히 추출한 것이다.

 

영향력분포도의 이점

1.     어디에 유닛들을 배치할 것인지, 적이 어디에 있는지(또는 어디쯤에 가면 찾을 수 있는지 알 수 있다)

2.     두 객체 사이에 전선 어디이고 가장 격력한 전투가 벌어지는 또는 벌어질 만한 곳은 어디인지 같은 전략/전술적으로 매우 유용한 정보를 얻을 수 있다.

3.     지형 지물에 관한 정보도 제공할 수 있다.(전술적 가치가 가장 높은 지점이라던가 방어의 허점이 될 만한 지점, 매복 할 지점 등을 제공 받을 수 있다.)

 

간단한 영향력분포도

-       게임이 시작되면 모든 칸들은 0으로 초기화 된다.

-       그리고 각 칸에 대해, 그 칸이 가질 수 있는 영향력 값이 배정된다.

-       전투의 효율성을 영향력 값을 간주하며, 아군 유닛은 양, 적군은 음의 값을 가진다고 한다.

 

 

 

 

 

 

+2

아군

 

 

 

 

 

-1

적군

-1

적군

 

 

 

<초기의 영향력분포>

 

 

 

 

 

 

+0.7

+1

+0.7

+0.35

+1

+2

아군

+1

+0.5

+0.7

+1

+0.7

+0.35

+0.35

+0.5

+0.35

+0.24

<영향력의 전파>

 

 

0.51

0.79

0.47

0.06

0.66

1.66

0.53

-0.06

0.07

0.40

0.03

-0.74

-0.74

-0.17

-0.25

-0.39

<최종적인 영향력분포도>

 

-       이 분포도를 보면 아군과 적군의 역관계를 확실히 알 수 있다.

-       음의 값과 양의 값이 맞부딪히는 칸들을 이으면 전선이 된다.


참고 - GameProgramming Gems2

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

유전알고리즘(2)  (0) 2010.06.21
유전 알고리즘  (0) 2010.06.10
연결리스트를 이용한 이진트리의 순회방법  (0) 2010.05.14
트리의 배열표현 방법  (0) 2010.05.14
큐 만들기  (0) 2010.05.14
Posted by 아몰라
2010. 5. 28. 11:52

모델러의 창의성은 반드시 논리적인 근거에 의해서 표현되어야만 한다.

'.NET > ADO.NET' 카테고리의 다른 글

내장 프로시저(사용법)  (0) 2010.07.10
DB에 이미지 저장 / 로드 하기  (0) 2010.06.18
SqlDataAdapter  (0) 2010.04.02
DataSet  (0) 2010.04.02
DataView  (0) 2010.04.02
Posted by 아몰라

char형 포인터를 선언하였다.
문자열에 대한 간단한 이해를 해보자.

char *temp_p;
char temp;

 temp_p =  'a'; //'a'는 문자로서 아스키코드로 숫자화되있다. 이것을 temp_p에 반환하는것은 말이안된다. temp_p는 주소만을 받는 포인터이다.
 temp_p = "a";

 temp = 'a';
 temp = "a"; //문자열을 반환하게되면 첫번째 문자열이 저장된 첫번째 위치의 주소값이 반환되는데 temp는 char형이기 때문에 값을 받을 수 없다.



'프로그래밍 기초 > C포인터' 카테고리의 다른 글

2차원 포인터 배열  (0) 2010.05.25
배열포인터의 특징  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
배열과 포인터  (0) 2010.05.19
포인터란?  (0) 2010.05.19
Posted by 아몰라


출처 - 다시 체계적으로 배우는 C언어 포인터

'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
배열포인터의 특징  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
배열과 포인터  (0) 2010.05.19
포인터란?  (0) 2010.05.19
Posted by 아몰라
이런식으로 접근해서 2차원배열을 포인터를 이용해 사용할 수도 있다.

 int *temp;
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 
temp = temp_array;      //temp는 4바이트 대상체를 가르킬수 있는 포인터 변수이다. temp_array는 배열명으로서 대상체의 크기가 24인 2차원배열이다. 오류난다.

 temp = &temp_array[0][0]; //&temp_array[0][0]는 2차원배열의 첫번째 주소를 가르키고 대상체가 4바이트이므로 성립한다. 성립한다.



다음은 연산과 연산 후 역참조 할 때의 차이점이다.
int (*temp)[2];
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 
 temp = temp_array;
 
 cout<<temp+0<<endl;
 cout<<*(temp+0)<<endl;
 cout<<sizeof(temp+0)<<endl;
 cout<<sizeof(*(temp+0))<<endl;
 cout<<temp+1<<endl; 
 cout<<*(temp+1)<<endl;
 cout<<sizeof(temp+1)<<endl;
 cout<<sizeof(*(temp+1))<<endl;


포인터에서  +1 연산을 하였으므로 8크기만큼 이동한다. (2차원배열포인터이기때문에) 만약 그냥 1차원 포인터였다면 4만큼 이동하였을꺼다. 그리고 *연산을 하게되면 값을 취하게 됐을것이다.
하지만 여기선 *를 하게 됨으로 대상체가 행 전체로 바뀌게되면서 사이즈가 8로 바뀌는것을 볼 수 있다.
(temp+1)은 그냥 주소+정수 해서 연산을해서 주소위치만 바뀌었을뿐 이다. *(temp+1)을 함으로써 대상체가 바뀌게 된다. 즉, temp+1행을 가르키게 된다.
(가르키고 있는 주소는 보는바와 같이 같다. 단, 대상체가 다를뿐)



 포인터 접근순서
int (*temp)[2];
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 
 temp = temp_array;
 
 cout<<*(*(temp+2)+1)<<endl;

+2를 함으로 3번째 행에 접근하였고 *연산을 하여서 해당 행을 가르키고있다. +1연산을 하여 해당 행에 2번째 열의 주소에 접근하였고 *연산을 하여 값에 접근하였다. 그래서 9가 출력된다.

'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
2차원 포인터 배열  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
배열과 포인터  (0) 2010.05.19
포인터란?  (0) 2010.05.19
Posted by 아몰라
이전버튼 1 2 3 4 5 6 7 ··· 16 이전버튼