C++로 링을 설치한 별거 모형
18764 단어 C++모방하다다중 에이전트 시스템고등학생토마스 셀린
서문
C++라는 언어를 사용하여 Shering의 별거 모델을 구현합니다.C++를 사용하지 않은 사람들도 이해할 수 있도록 간단한 설치 방법에 최대한 주의를 기울였지만 이해하기 어려울 수도 있습니다.
이상한 점, 이해하기 어려운 점이 있다면 댓글 같은 걸로 알려주시면 좋을 것 같아요.
0-1분 거주 모드
토마스 셀린은 미국 경제학자(2005년 노벨경제학상 수상)가 1969년에 발표한 것이다.
지역 사회 각 인종의 별거 경향에 착안하여 미시적인 차원(사람들의 개인적인 취향과 행동 방식)에서 추측할 수 있듯이 거시적인 차원(사회 전체의 상황)에 반영되지 않을 수 있다.다대리 시뮬레이션을 사회학에 도입한 원점이라고 할 수 있다.
0-2 이번에 실시된 모델의 구조
게임 방식으로 간단명료하게 설명하다.
시뮬레이션을 통해 결과를 확인하세요.
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]={' ','%','@','!'};//表示用のシンボル
보존 인구와 주소의 배열을 정의해 보세요.
처음 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)×(BOARD HEIGHT)> population이 되지 않도록 주의하십시오.만약 공터가 하나도 없다면 이사할 수 없다.
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의 다중 대리 시뮬레이션 입문(산그림자 진입)로 일부분을 인용했습니다.감사합니다.
Reference
이 문제에 관하여(C++로 링을 설치한 별거 모형), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/add_bakkers/items/a048dbf22e082ea9db9b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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);
}
}
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의 다중 대리 시뮬레이션 입문(산그림자 진입)로 일부분을 인용했습니다.감사합니다.
Reference
이 문제에 관하여(C++로 링을 설치한 별거 모형), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/add_bakkers/items/a048dbf22e082ea9db9b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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();
}
어떻게 됐어요?나는 최종적으로 상당히 긴 거리를 확인했다고 생각한다.
자신이 옆에서 실행한 결과가 바로 이런 느낌이다.
하반부는 결과다.쟁탈전인 것 같은데...
적당한 시기에 draw 함수를 넣어 별거의 진전 상황을 확인하는 것도 흥미롭다.
정답: 2
각종 매개 변수를 시험해 보세요.인종에 따라 규칙을 바꾸려 하면 더 흥미로운 데이터를 얻을 수 있을 것이다.
며칠 전 미국에서 돌아온 친구가 나에게 이 모형을 보여 주었는데, 그는 "3분의 1의 동인종이 필요한 것은 대단한 인종"이라고 말했다.대단하다...나는 줄곧 일본에서 살았는데 아마 이런 환경을 참을 수 없을 것이다.(레시스주의자는 절대 아니야. 익숙하지 않아서 불안할 뿐이야.)
4 참고 문헌
참고인공사회 구축 지침-artisoc의 다중 대리 시뮬레이션 입문(산그림자 진입)로 일부분을 인용했습니다.감사합니다.
Reference
이 문제에 관하여(C++로 링을 설치한 별거 모형), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/add_bakkers/items/a048dbf22e082ea9db9b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
참고인공사회 구축 지침-artisoc의 다중 대리 시뮬레이션 입문(산그림자 진입)로 일부분을 인용했습니다.감사합니다.
Reference
이 문제에 관하여(C++로 링을 설치한 별거 모형), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/add_bakkers/items/a048dbf22e082ea9db9b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)