0-1 Knapsack Problem▣ 문제 분석▶ 0-1 Knapsack 문제에 대해 다음과 같은 형식으로 입력된 데이터에 대해서 백트래킹(backtracking) 방법으로 얻을 수 있는 최대 이윤과 해 벡터를 아래의 예와 같이 출력하는 프로그램을 작성하라. 단, ??��??를 큰 순서로 나열하기 위한 정렬 알고리즘은 본인의 선택에 의해 아무거나 사용함. 입력 자료의 첫 번째 줄에는 물건들의 개수인 ?값이 저장되고, 두 번째 줄과 세 번째 줄에는 물건 ?에 대한 이윤(profit) ??와 무게(weight) ??가 각각 저장된다. 또한 마지막 줄에는 배낭 크기(knapsack capacity)인 ��값이 저장되어 있다. 출력자료는 아래와 같이 최대 이윤과 그에 해당하는 해 벡터를 x1, x2, ... 순으로 나열한다.?입력 자료의 예 : (파일 하나당)4 /* The number of objects, ? ≤ 2050 40 10 30 /* ??10 2 5 5 /* ??16 /* Knapsack capacity �쵲?출력자료의 예 : (입력자료 하나당)n = 4pi = 50 40 10 30wi = 10 2 5 5pi/wi = 5.0 20.0 2.0 6.0M = 16The maximum profit is $90.The solution vector is X = (x1, x2, x3, x4) = (1, 1, 0, 0)▣ 문제 풀이방법 및 알고리즘▶ main function- main 함수는 문제의 조건에 맞는 모든 함수들을 구현하였다. 먼저 파일을 읽어 문제의 조건에 맞게 읽어 각 배열에 저장한다. 배열을 정리하는 sort함수 호출 부분과, 가방에 물건을 채워 넣기 위한 knapsack함수 호출 부분이 있다. 또한 bestset 재 정렬을 위한 for문이 있다.int main(){FILE* fp; //파일 포인터 지정//파일 읽어 저장하고 출력하기fp = fopen("p3data5.txt","r"); //파일을 읽어옴fscanf(fp,"%d",&n);//첫번째 줄의 itme갯수를 n에 저장printf("n = %d n",n);//n출력printf("pi = ");for(i=1;i
Global Alignment Problem▣ 문제 분석▶ 두 문자열 sequence1과 sequence2에 대한 Global Alignment 문제를 다음과 같은 형식으로 입력 받아서 그 결과를 아래의 예와 같이 출력하는 프로그램을 작성하라. 입력 자료의 첫 번째 줄에는 score함수 �註櫻ㅙ麗さ湧� 저장되고, 두 번째 줄에는 sequence1 및 sequence2의 길이, 세 번째 줄과 네 번째 줄에 각각 sequence1과 sequence2가 입력된다. 첫 번째 줄의 score함수는 �註�?��?�� if? �� ?, �註�?��?�� if?≠?, �註�?�餐詠�, �註煬詠�?�� 값이 순서대로 입력된다. 단, 각 sequence의 길이는 최대 1,000이라고 가정한다. 출력 자료에는 아래와 같이 alignment된 후 sequence의 길이, score합의 최댓값 및 두 sequence의 alignment 결과가 반드시 포함되어야 한다. 단, sequence의 길이가 50보다 큰 경우는 sequence의 앞부분 20개, 뒷부분 20개만 출력한다. 같은 score값을 갖는 답이 여러 개일 경우는 그 중 하나만을 출력해도 된다.?입력 자료의 예 : (파일 하나당)2 -1 -1 -1 /* score 함수 값 �廬註�?��?�� if? �� ?�� �註�?��?�� if?≠?�� �註�?�餐詠挻� �註煬詠�?��6 5 /* sequence1의 길이 sequence2의 길이acbcdb /* sequence1cadbd /* sequence2?출력자료의 예 :string length = 7-acbcdbcadb-d-The max. score value = +2▣ 문제 풀이방법 및 알고리즘▶ main function- main 함수는 문제의 조건에 맞는 모든 함수들을 구현하였다. 먼저 파일을 읽어 문제의 조건에 맞게 읽어 각 배열에 저장한다. score를 계산하기 위해 back[i][j]배열을 또 선언 하였다. back[i][j]가 0이면 대각선(↘)에서 온 것, 1이면 위에서 내려온 것(↓), 2이면 왼쪽에서 오른쪽으로 온 것(→)이라 말할 수 있다. 또한 새롭게 생성되는 문자열을 저장하기 위한 부분이 있다. 예를 들어 설명하자면 back값이 0이면 문자가 같고, 1이면 seq1 = - , seq2 = a, 2이면 seq1 = a , seq2 = -, count는 문자열의 길이를 계산하기 위한 선언부분이다. sequence의 길이가 50보다 큰 경우는 모두 다 출력하기 어려워 문제의 조건에 맞게 sequence의 앞부분 20개, 뒷부분 20개만 출력하게 하였다.void main(){FILE *fp;fp = fopen("p2data1.txt","r");//파일 오픈if(fp==NULL){printf("file open errorn");return;}for(i=0; i0){if(sarr[i-1][j]+score[2]==sarr[i][j]){newseq1[count]=seq1[i];newseq2[count]='-';count++;i--;continue;}}if(j>0){if(sarr[i][j-1]+score[3]==sarr[i][j]){newseq1[count]='-';newseq2[count]=seq2[j];count++;j--;continue;}}}reverse(newseq1);reverse(newseq2);printf("string length = %dn",count-1);//sequence의 길이가 50보다 큰 경우는 sequence의 앞부분 20개//뒷부분 20개만 출력하라는 문제의 조건에 대한 부분if(count-1>50){char tempa1[21];char tempb1[21];char tempa2[21];char tempb2[21];for(i=0;i=c)return b;elsereturn c;}▣ 입출력의 예 및 출력결과1~12.txt의 출력 결과이다.▣ 결과 분석 및 토의1. 동적 계획법(Dynamic Programming)가. 동적 계획법의 정의- 부문제의 해를 모아서, 전체 문제의 해를 구하는 방법으로 최적화 문제를 해결하는데 사용되는 알고리즘 방식- 부분 문제들이 서로 독립적이지 않을 때, 즉, 부분 문제들이 다시 자신의 부분 문제를 공유할 때 적용 할 수 있음나. 동적 계획법의 기본 수행 단계1) 최적해의 구조를 찾는다.2) 최적해의 값을 재귀적으로 정의한다.3) 최적해의 값을 작은 문제에서 큰 문제 순으로 구해 간다.4) 최적해를 위에서 구한 정보를 이용하여 찾는다.다. 동적 계획법의 조건- 어떤 문제를 해결하는데 있어 반드시 문제의 최적해가 그 부분 문제들의 최적해를 포함해야 함,최적의 원칙(Optical Substructure)- 최적의 원칙이 성립하는 경우 : 최단 경로u에서 v로 가는 경로 p를 찾고자 할 때, p상에 w가 있는 경우, p는 u에서 w까지의 경로 p1과 w에서 v까지의 경로 p2로 나눌 수 있다. 만약, p가 u에서 v로 가는 최단 경로라면, p1은 u에서 w까지 최단 경로가 된다.- 최적의 원칙이 성립하지 않는 경우 : 최장 단순 경로u에서 v로 가는 경로 u -> w -> z -> v가 최장 경로가 된다. 하지만, u -> w가 u에서 w로 가는 최장 경로가 되지는 않는다. 따라서, 최장 단순 경로를 구하는 문제는 동적 계획법을 사용하여 해결할 수 없다.2. 동적 계획법의 장단점가. 장점프로그램을 구현할 때에는 필요한 모든 가능성을 고려해서 구현하게 된다. 따라서 동적계획법을 이용하여 항상 최적의 결과를 얻을 수 있다.나. 단점모든 가능성에 대한 고려가 불충분할 경우 최적의 결과를 보장할 수 없다. 동적 계획법을 구현하기 위해서는 충분히 많은 가능성에 대한 고려를 해야 한다. 또한, 다른 방법론에 비해 많은 표(배열)을 이용하므로 메모리를 많이 요구한다.다. 동적 계획법의 활용 사례이항계수 구하기, 최단경로의 플로이드 알고리즘, 최적화 문제, 외판원 문제2. Global AlignmentSequence Alignment은 생물정보학(Bioinformatics)에서 DNA, RNA, 단백질 서열의 유사도를 찾기 위해 이들의 관계에 따라 서열의 부분을 배열하는 방법이다. 서열정렬 방법은 생물정보학에서 뿐만 아니라, 자연언어와 같은 서열에도 적용할 수 있으며, 다양한 분야에 적용시킬 수 있다. 현재 생명체의 유전정보는 세포의 염색체내에 있는 DNA에 집약되어 있고, 이 DNA는 유전정보를 가지는 유전 자(gene)들로 구성되며, 이들 유전자의 집합을 유전체(genome)라고 한다. 총 30억 정도의 길이를 가지는 인간의 DNA에는 대략 10만개 정도의 유전체가 존재한다. 방대한 양의 유전자 서열을 처리하고 분류, 분석하는 효율적인 알고리즘의 개발 이 요구되고 있다. 유전자 정렬 문제는 주어진 유전자들의 서열을 비교하여 유전자 서열간의 유사성 정도를 판단하는 문제이다. 이 문제의 효율적인 알고리즘은 생물체간 유전자들의 연관성을 계산하여, 새로 밝혀진 생물체의 유전자의 구성과 진화관계를 밝혀내거나 전체 염기서열에서 특정한 유전자의 위치를 찾는 데에 기여하고 있다.
Polynomial Evaluation(다항식 값의 계산)▣ 문제 분석▶ 주어진 다항식 ?��?�� �� ?�� �� ?��? �� ?�� ?? �� ��?? �� �� �� ???? ��mod �� �嚥� 정수값 ?�乍� 대해서 ?��?�� �堧� 구하기 위한 다음 세 가지 방법을 각각 구현하고, 주어지는 테스트 데이터에 대해 ?��?�� �堧� 값과 필요한 곱셈의 수를 (프로그램에 의해) 각각 구하라. 단, 모든 입력 값은 정수임.방법은 총 3가지이다.(방법 1) "Improved" term-by-term(방법 2) Honer's scheme?��?�� �� ?�� �� ?��?�� �� ?��?�� �� ??��?? �� �� �� ???�� ?�挻�(방법 3) To compute each term ??, use the following recursive rule?? �� ��???�撮�?�挻� if ? ?? ????? ×��???�撮�?�挻� if ? ?? ???▣ 문제 풀이방법 및 알고리즘▶ main function- main 함수는 파일 입출력을 위한 코드와 방법 1,2,3함수를 호출하여 각 계산 결과를 출력하는 코드로 이루어 져있다. 파일입출력을 통해 "p1data1.txt“(숫자는 1부터 5까지 총 5가지의 파일이다.)라는 이름을 가진 파일을 입력으로 받아드려 계산 하게 되는데 첫 번째 줄의 다항식의 차수를 n으로 받아들여 n+1만큼 둘째 줄,다항식의 계수를 입력하여 data에 저장하게 된다. 계산할 p(x)의 개수 또한 세 번째 줄에서 입력받아 cal[i]에 계산 값을 저장하게 된다. 주어진 p(x)를 출력하는 것은 단순하게 for문과 if문으로 이루어져있다. 출력방법은 음수, 양수 일 때로 조건을 나누어 출력하게 하였다.main 함수에서 중요한 것은 각각의 방법의 계산법을 출력하는 int Improved(int,int), int Honer(int,int), int Recursive(int,int), int Recursivesub(int, int)이다. main함수에는 단순하게 세 번째 줄에서 받은 즉, 계산해야하는 횟수 p[0] 만큼 for문을 돌려 출력하는 부분만 있다. 동일한 변수를 사용하기 때문에 각 함수를 실행하기 전에 count와 sum을 초기화 시켜 주어야한다.void main(){FILE *fp;fp = fopen("p1data1.txt","r+");//파일 오픈if(fp==NULL){printf("file open errorn");return;}fscanf(fp,"%d%d",&n,&N);for(i=0; i0)printf( "+%dx^%d", data[j], j );elseprintf( "%dx^%d", data[j], j );}}//해당 레포트에 해당하는 1,2,3번 풀이법 출력하기//각 해법은 함수로 호출하였으며 출력 방법은 동일하다.printf("n1. Improved term-by-term n");for(i=0;i