예제가있는 욕심 많은 알고리즘:욕심 많은 방법 및 접근법

욕심 많은 알고리즘은 무엇입니까?

탐욕스러운 알고리즘에서 리소스 집합은 주어진 실행 단계에서 해당 리소스의 최대 즉시 가용성에 따라 재귀 적으로 나뉩니다.

욕심 접근 방식을 기반으로 문제를 해결하기 위해,두 단계

  1. 항목의 목록을 스캔
  2. 최적화

이 단계는 배열의 분할 과정에,이 욕심 알고리즘 튜토리얼에서 병렬로 적용됩니다.

탐욕스러운 접근 방식을 이해하려면 재귀 및 컨텍스트 전환에 대한 실무 지식이 필요합니다. 이렇게 하면 코드를 추적하는 방법을 이해할 수 있습니다. 당신은 당신의 자신의 필요하고 충분한 진술의 관점에서 욕심 패러다임을 정의 할 수 있습니다.

두 가지 조건이 탐욕스러운 패러다임을 정의합니다.

  • 각 단계별 솔루션은 가장 잘 받아 들여지는 솔루션으로 문제를 구성해야합니다.
  • 문제의 구조가 유한 한 수의 욕심 많은 단계에서 중단 될 수 있다면 충분합니다.

이론화가 계속되면서 탐욕스러운 검색 접근법과 관련된 역사를 설명합시다.

이 욕심 알고리즘 튜토리얼에서,당신은 배울 것이다:

  • 욕심 알고리즘의 역사
  • 욕심 전략과 의사 결정
  • 욕심 접근 방식의 특성
  • 왜 욕심 접근 방식을 사용?
  • 활동 선택 문제 해결 방법
  • 욕심 많은 접근 방식의 아키텍처
  • 욕심 많은 알고리즘의 단점

욕심 많은 알고리즘의 역사

욕심 많은 알고리즘의 중요한 랜드 마크는 다음과 같습니다.:

  • 탐욕스러운 알고리즘은 1950 년대에 많은 그래프 워크 알고리즘에 대해 개념화되었다.
  • 에스더 직스트라는 최소한의 스패닝 트리를 생성하기 위해 알고리즘을 개념화했다. 그는 네덜란드의 수도 인 암스테르담 내의 노선 범위를 단축하는 것을 목표로했습니다.
  • 같은 10 년 동안 프림과 크루 스칼은 계량 된 경로를 따라 경로 비용을 최소화하는 최적화 전략을 달성했습니다.
  • 70 년대에 미국의 연구자,코먼,리베스트,스타 인은 알고리즘 책에 대한 고전적인 소개에서 탐욕스러운 해결책의 재귀 적 하부 구조를 제안했다.
  • 탐욕스러운 검색 패러다임은 2005 년 노스티 레코드에 다른 유형의 최적화 전략으로 등록되었다.
  • 날짜까지 웹을 실행하는 프로토콜(예:최단 경로 우선 열기)및 기타 여러 네트워크 패킷 스위칭 프로토콜)은 탐욕스러운 전략을 사용하여 네트워크에서 소요되는 시간을 최소화합니다.

욕심 많은 전략과 의사 결정

가장 쉬운 형태의 논리는”욕심 많은”또는”욕심이 없다”로 요약되었습니다. 이러한 문은 각 알고리즘 단계에서 사전에 찍은 접근 방식에 의해 정의 되었다.

예를 들어,직스트라의 알고리즘은 비용 함수를 계산하여 인터넷에서 호스트를 식별하는 단계적 욕심 전략을 활용했다. 비용 함수에 의해 반환 된 값은 다음 경로가”탐욕스러운”또는”탐욕스럽지 않은”지 여부를 결정했습니다.

한마디로,알고리즘은 어떤 단계에서든 로컬에 욕심이 없는 단계를 취하면 욕심이 없어진다. 욕심 문제는 탐욕의 더 범위와 정지.

탐욕스러운 접근법의 특징

탐욕스러운 방법 알고리즘의 중요한 특징은 다음과 같다:

  • 비용 또는 가치 속성과 함께 정렬 된 리소스 목록이 있습니다. 이러한 시스템의 제약 조건을 정량화.
  • 제약 조건이 적용되는 시간 동안 최대 리소스 양을 사용합니다.
  • 예를 들어,활동 스케줄링 문제에서 자원 비용은 시간 단위이며,활동은 직렬 순서로 수행되어야 합니다.

왜 욕심 많은 접근 방식을 사용합니까?

욕심 많은 접근 방식을 사용하는 이유는 다음과 같습니다.:

  • 욕심 많은 접근 방식에는 몇 가지 장단점이 있으므로 최적화에 적합 할 수 있습니다.
  • 한 가지 중요한 이유는 가장 실현 가능한 솔루션을 즉시 달성하는 것입니다. 활동 선택 문제(아래에서 설명)에서,현재 활동을 완료하기 전에 더 많은 활동을 수행 할 수 있다면,이러한 활동은 동일한 시간 내에 수행 될 수있다.
  • 또 다른 이유는 모든 솔루션을 결합 할 필요없이 조건을 기반으로 문제를 재귀 적으로 나누는 것입니다.
  • 활동 선택 문제에서”재귀 분할”단계는 항목 목록을 한 번만 스캔하고 특정 활동을 고려함으로써 달성됩니다.

활동 선택 문제를 해결하는 방법

활동 스케줄링 예에서는 모든 활동에 대해”시작”및”완료”시간이 있습니다. 각 활동은 참조를 위해 숫자로 인덱싱됩니다. 두 가지 활동 범주가 있습니다.

  1. 고려 활동:활동,하나 이상의 나머지 활동을 수행 할 수있는 능력이 분석되는 참조입니다.
  2. 남은 활동:고려된 활동보다 앞서 하나 이상의 인덱스에 있는 활동입니다.

총 기간은 활동을 수행하는 비용을 제공합니다. 즉(마무리-시작)우리에게 활동의 비용으로 기간을 제공합니다.

탐욕스러운 정도는 고려 된 활동의 시간에 수행 할 수있는 남은 활동의 수라는 것을 배우게됩니다.

탐욕스러운 접근 방식의 아키텍처

단계 1)

인덱스 0 을 고려 된 인덱스로 시작하여 활동 비용 목록을 검색합니다.

단계 2)

고려된 활동이 완료될 때까지 더 많은 활동이 완료될 수 있는 경우,하나 이상의 남은 활동을 검색하기 시작한다.

단계 3)

남은 활동이 더 이상 없으면 현재 남은 활동이 다음 고려된 활동이 됩니다. 1 단계와 2 단계를 반복하여 새 고려 작업을 수행합니다. 남은 활동이 없으면 4 단계로 이동하십시오.

단계 4)

고려 된 지수의 조합을 반환합니다. 이러한 인덱스는 처리량을 최대화하는 데 사용되는 활동 인덱스입니다.

탐욕스러운 접근 방식의 아키텍처
탐욕스러운 접근 방식의 아키텍처

코드 설명

#include<iostream>#include<stdio.h>#include<stdlib.h>#define MAX_ACTIVITIES 12

코드 설명:

  1. 포함 된 헤더 파일/클래스
  2. 사용자가 제공 한 최대 활동 수입니다.
using namespace std;class TIME{ public: int hours; public: TIME() { hours = 0; }};

코드 설명:

  1. 스트리밍 작업을 위한 네임스페이스입니다.
  2. 시간
  3. 시간 타임스탬프에 대한 클래스 정의입니다.
  4. 시간 기본 생성자
  5. 시간 변수입니다.
class Activity{ public: int index; TIME start; TIME finish; public: Activity() { start = finish = TIME(); }};

코드 설명:

  1. 활동
  2. 타임스탬프 기간 정의
  3. 모든 타임스탬프는 기본 생성자에서 0 으로 초기화됩니다
class Scheduler{ public: int considered_index,init_index; Activity *current_activities = new Activity; Activity *scheduled;

코드 설명:

  1. 스케줄러 클래스 정의의 1 부.
  2. 고려된 인덱스는 배열을 스캔하기 위한 시작 지점입니다.
  3. 초기화 인덱스는 임의의 타임스탬프를 할당하는 데 사용됩니다.
  4. 활동 개체의 배열은 새 연산자를 사용하여 동적으로 할당됩니다.
  5. 예약된 포인터는 탐욕의 현재 기본 위치를 정의합니다.
Scheduler(){ considered_index = 0; scheduled = NULL;......

코드 설명:

  1. 스케줄러 생성자-스케줄러 클래스 정의의 2 부.
  2. 고려된 인덱스는 현재 스캔의 현재 시작을 정의합니다.
  3. 현재 탐욕스러운 범위는 시작 시 정의되지 않습니다.
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); }……

코드 설명:

  1. 현재 예약된 각 활동의 시작 시간과 종료 시간을 초기화하는 루프.
  2. 시작 시간 초기화.
  3. 종료 시간 초기화는 항상 시작 시간 이후 또는 정확히 시작됩니다.
  4. 할당된 기간을 출력하는 디버그 문입니다.
public: Activity * activity_select(int);};

코드 설명:

  1. 파트 4-스케줄러 클래스 정의의 마지막 부분.
  2. 활동 선택 기능은 시작점 인덱스를 기본으로 삼고 탐욕스러운 퀘스트를 탐욕스러운 하위 문제로 나눕니다.
Activity * Scheduler :: activity_select(int considered_index){ this->considered_index = considered_index; int greedy_extent = this->considered_index + 1;…… 

  1. 범위 확인 연산자(::)를 사용하여 함수 정의가 제공됩니다.
  2. 고려된 인덱스는 값으로 호출된 인덱스입니다. 이 경우 인덱스를 초기화하는 데 사용할 수 있습니다.
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++; }…...

코드 설명:

  1. 핵심 논리-욕심 정도는 활동의 수로 제한됩니다.
  2. 현재 활동의 시작 시간은 고려된 활동(고려된 인덱스에 의해 주어짐)이 완료되기 전에 예약 가능으로 확인됩니다.
  3. 가능한 한 선택적 디버그 문이 인쇄됩니다.
  4. 활동 배열의 다음 인덱스로 이동
...if ( greedy_extent <= MAX_ACTIVITIES ) { return activity_select(greedy_extent); } else { return NULL; }}

코드 설명:

  1. 조건부는 모든 활동이 보장되었는지 확인합니다.
  2. 그렇지 않은 경우 고려 된 인덱스를 현재 지점으로 사용하여 욕심을 다시 시작할 수 있습니다. 이 단계는 문제 문을 탐욕스럽게 나누는 재귀 단계입니다.
  3. ‘예’인 경우 탐욕을 확장할 범위가 없이 호출자에게 반환됩니다.
int main(){ Scheduler *activity_sched = new Scheduler(); activity_sched->scheduled = activity_sched->activity_select( activity_sched->considered_index); return 0;}

코드 설명:

  1. 스케줄러를 호출하는 데 사용되는 주요 기능.
  2. 새 스케줄러가 인스턴스화됩니다.
  3. 활동 유형 포인터를 반환하는 활동 선택 함수는 탐욕스러운 퀘스트가 끝난 후 호출자에게 돌아옵니다.

출력:

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 포인트 더 높습니다.

욕심 많은 알고리즘의 예

대부분의 네트워킹 알고리즘은 욕심 많은 접근 방식을 사용합니다. 다음은 몇 가지 욕심 많은 알고리즘 예제 목록입니다:

  • 프림의 최소 스패닝 트리 알고리즘
  • 여행 세일즈맨 문제
  • 그래프-맵 채색
  • 크루스칼의 최소 스패닝 트리 알고리즘
  • 다이크스트라의 최소 스패닝 트리 알고리즘
  • 그래프-버텍스 커버
  • 배낭 문제
  • 작업 스케줄링 문제

요약:

요약하면,이 기사는 욕심 패러다임을 정의 욕심 최적화 및 재귀,당신은 지점까지 최적의 솔루션을 얻을 수있는 방법을 보여 주었다. 욕심 많은 알고리즘은 욕심 많은 알고리즘 파이썬,씨,씨#,,자바 등 많은 언어로 문제 해결을위한 응용 프로그램으로 널리 사용됩니다. 욕심 많은 알고리즘 예제의 활동 선택은 욕심 많은 접근 방식을 사용하여 최대 처리량을 달성 할 수있는 전략적 문제로 설명되었습니다. 결국,욕심 접근 방식의 사용의 단점을 설명했다.

You might also like

답글 남기기

이메일 주소는 공개되지 않습니다.