욕심 많은 알고리즘은 무엇입니까?
탐욕스러운 알고리즘에서 리소스 집합은 주어진 실행 단계에서 해당 리소스의 최대 즉시 가용성에 따라 재귀 적으로 나뉩니다.
욕심 접근 방식을 기반으로 문제를 해결하기 위해,두 단계
- 항목의 목록을 스캔
- 최적화
이 단계는 배열의 분할 과정에,이 욕심 알고리즘 튜토리얼에서 병렬로 적용됩니다.
탐욕스러운 접근 방식을 이해하려면 재귀 및 컨텍스트 전환에 대한 실무 지식이 필요합니다. 이렇게 하면 코드를 추적하는 방법을 이해할 수 있습니다. 당신은 당신의 자신의 필요하고 충분한 진술의 관점에서 욕심 패러다임을 정의 할 수 있습니다.
두 가지 조건이 탐욕스러운 패러다임을 정의합니다.
- 각 단계별 솔루션은 가장 잘 받아 들여지는 솔루션으로 문제를 구성해야합니다.
- 문제의 구조가 유한 한 수의 욕심 많은 단계에서 중단 될 수 있다면 충분합니다.
이론화가 계속되면서 탐욕스러운 검색 접근법과 관련된 역사를 설명합시다.
이 욕심 알고리즘 튜토리얼에서,당신은 배울 것이다:
- 욕심 알고리즘의 역사
- 욕심 전략과 의사 결정
- 욕심 접근 방식의 특성
- 왜 욕심 접근 방식을 사용?
- 활동 선택 문제 해결 방법
- 욕심 많은 접근 방식의 아키텍처
- 욕심 많은 알고리즘의 단점
욕심 많은 알고리즘의 역사
욕심 많은 알고리즘의 중요한 랜드 마크는 다음과 같습니다.:
- 탐욕스러운 알고리즘은 1950 년대에 많은 그래프 워크 알고리즘에 대해 개념화되었다.
- 에스더 직스트라는 최소한의 스패닝 트리를 생성하기 위해 알고리즘을 개념화했다. 그는 네덜란드의 수도 인 암스테르담 내의 노선 범위를 단축하는 것을 목표로했습니다.
- 같은 10 년 동안 프림과 크루 스칼은 계량 된 경로를 따라 경로 비용을 최소화하는 최적화 전략을 달성했습니다.
- 70 년대에 미국의 연구자,코먼,리베스트,스타 인은 알고리즘 책에 대한 고전적인 소개에서 탐욕스러운 해결책의 재귀 적 하부 구조를 제안했다.
- 탐욕스러운 검색 패러다임은 2005 년 노스티 레코드에 다른 유형의 최적화 전략으로 등록되었다.
- 날짜까지 웹을 실행하는 프로토콜(예:최단 경로 우선 열기)및 기타 여러 네트워크 패킷 스위칭 프로토콜)은 탐욕스러운 전략을 사용하여 네트워크에서 소요되는 시간을 최소화합니다.
욕심 많은 전략과 의사 결정
가장 쉬운 형태의 논리는”욕심 많은”또는”욕심이 없다”로 요약되었습니다. 이러한 문은 각 알고리즘 단계에서 사전에 찍은 접근 방식에 의해 정의 되었다.
예를 들어,직스트라의 알고리즘은 비용 함수를 계산하여 인터넷에서 호스트를 식별하는 단계적 욕심 전략을 활용했다. 비용 함수에 의해 반환 된 값은 다음 경로가”탐욕스러운”또는”탐욕스럽지 않은”지 여부를 결정했습니다.
한마디로,알고리즘은 어떤 단계에서든 로컬에 욕심이 없는 단계를 취하면 욕심이 없어진다. 욕심 문제는 탐욕의 더 범위와 정지.
탐욕스러운 접근법의 특징
탐욕스러운 방법 알고리즘의 중요한 특징은 다음과 같다:
- 비용 또는 가치 속성과 함께 정렬 된 리소스 목록이 있습니다. 이러한 시스템의 제약 조건을 정량화.
- 제약 조건이 적용되는 시간 동안 최대 리소스 양을 사용합니다.
- 예를 들어,활동 스케줄링 문제에서 자원 비용은 시간 단위이며,활동은 직렬 순서로 수행되어야 합니다.
왜 욕심 많은 접근 방식을 사용합니까?
욕심 많은 접근 방식을 사용하는 이유는 다음과 같습니다.:
- 욕심 많은 접근 방식에는 몇 가지 장단점이 있으므로 최적화에 적합 할 수 있습니다.
- 한 가지 중요한 이유는 가장 실현 가능한 솔루션을 즉시 달성하는 것입니다. 활동 선택 문제(아래에서 설명)에서,현재 활동을 완료하기 전에 더 많은 활동을 수행 할 수 있다면,이러한 활동은 동일한 시간 내에 수행 될 수있다.
- 또 다른 이유는 모든 솔루션을 결합 할 필요없이 조건을 기반으로 문제를 재귀 적으로 나누는 것입니다.
- 활동 선택 문제에서”재귀 분할”단계는 항목 목록을 한 번만 스캔하고 특정 활동을 고려함으로써 달성됩니다.
활동 선택 문제를 해결하는 방법
활동 스케줄링 예에서는 모든 활동에 대해”시작”및”완료”시간이 있습니다. 각 활동은 참조를 위해 숫자로 인덱싱됩니다. 두 가지 활동 범주가 있습니다.
- 고려 활동:활동,하나 이상의 나머지 활동을 수행 할 수있는 능력이 분석되는 참조입니다.
- 남은 활동:고려된 활동보다 앞서 하나 이상의 인덱스에 있는 활동입니다.
총 기간은 활동을 수행하는 비용을 제공합니다. 즉(마무리-시작)우리에게 활동의 비용으로 기간을 제공합니다.
탐욕스러운 정도는 고려 된 활동의 시간에 수행 할 수있는 남은 활동의 수라는 것을 배우게됩니다.
탐욕스러운 접근 방식의 아키텍처
단계 1)
인덱스 0 을 고려 된 인덱스로 시작하여 활동 비용 목록을 검색합니다.
단계 2)
고려된 활동이 완료될 때까지 더 많은 활동이 완료될 수 있는 경우,하나 이상의 남은 활동을 검색하기 시작한다.
단계 3)
남은 활동이 더 이상 없으면 현재 남은 활동이 다음 고려된 활동이 됩니다. 1 단계와 2 단계를 반복하여 새 고려 작업을 수행합니다. 남은 활동이 없으면 4 단계로 이동하십시오.
단계 4)
고려 된 지수의 조합을 반환합니다. 이러한 인덱스는 처리량을 최대화하는 데 사용되는 활동 인덱스입니다.
코드 설명
#include<iostream>#include<stdio.h>#include<stdlib.h>#define MAX_ACTIVITIES 12
코드 설명:
- 포함 된 헤더 파일/클래스
- 사용자가 제공 한 최대 활동 수입니다.
using namespace std;class TIME{ public: int hours; public: TIME() { hours = 0; }};
코드 설명:
- 스트리밍 작업을 위한 네임스페이스입니다.
- 시간
- 시간 타임스탬프에 대한 클래스 정의입니다.
- 시간 기본 생성자
- 시간 변수입니다.
class Activity{ public: int index; TIME start; TIME finish; public: Activity() { start = finish = TIME(); }};
코드 설명:
- 활동
- 타임스탬프 기간 정의
- 모든 타임스탬프는 기본 생성자에서 0 으로 초기화됩니다
class Scheduler{ public: int considered_index,init_index; Activity *current_activities = new Activity; Activity *scheduled;
코드 설명:
- 스케줄러 클래스 정의의 1 부.
- 고려된 인덱스는 배열을 스캔하기 위한 시작 지점입니다.
- 초기화 인덱스는 임의의 타임스탬프를 할당하는 데 사용됩니다.
- 활동 개체의 배열은 새 연산자를 사용하여 동적으로 할당됩니다.
- 예약된 포인터는 탐욕의 현재 기본 위치를 정의합니다.
Scheduler(){ considered_index = 0; scheduled = NULL;......
코드 설명:
- 스케줄러 생성자-스케줄러 클래스 정의의 2 부.
- 고려된 인덱스는 현재 스캔의 현재 시작을 정의합니다.
- 현재 탐욕스러운 범위는 시작 시 정의되지 않습니다.
for(init_index = 0; init_index < MAX_ACTIVITIES; init_index++) { current_activities.start.hours = rand() % 12; current_activities.finish.hours = current_activities.start.hours + (rand() % 2); printf("\nSTART:%d END %d\n", current_activities.start.hours ,current_activities.finish.hours); }……
코드 설명:
- 현재 예약된 각 활동의 시작 시간과 종료 시간을 초기화하는 루프.
- 시작 시간 초기화.
- 종료 시간 초기화는 항상 시작 시간 이후 또는 정확히 시작됩니다.
- 할당된 기간을 출력하는 디버그 문입니다.
public: Activity * activity_select(int);};
코드 설명:
- 파트 4-스케줄러 클래스 정의의 마지막 부분.
- 활동 선택 기능은 시작점 인덱스를 기본으로 삼고 탐욕스러운 퀘스트를 탐욕스러운 하위 문제로 나눕니다.
Activity * Scheduler :: activity_select(int considered_index){ this->considered_index = considered_index; int greedy_extent = this->considered_index + 1;……
- 범위 확인 연산자(::)를 사용하여 함수 정의가 제공됩니다.
- 고려된 인덱스는 값으로 호출된 인덱스입니다. 이 경우 인덱스를 초기화하는 데 사용할 수 있습니다.
Activity * Scheduler :: activity_select(int considered_index){ while( (greedy_extent < MAX_ACTIVITIES ) && ((this->current_activities).start.hours < (this->current_activities).finish.hours )) { printf("\nSchedule start:%d \nfinish%d\n activity:%d\n", (this->current_activities).start.hours, (this->current_activities).finish.hours, greedy_extent + 1); greedy_extent++; }…...
코드 설명:
- 핵심 논리-욕심 정도는 활동의 수로 제한됩니다.
- 현재 활동의 시작 시간은 고려된 활동(고려된 인덱스에 의해 주어짐)이 완료되기 전에 예약 가능으로 확인됩니다.
- 가능한 한 선택적 디버그 문이 인쇄됩니다.
- 활동 배열의 다음 인덱스로 이동
...if ( greedy_extent <= MAX_ACTIVITIES ) { return activity_select(greedy_extent); } else { return NULL; }}
코드 설명:
- 조건부는 모든 활동이 보장되었는지 확인합니다.
- 그렇지 않은 경우 고려 된 인덱스를 현재 지점으로 사용하여 욕심을 다시 시작할 수 있습니다. 이 단계는 문제 문을 탐욕스럽게 나누는 재귀 단계입니다.
- ‘예’인 경우 탐욕을 확장할 범위가 없이 호출자에게 반환됩니다.
int main(){ Scheduler *activity_sched = new Scheduler(); activity_sched->scheduled = activity_sched->activity_select( activity_sched->considered_index); return 0;}
코드 설명:
- 스케줄러를 호출하는 데 사용되는 주요 기능.
- 새 스케줄러가 인스턴스화됩니다.
- 활동 유형 포인터를 반환하는 활동 선택 함수는 탐욕스러운 퀘스트가 끝난 후 호출자에게 돌아옵니다.
출력:
START:7 END 7START:9 END 10START:5 END 6START:10 END 10START:9 END 10Schedule start:5 finish6 activity:3Schedule start:9 finish10 activity:5
욕심 많은 알고리즘의 단점
정렬과 같은 모든 하위 문제에 대해 솔루션이 필요한 욕심 많은 문제에는 적합하지 않습니다.
이러한 욕심 알고리즘 연습 문제에서,욕심 방법은 잘못 될 수 있으며,최악의 경우에도 비 최적의 솔루션으로 이어집니다.
따라서 탐욕스러운 알고리즘의 단점은 현재 탐욕스러운 상태 앞에 무엇이 있는지 알지 못하는 것입니다.
아래는 욕심 많은 방법의 단점을 묘사 한 것입니다:
여기에 트리(높은 값 높은 탐욕)로 표시된 탐욕스러운 스캔에서 값:40 의 알고리즘 상태는 다음 값으로 29 를 취할 가능성이 높습니다. 또한,그 퀘스트는 12 시에 끝납니다. 이 값은 41 입니다.
그러나 알고리즘이 차선책 경로를 취하거나 정복 전략을 채택한 경우. 그런 다음 25 다음에 40 이 생기고 전체 비용 개선은 65 가되며 이는 차선책 결정으로 24 포인트 더 높습니다.
욕심 많은 알고리즘의 예
대부분의 네트워킹 알고리즘은 욕심 많은 접근 방식을 사용합니다. 다음은 몇 가지 욕심 많은 알고리즘 예제 목록입니다:
- 프림의 최소 스패닝 트리 알고리즘
- 여행 세일즈맨 문제
- 그래프-맵 채색
- 크루스칼의 최소 스패닝 트리 알고리즘
- 다이크스트라의 최소 스패닝 트리 알고리즘
- 그래프-버텍스 커버
- 배낭 문제
- 작업 스케줄링 문제
요약:
요약하면,이 기사는 욕심 패러다임을 정의 욕심 최적화 및 재귀,당신은 지점까지 최적의 솔루션을 얻을 수있는 방법을 보여 주었다. 욕심 많은 알고리즘은 욕심 많은 알고리즘 파이썬,씨,씨#,