C++로 링을 설치한 별거 모형

서문


C++라는 언어를 사용하여 Shering의 별거 모델을 구현합니다.C++를 사용하지 않은 사람들도 이해할 수 있도록 간단한 설치 방법에 최대한 주의를 기울였지만 이해하기 어려울 수도 있습니다.
이상한 점, 이해하기 어려운 점이 있다면 댓글 같은 걸로 알려주시면 좋을 것 같아요.

0-1분 거주 모드


토마스 셀린은 미국 경제학자(2005년 노벨경제학상 수상)가 1969년에 발표한 것이다.
지역 사회 각 인종의 별거 경향에 착안하여 미시적인 차원(사람들의 개인적인 취향과 행동 방식)에서 추측할 수 있듯이 거시적인 차원(사회 전체의 상황)에 반영되지 않을 수 있다.다대리 시뮬레이션을 사회학에 도입한 원점이라고 할 수 있다.

0-2 이번에 실시된 모델의 구조


게임 방식으로 간단명료하게 설명하다.
  • 이 시뮬레이터에는 바둑판처럼 정리된 주거지가 존재한다.
  • 에는 각각'%인종','@인종','!인종'이라고 부르는 3가지 인종이 있다.
  • 사람들은 이 바둑판의 선 교차점에 살 수 있다(정수치의 좌표로 관리할 수 있다).
  • 이 시뮬레이터에서 생활하는 사람들은 각 라운드에서 자신의 주위(세로, 가로, 사선을 합쳐 8칸으로 인근 주민으로)를 살펴보고 인근 주민 중 1/3 이상의 동인종이 있는 상황에서 안심하고 계속 거주한다.
  • 안심할 수 없으면 주거지역의 무작위 장소로 이사한다.
  • 거주지역의 모든 주민이 안심하고 시뮬레이션을 끝냅니다.
  • 인근 주민 중 3분의 1만이 동인종이면 좋겠는데 인종별로 관대하지 않을까요?
    시뮬레이션을 통해 결과를 확인하세요.

    1 설치


    순서대로 설치하세요.
    #1-1~4를 모두 위에서 복사하면 순서대로 실행할 수 있습니다.

    1-1 준비


    보존 인구와 주소의 배열을 정의해 보세요.
    처음 7행은 주문이었기 때문에 C++가 모르는 사람은 무시하세요.
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #include<iostream>
    #include<utility>
    #include <iomanip>
    using namespace std;
    
    
    #define BOARD_WIDTH 30
    #define BOARD_HEIGHT (BOARD_WIDTH)
    #define population 500
    int board[BOARD_HEIGHT][BOARD_WIDTH];
    pair<int,int> address[population];
    
    int dx[8]={-1,0,1,-1,1,-1,0,1};
    int dy[8]={1,1,1,0,0,-1,-1,-1};
    
    char symbol[4]={' ','%','@','!'};//表示用のシンボル
    
    
  • BOARD_WIDTH 및 BOARDHEIGHT는 보드 크기입니다.보드라는 배열에 인종을 등록하세요.
  • population은 인구다.이 세 가지 값은 마음대로 만질 수 있지만, 반드시
    (BOARD_WIDTH)×(BOARD HEIGHT)> population이 되지 않도록 주의하십시오.만약 공터가 하나도 없다면 이사할 수 없다.
  • address는 호적과 유사한 물건이다.링크된 사람의 주소(좌표)입니다.정교 좌표 x, y를pair 형식으로 저장합니다.
  • dx,dy는 조망할 때 사용합니다.이것을 정의하면 for문회전만으로도 주위 상황을 확인할 수 있고 이후에는 가벼워진다.
  • symbol은 인종을 나타내는 데 쓰인다.
  • 1-2 초기 구성


    사람들을 보드에서 살게 합시다.완전 무작위 결정.
    void prepare(){
        for (int i=0;i<BOARD_HEIGHT;i++){ //全住所を-1で初期化
            for (int j=0;j<BOARD_WIDTH;j++){
                board[i][j]=-1;
            }
        }
    
        for (int i=0;i<population;i++){
            int x=rand()%BOARD_HEIGHT;
            int y=rand()%BOARD_WIDTH;
            while(board[x][y]!=-1){//空き地でなかった場合繰り返す
                x=rand()%BOARD_HEIGHT;
                y=rand()%BOARD_WIDTH;
            }
            board[x][y]=rand()%3;//人種の決定
            address[i]=make_pair(x,y);
        }
    }
    
    보이스란 되돌아오는 값이 없는 함수다.
    모든 주소를 -1로 초기화한 다음 인구의 주소를 생성합니다.이때 주소를 반복하지 않도록 주의하세요.

    1-3 드로잉 함수

    void draw(){
        for (int x=0;x<BOARD_HEIGHT;x++) {
            for (int y=0;y<BOARD_WIDTH;y++)
                cout << setw(2) << symbol[board[x][y]+1];
            cout << endl;
        }
    }
    
    아날로그 공간을 그립니다.setw(2)는 두 글자의 빈칸에 표시된다는 뜻으로 보기 편하도록 노력한 것이다.

    1-4 주 함수

    int main(){
        srand((unsigned int)time(NULL));//乱数を時間で初期化
        prepare();
        draw();
    
        bool flag=false;
        while(!flag){
            flag=true;
            for (int i=0;i<population;i++){
                int x=address[i].first,y=address[i].second;
                int countSame=0,countDiffrent=0;
                for (int j=0;j<8;j++){
                    if (x+dx[j]<0 or x+dx[j]>=BOARD_HEIGHT or y+dy[j]<0 or y+dy[j]>=BOARD_WIDTH){//範囲外
                        continue;
                    }
                    if (board[x+dx[j]][y+dy[j]]==-1){
                        continue;
                    }else if(board[x+dx[j]][y+dy[j]]==board[x][y]){
                        countSame++;
                    }else{
                        countDiffrent++;
                    }
                }   
                if (countSame*2<countDiffrent){//安心できない場合
                    flag=false;
                    int race=board[x][y];
                    board[x][y]=-1;
                    x=rand()%BOARD_HEIGHT;
                    y=rand()%BOARD_WIDTH;
                    while(board[x][y]!=-1){//空き地でなかった場合繰り返す
                        x=rand()%BOARD_HEIGHT;
                        y=rand()%BOARD_WIDTH;
                    }
                    address[i]=make_pair(x,y);
                    board[x][y]=race;
                }
    
            }
        }
        cout << "----------結果----------" << endl;
        draw();
    }
    
    규칙에 따라 실시하다.첫 번째 srand (unsigned int) time (NULL) 은 무작위 수의 초기화입니다.
    flag이라는 부울치가 계속 진가를 유지한다면 모든 주민들이 안심하고 살 수 있기 때문에 순환이 끝난다.

    2 실행 결과


    어떻게 됐어요?나는 최종적으로 상당히 긴 거리를 확인했다고 생각한다.
    자신이 옆에서 실행한 결과가 바로 이런 느낌이다.

    하반부는 결과다.쟁탈전인 것 같은데...
    적당한 시기에 draw 함수를 넣어 별거의 진전 상황을 확인하는 것도 흥미롭다.

    정답: 2


    각종 매개 변수를 시험해 보세요.인종에 따라 규칙을 바꾸려 하면 더 흥미로운 데이터를 얻을 수 있을 것이다.
    며칠 전 미국에서 돌아온 친구가 나에게 이 모형을 보여 주었는데, 그는 "3분의 1의 동인종이 필요한 것은 대단한 인종"이라고 말했다.대단하다...나는 줄곧 일본에서 살았는데 아마 이런 환경을 참을 수 없을 것이다.(레시스주의자는 절대 아니야. 익숙하지 않아서 불안할 뿐이야.)

    4 참고 문헌


    참고인공사회 구축 지침-artisoc의 다중 대리 시뮬레이션 입문(산그림자 진입)로 일부분을 인용했습니다.감사합니다.

    좋은 웹페이지 즐겨찾기