• 저희가 IoT 프로젝트를 개발중인데 조언 및 아이디어를 구하고 싶어서 글을 올립니다.우선 저희 프로그램을 설명드리자면, 사용자가 메신저를 통해서 원격으로 집에 있는 애완동물에게 밥을 주거나, 애완동물의 사진을 찍는 것이 주 기능입니다.자세한 내용은 아래의 주소에서 확인 가능합니다, https://github.com/kuj0210/IoT-Pet-Home-System개선해야될 점, 아쉬운 점과 새로운 기능에 대한 아이디어 등, 어떤 방면의 피드백이든 해주시면 감사하겠습니다.이상입니다.(__)
    2018.08.01 04:35:31
    • 0
      답변수
    • 1
      반응수
    • 298
      조회수
    • 1
      투표
  • 현재 아래와 같은 이벤트를 진행하는데 개발자님들에게 알릴 좋은 방법 없나요?일정 참가자수가 넘어야 이벤트를 열수있을것 같은데 홍보가 어렵네요 ㅜㅜhttps://docs.google.com/forms/d/e/1FAIpQLSdIRnfMIfPLg2gUTaTcwYfHARq-M0X0NSpx8ytK819nom1kmw/viewform 이번 7월말경에, 국내 Telerik 유저분들을모시고제 2회‘Telerik Developer’s Day’를기획중인데요, 이행사에 참석의향이 있으신분들을 파악하고자 이렇게 글을 남깁니다.이 행사에관심이있으시면, 아래 '참가의사확인' 버튼을클릭해서, 의견주시면진심으로감사하겠습니다.   일정: 7월 25일(수요일) ,7월 26일(목)   장소: 블루포트강의실 ( 강남역 1번출구에서 150m )   대상: Telerik 제품을사용하고계시거나, 사용계획이있으신개발자분들    프로그램: - 이번행사는 Telerik을처음접하는분을포함해서, Telerik 제품을잘사용해서개발하고싶은사용자모두에게아래와같은유익한내용으로진행코자합니다.1)      Telerik Introductions2)      Web development with Kendo UI3)      Mobile development with NativeScript4)      Desktop/mobile development with UWP and Xamarin5)      Telerik Reporting - 또한, 사용및기능에대한 Q&A;, Case Study를진행코자합니다. - 강사는, Telerik 본사에서초빙할예정이며, 통역이지원됩니다.  본행사에관심이있으신분들께서는, 아래 '세미나참석의향조사'를클릭하여작성해주시면진심으로감사하겠습니다. 응답주신분은추첨을통해세미나장에서사은품을드립니다.Telerik Developer's Day 세미나참석의향조사https://docs.google.com/forms/d/e/1FAIpQLSdIRnfMIfPLg2gUTaTcwYfHARq-M0X0NSpx8ytK819nom1kmw/viewform (참가의사를밝히신분들이적을경우, 부득이세미나일정이연기될수있사오니, 이점양지하여주시기바랍니다.)문의사항이 있다면 marketing@blueport.co.kr로 메일 주시면 됩니다. 감사합니다.
    2018.07.10 15:29:23
    • 0
      답변수
    • 0
      반응수
    • 225
      조회수
    • 0
      투표
  • 유전 알고리즘을 만들고 있는데 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
      반응수
    • 246
      조회수
    • 0
      투표
  • 안녕하세요 !! 저는 현재 교육과정 프로젝트로 '개발자를 위한 프로젝트 관리 협업툴'을 주제로 프로젝트를 진행해 나가고 있습니다. 프로젝트 주제를 구체화해 나가는 과정에서 현업에서 필요한 애자일, 폭포수 방법론 등에 대한 개념을 녹여 내고자 고민하는 단계에 있습니다. 하지만 아직 프로젝트 경험이 없는 학생의 입장에서 실제 현업에서 어떠한 방식으로 프로젝트가 진행되는지에 대한 지식이 부족해 어려움을 겪고 있습니다. 아주 짧은 답장이라 하더라도 저희 7명의 예비 개발자들에게 조언의 말씀, 응원의 말씀 나누어 주시면 감사하겠습니다!! 저희가 구하고자 하는 조언은 다음과 같습니다. 첫째, 실제 현업에서 개발을 하실 때, 흔히 말하는 애자일, 혹은 폭포수 개발 방법론에 입각하여 개발을 진행 하시나요? 혹시 그렇다면 어떤 방식으로 진행되는지 궁금합니다. 둘째, 혹시 애자일 방식으로 진행하실 경우, 하나의 Sprint에 프로그램 전체의 뼈대를 잡고 스프린트를 반복시키며 구체화해 나가시는지, 혹은 Sprint별로 하나의 컴포넌트 단위로 진행해 나가시는지 궁금합니다. 셋째, 개발을 계획하고 실행하기 위해 작성되는 문서들에는 무엇이 있을까요? 마지막으로, 실제 프로젝트를 진행하시는 데에 있어 활용하시는 협업툴이 있으시다면, 어떤 종류가 있으신지 궁금합니다. 또한, 그러한 협업툴에서 느끼는 장점과 단점 혹은 추가되었으면 하는 기능들에는 무엇이 있을까요??긴 글 읽어주셔서 감사드리며, 짧은 조언이라도 꼭 부탁드립니다!! ㅠㅠ  
    2018.05.24 10:21:27
    • 0
      답변수
    • 0
      반응수
    • 271
      조회수
    • 0
      투표
  • 안녕하세요. 주식 스탁론 HTS 구합니다.아래로 연락바랍니다.스카이프: zingzing13@naver.com텔레그램: @zingzing13
    2018.04.22 15:27:13
    • 0
      답변수
    • 0
      반응수
    • 319
      조회수
    • 0
      투표