• 유전 알고리즘을 만들고 있는데 3가지 부분을 만드는게 어려워서 질문을 올리게 되었습니다.돌연변이와 교차 알고리즘 그리고 새 유전자 명시하는 코드 입니다.#include <iostream>#include <string.h>#include <fstream>#include <time.h>#include <algorithm>using namespace std;const int NOI=50; // 물건의 개수=유전자의 길이const int MW=40000; // 배낭의 최대 저장 무게const int NOG=64; // 유전자의 개수int GbestValue=0; // 최대 적합도(최대 가치)int GbestWeight=0;  // 최고 무게struct itemType{  //화물정보를 위한 구조체int weight; // 화물의 무게int value; // 화물의 가치};struct geneType{ // 유전자 구조체char dna[NOI+1]; // 유전자 문자열 -> "0010010100100011101010110101...."int wSum; // 위 유전자 상태에서의 무게합int valueSum; // 그 때의 총가치};itemType items[NOI]; // 화물정보를 저장한 배열geneType gene[2][NOG]; // 유전자 배열- 0: 이전 세대, 1: 이후 세대bool cmp(const geneType &a, const geneType &b) // sort 함수를 위한 비교함수{return (a.valueSum > b.valueSum); // > : 내림차순, < : 오름차순}void read_data(){ // 파일로 부터 화물 정보를 읽어 items 배열에 저장ifstream in("knapsack50.txt");if (in.is_open()) {for(int i=0;i<NOI;i++){in >> items[i].weight >> items[i].value;}}else {cout << "파일을 찾을 수 없습니다!" << endl;exit(-1);}in.close();}void w_sum(int g, int num){ // 이전(g=0), 이후(g=1) 세대 유전자들의 num번째 유전자 상태에 따른    // 무게 합과 가치 합을 구해 저장하는 함수int wsum=0;int vsum=0;for(int i=0;i<NOI;i++){if(gene[g][num].dna[i] == '1'){// 화물이 들어가는 경우(유전자열 문자가 '1'인 경우)에만 합을 구함wsum = wsum + items[i].weight;vsum = vsum + items[i].value;}}gene[g][num].wSum = wsum;gene[g][num].valueSum = vsum;}void init_gene(){ // 초기 64개의 유전자를 랜덤으로 생성하는 함수int i=0;while(i<NOG){for(int j=0; j<NOI; j++){if(rand()%2 == 1){ // 홀수이면 1, 짝수이면 0으로 세팅gene[0][i].dna[j]='1';}else{gene[0][i].dna[j]='0';}}gene[0][i].dna[NOI] = '\0'; // 문자열 마지막은 항상 NULL로 막아야 함w_sum(0, i); // 랜덤으로 생성된 유전자열의 무게합을 확인하기 위해 합을 구함if(gene[0][i].wSum <= MW){// 무게가 초과되지 않아야만 유효한 유전자. 그렇지 않으면 다시 생성i++;}}sort(gene[0], gene[0]+NOG, cmp); // 내림차순 정렬GbestValue=gene[0][0].valueSum;// 총가치를 기준으로 내림차순 정렬이므로 맨 앞의 유전자가 베스트 유전자}void copyGene(int des, int src){ // src 번째 이전 유전자를 dec 번째 새 유전자로 복사// 이전 세대의 유전자들 중 가장 우수한 것을 그대로 넘기기 위함.(elitism)strcpy(gene[1][des].dna, gene[0][src].dna);gene[1][des].valueSum = gene[0][src].valueSum;gene[1][des].wSum = gene[0][src].wSum;}// g 세대의 k, m번째 유전자 2개를 돌연변이시킴void mutate(int g, int k, int m){int place; // 교차위치 임시변수//////////////////////////////////////////////////////////////////////// 이 곳에 돌연변이 함수를 직접 작성해 봄// k번째, m번째 유전자의 1곳, 또는 2곳 정도만 일정 확률로 돌연변이시킴// 무작위 위치의 문자가 0이면 1, 1이면 0으로 치환// 확률은 10% 이하로 낮게 잡는 것이 좋음. 돌연변이가 너무 많으면// 널뛰기처럼 들쭉 날쭉해져서 무작위 탐색처럼 되고 최적해에 빨리 수렴하지 못함//////////////////////////////////////////////////////////////////////}void crossover1p(int i, int j, int k, int m){// 이전 i번째 j번째 유전자를 교차하여 k, m번째 새 유전자로 집어넣음// 랜덤 위치의 단순 교차char tempa[NOI+1];char tempb[NOI+1];while(1){/////////////////////////////////////////// 여기에 교차 알고리즘 작성해 보기 ///////////////////////////////////////////strcpy(gene[1][k].dna, tempa); // 생성된 첫번째 교차 유전자열을 복사strcpy(gene[1][m].dna, tempb); // 생성된 두번째 교차 유전자열을 복사mutate(1, k, m); // 돌연변이 시행w_sum(1, k); // 무게 초과를 확인하기 위해 무게합 구함w_sum(1, m);if(gene[1][k].wSum <= MW && gene[1][m].wSum <= MW){break; // 무게 조건이 둘 다 맞아야만 유효한 생성으로 함수 종료}}}void copyAllBack(){ // 이후 세대의 유전자들을 모두 이전 세대 변수로 복사// 그래야만 동일한 방법으로 이전 세대 유전자로 다시 이후 세대 유전자를 반복하면서 생성for(int i=0;i<NOG;i++){strcpy(gene[0][i].dna, gene[1][i].dna);gene[0][i].valueSum=gene[1][i].valueSum;gene[0][i].wSum=gene[1][i].wSum;}}void select_and_crossover(){// 선택기법에 따라 선택한 이전 세대 유전자로 이후 세대 유전자 생성// 엘리티즘을 반드시 사용하도록 함.// 엘리티즘을 사용하지 않으면 널뛰기처럼 값이 들쭉 날쭉해져서 최적해로의 수렴이 어려움copyGene(0, 0); // 엘리티즘용copyGene(63, 0); // 엘리티즘용.crossover1p(0,1,1,2);crossover1p(0,3,3,4);crossover1p(0,5,5,6);crossover1p(0,7,7,8);crossover1p(0,9,9,10);////////////////////////////////////////////////////////// 이 곳에 선택법에 따른 이전 유전자 2개 선택과// 그 2개로 인해 생성되는 새 유전자를 명시하는 코드 작성// 위의 예처럼 단순하게 다 나열해도 되고// 반복문을 잘 활용하면 더 깔끔하게 작성할 수 있음////////////////////////////////////////////////////////sort(gene[1], gene[1]+NOG, cmp); // 새로 생성된 유전자들을 가치순으로 정렬}int main(){double avg; // 모든 유전자들의 가치 평균값 저장int sum; // 평균을 위한 합계    ofstream out("result.txt");srand (int(time(NULL))); // 랜던 함수 시드 설정read_data(); // 화물 데이터 읽어들임init_gene(); // 랜덤으로 초기 유전자 세트  생성sum=0;for(int i=0;i<NOG;i++){ // 초기 랜덤 유전자들의 평균 가치를 출력하기 위한 합계 산출sum = sum + gene[0][i].valueSum;}// 초기 랜던 유전자들의 최고 가치, 그때의 무게합, 평균 가치를 출력cout << gene[0][0].valueSum << ", " << gene[0][0].wSum << ", " << sum/NOG << endl;  out << gene[0][0].valueSum << ", " << gene[0][0].wSum << ", " << sum/NOG << endl;  for(int i=0;i<2000;i++){ // 진화를 2,000세대만 진행시켜서 동료들과 결과 비교select_and_crossover(); // 선택법에 따른 선택과 교차를 시행하여 새로운 유전자 세트를 생성copyAllBack(); // 반복을 위해 새 유전자 세트를 이전 유전자 세트로 복사sum=0;for(int i=0;i<NOG;i++){sum = sum + gene[0][i].valueSum;}// 새로 생성된 유전자들의 평균 가치를 출력하기 위한 합계 산출// 세대별 변화를 보고 싶을 경우 아래 문의 주석 헤제// cout << gene1[0].valueSum << ", " << gene1[0].wSum << ", " << sum/NOG << endl;  // out << gene1[0].valueSum << ", " << gene1[0].wSum << ", " << sum/NOG << endl;}//최종 결과를 출력하는 부분cout << gene[0][0].valueSum << ", " << gene[0][0].wSum << ", " << sum/NOG << endl;  out << gene[0][0].valueSum << ", " << gene[0][0].wSum << ", " << sum/NOG << endl;  out.close();return 0;}
    2018.06.08 15:48:11
    • 0
      답변수
    • 0
      반응수
    • 379
      조회수
    • 0
      투표
  • 안녕하세요 !! 저는 현재 교육과정 프로젝트로 '개발자를 위한 프로젝트 관리 협업툴'을 주제로 프로젝트를 진행해 나가고 있습니다. 프로젝트 주제를 구체화해 나가는 과정에서 현업에서 필요한 애자일, 폭포수 방법론 등에 대한 개념을 녹여 내고자 고민하는 단계에 있습니다. 하지만 아직 프로젝트 경험이 없는 학생의 입장에서 실제 현업에서 어떠한 방식으로 프로젝트가 진행되는지에 대한 지식이 부족해 어려움을 겪고 있습니다. 아주 짧은 답장이라 하더라도 저희 7명의 예비 개발자들에게 조언의 말씀, 응원의 말씀 나누어 주시면 감사하겠습니다!! 저희가 구하고자 하는 조언은 다음과 같습니다. 첫째, 실제 현업에서 개발을 하실 때, 흔히 말하는 애자일, 혹은 폭포수 개발 방법론에 입각하여 개발을 진행 하시나요? 혹시 그렇다면 어떤 방식으로 진행되는지 궁금합니다. 둘째, 혹시 애자일 방식으로 진행하실 경우, 하나의 Sprint에 프로그램 전체의 뼈대를 잡고 스프린트를 반복시키며 구체화해 나가시는지, 혹은 Sprint별로 하나의 컴포넌트 단위로 진행해 나가시는지 궁금합니다. 셋째, 개발을 계획하고 실행하기 위해 작성되는 문서들에는 무엇이 있을까요? 마지막으로, 실제 프로젝트를 진행하시는 데에 있어 활용하시는 협업툴이 있으시다면, 어떤 종류가 있으신지 궁금합니다. 또한, 그러한 협업툴에서 느끼는 장점과 단점 혹은 추가되었으면 하는 기능들에는 무엇이 있을까요??긴 글 읽어주셔서 감사드리며, 짧은 조언이라도 꼭 부탁드립니다!! ㅠㅠ  
    2018.05.24 10:21:27
    • 0
      답변수
    • 0
      반응수
    • 389
      조회수
    • 0
      투표
  • 안녕하세요. 주식 스탁론 HTS 구합니다.아래로 연락바랍니다.스카이프: zingzing13@naver.com텔레그램: @zingzing13
    2018.04.22 15:27:13
    • 0
      답변수
    • 0
      반응수
    • 458
      조회수
    • 0
      투표
  • 안녕하세요 초보 개발자입니다. 도와쥬세요..지인 초보 개발자님이 우연히 웹서핑을 하다가 보게된 사이트인데요https://search.naver.com/search.naver?sm=tab_hty.top&where=webkr&query=%EC%86%8C%EC%85%9C%EA%B7%B8%EB%9E%98%ED%94%84&oquery=%EC%86%8C%EC%85%9C%EA%B7%B8%EB%9E%98%ED%94%84&tqi=TWW6YdpVuEossc1qF4VssssstOR-440779위 링크로 주소창에 검색을 해보면 아래 도메인이 첫번째로 나옵니다.http://avenue6.co.kr/여기서 궁금증은위 도메인을 네이버로 검색해서 클릭했을시에는 도박사이트로 연결이됩니다.하지만 http://avenue6.co.kr/ 이 도메인을 주소창에 입력하게되면 또 다른 사이트로 나온다는건데요.저도 신기해서 조금 공부를 해보았는데 계속 막히네요.httrack 을 사용해서 사이트도 복제해서 index.html 을 파봤는데도 파일 안에는 홈페이지 설명 제목 오픈그래프 제목 설명등기본적인 요소와 소유확인 정도? 이렇게 들어가있더라구요.. 심지어 인덱스안에는 로봇에 관한 소스도 없고파일 내에 로봇 텍스트 파일도 없네요.혹시 도움을 주실수있으시면 연락부탁드려요.사례는 하겠습니다.텔레그램 : @chu365스카이프 : perfectbuzz
    2018.04.22 00:28:47
    • 1
      답변수
    • 1
      반응수
    • 1.1k
      조회수
    • 0
      투표
  • 좋은 메일 솔루션 추천 받고 싶습니다.업무에 메일 많이 써야 하는데 좋은 업체용 메일 솔루션 추천 많이 해주세요~
    2018.04.20 16:56:23
    • 0
      답변수
    • 0
      반응수
    • 528
      조회수
    • 0
      투표