Turing 머신 (및 Von Neuman 머신)은 자체 정지 문제를 해결할 수 없다는 사실을 받아들이기를 거부하는 동료가 있습니다.
충분한 시간과 돈으로 무엇이든 할 수 있습니다.
그는 또한 이론적 문제를 싫어한다고 주장했다.
우리 분야에서는 그러한 질문에 절대 빠지지 않을 것입니다. 우리는 이론 과학자가 아닌 응용 프로그램 개발자입니다.
그에게 이것을 확신시키는 데 사용할 수있는 계산 상 불가능한 비즈니스 문제의 좋은 예가 있습니까?
Turing 머신 (및 Von Neuman 머신)은 자체 정지 문제를 해결할 수 없다는 사실을 받아들이기를 거부하는 동료가 있습니다.
충분한 시간과 돈으로 무엇이든 할 수 있습니다.
그는 또한 이론적 문제를 싫어한다고 주장했다.
우리 분야에서는 그러한 질문에 절대 빠지지 않을 것입니다. 우리는 이론 과학자가 아닌 응용 프로그램 개발자입니다.
그에게 이것을 확신시키는 데 사용할 수있는 계산 상 불가능한 비즈니스 문제의 좋은 예가 있습니까?
답변:
기술적으로 불가능하지는 않지만 ...
시간 슬롯 사용을 최대화하는 이상적인 일정을 찾는 것을 목표로 자원 예약 . 나는 이전 컴퓨팅 시대 에이 요구 사항이있는 프로젝트에 한 번있었습니다. 나는 그것이 NP-hard라는 것을 깨닫기 전에 잠시 동안 일했습니다.
기술적으로 불가능하지는 않지만 기술적으로 어려운 문제의 다른 예는 여기 에서 찾을 수 있습니다 .
비즈니스 컴퓨팅에서 가장 어려운 계산 문제는 불가능하지 않고 비현실적입니다. 당신의 친구는 옳습니다. 당신이 그들에게 충분한 돈을 던지면 그들 대부분을 해결할 수 있습니다. 그러나 논쟁은 의문이다. 사업 운영의 요점은 돈을 버는 것입니다.
일상적인 연습에서 우리는 튜링 완성도에 대해 모호한 방식으로 이야기합니다. 수학적 원리를 설명하기위한 것이 아니라 기능 완성 프로그램을 제작하기위한 완전한 수단으로서 HTML과 CSS의 부적절 함을 보여줍니다.
마찬가지로, Halting Problem은 이론가들에게 중요하지만 대부분의 비즈니스와 관련이 없습니다.
다른 사람들은 이것에 대해 언급했지만 내 관점을 제시하는 답변을 쓰려고 노력할 것입니다.
로버트 하비 (Robert Harvey)의 답변과 그의 답변에 대한 의견이 마음에 들었습니다.
이러한 결정 불가능한 문제 (종료와 같은)를 일상적인 방식으로 제시해야한다고 생각합니다. 예를 들어 "이 함수가 항상 값을 반환하는지 확인하는 IDE 도구"입니다.
가르 칠 때 가장 좋아하는 예는 리팩토링 ( 함수 동등성, 또 다른 결정 불가능한 문제 )이었습니다. 나는 물었다 :
멋진 리팩토링 후에 함수 / 프로그램이 동일한 지 어떻게 확인합니까? 물론, 이에 대한 단위 테스트가 있지만 모든 경우를 다루지는 않습니다. 그리고 그들은 지루하게 쓰고 있습니다 ... 그러나 우리는 프로그래머입니다! 이 두 함수가 항상 동일한 결과를 생성하는지 확인하는 프로그램을 작성해야합니다! 왜 쓰려고하지 않습니까?
또는 변형이 귀하의 사례에 더 가깝을 수도 있습니다.
우리는 스펙과 / 또는 컴파일러가 존재하지 않는 고대의 모호한 COBOL 방언으로 작성된이 레거시 코드를 가지고 있습니다. 우리는 프로그램 만 가지고 있습니다. 우리의 전체 사업은 그것에 의존하기 때문에 새로운 Java 코드가 모든 상황에서 정확히 동일하다는 것을 100 % 확신해야합니다. 경영진은 가능한 모든 사례를 확인하고 6-8 주 안에 수행 할 수있는 것으로 추정하는 프로그램을 원합니다. 왜 쓰려고하지 않습니까?
요점은 그러한 프로그램을 작성하는 것이 아닙니다. 또는 요구 사항을 충분히 근사화합니다. 요점은 그것이 직접적인 방법으로 이루어질 수 없다는 것을 깨닫는 것입니다. 우리가 그것을하는 방법을 알아 내려고 노력하는 것을 낭비하지 말고 (가능하지 않다는 것을 깨닫기 위해서만) 인식하십시오. "아! 이것은 결정 불가능하다! 직접 할 수는 없다. 충분히 좋은 근사치로 다른, 더 영리한 방법을 찾아야한다"고 말했다.
인식 할 수 있고 명백하게 간단한 방법으로 문제를 제시 할 방법을 찾아야합니다. 당신은 얼마나 많은 CS 학생들이 그런 프로그램을 곧바로 작성하려고하는지 믿지 않을 것입니다 ... 계산 수업을 받기 전에 :)
우리가 현재 도덕적 질문을 따로 따를 수 있다고 가정하자 :
비즈니스 A는 A1 및 A2의 권한이있는 사람 외에는 통신을 이해할 수있는 사람이없이 위성 사무소 A1과 A2간에 통신 할 수있는 방법을 계약했습니다.
비즈니스 B는 A1과 A2 사이의 모든 통신을 지능적으로 도청하는 방법을 귀하와 계약했습니다.
분명히 둘 다 할 수는 없습니다.
수학이 수행되는 방식 (정확한 수학은 100 년 동안 지속적으로 연구되어 왔음)으로 인해 다음 요구 사항 중 하나를 충족 할 수 없습니다.
(1) : 공격자가 임의의 금액으로 돈을 깰 수없는 암호화 알고리즘을 제공하십시오.
(2) : 적절한 시간에 실행되는 임의의 암호화 알고리즘을위한 암호화 차단 알고리즘을 제공합니다.
최근 BPMN (Business Process Model and Notation)에 대한 강의를 수강했습니다 . 쉽게 많은과 워크 플로우가 너무 분할 있음이 볼 수있는, 조인 및 루프 (하지만 반드시 신속하게 허무하게 불가능 (대신 XOR-분할의 너무 많은 OR-분할을 사용하는 경우), 이해하고 제어하기 위해, AFAIK).
소프트웨어 산업의 경우 코드 커버리지 분석 에서 "다중 조건 커버리지"의 유사한 문제에 대해서도 마찬가지 입니다.
비즈니스의 경우 갈 길은 문제 공간을 줄이고 복잡한 문제에 더 많은 리소스를 버리지 않는 것입니다. 내 예에서는 N이 상상할 수 없을 정도로 큰 N 개의 가능한 추적 및 결과를 찾기 위해 열심히 노력하는 대신 워크 플로우에 제약 조건을 추가하거나 코드 적용 범위 분석에서 코드를 단순화하십시오.
그 외에도 네트워크 / 그래프 분석에는 해결할 수없는 많은 문제가 있다고 생각합니다 (모든 경로를 반복적으로 걸어 네트워크 토폴로지를 결정하려고 시도하는 등).
고전적인 예는 정규식으로 HTML 을 구문 분석하는 것 입니다. 이것은 제한된 HTML 세트에서만 작동 할 수 있지만 다른 Chomsky 문법이 있기 때문에 일반적인 해결책은 불가능합니다 (링크가 명확하기 때문에).
더 일반적으로 어떤 사람들은 (동료와 같은) 철학적으로 생각하기를 좋아하지 않으며, 당신이 마음가짐에서 벗어나는 것을 확신 할 수 없습니다. 그의 첫 번째 요점은 확실히 틀렸지 만 그의 두 번째 요점은 물건을 받기 위해 웹 양식을 코딩하기 위해 이것에 대해 걱정할 필요가 없다고 말하는 것일 수 있습니다. 나는 이것에 대해 동정심을 가지고 있지만 때로는 이론을 알면 직장에서 성배를 찾는 데 헌신하지 않는다는 것을 의미합니다.
아마도 대답은 동료가 정확하다는 것입니다. 튜링을 잘못 이해했거나 여기에 어떻게 적용됩니까?
모든 기계는 유한하기 때문에 '진짜'튜링 기계와 절대 멈추지 않는 프로그램이 없습니다. 간단한 무한 루프를 실행하는 사소한 프로그램은 5 분 또는 50 년 동안 실행될 수 있지만 유한 기계에서는 중지됩니다. '정확히 pi 계산'과 같은 사소한 비 정지 문제도 중단됩니다. 결국 계산은 더 많은 숫자를 저장할 수있는 용량을 초과하기 때문입니다.
튜링 결과는 유한 기계에서 특히 유용한 것을 보장하지 않으므로 퀘스트는 결실이 없습니다. 얼마나 많은 시간과 돈에 집중하고 수학자에게 무한대를 남겨 두는 것이 좋습니다.
당신은 같은 프로그램 { while true: print "running"; print "halted"; }이 반례 라고 생각할 수도 있지만 그렇지 않습니다. 이 프로그램에는 부작용이있어 중단 될 수 있습니다. 부작용을 무시하고이 프로그램이 중단되지 않는다는 공식적인 증거를 고안 할 수 있습니다. 이 질문에서 우리는 중지에 대한 질문을 결정할 수없는 비 정지에 대한 공식적인 증거를 회피하는 프로그램에만 관심이 있습니다. 이것은 그런 프로그램이 아닙니다.
'강한'튜링과 '약한'튜링을 구별하는 데 도움이 될 수 있습니다. 강력한 튜링 기계는 실제로 무한하며 정지하지 않으면 무한한 시간 동안 작동합니다. 우리는 그것들을 만들 수 없습니다.
약한 튜링 기계는 시간과 공간에 제한이 있으며 우리가 만들 수있는 유일한 종류입니다. 우리는 그 한도 내에서 중단되는 것으로 입증 될 수없는 프로그램에 관심이 있습니다. 튜링은 그러한 프로그램이 있지만이를 식별 할 수는 없다고 말합니다. 한계가 충분히 낮 으면 프로그램을 작성하고 한계까지 실행하여 식별 할 수 있습니다.
튜링의 본질은 지름길이 없다는 것입니다. 문제가 계산적으로 실현 가능한지 확신 할 수있는 유일한 방법은 프로그램을 작성하고 실행하여 알아내는 것입니다. 시간과 돈이 충분하면 모든 프로그램을 작성하고 시간이 지남에 따라 프로그램을 실행하고 결과를 산출하는 프로그램 (홀더)을 찾을 수 있습니다. 다른 사람들은 여전히 실행 중입니다. 동료에게 충분한 시간과 돈이 있습니까?
그러나이 논쟁은 한계에 관한 것입니다. Turing과 NP complete는 예산의 규모 나 일정에 관계없이 특정 예산 내에서 또는 일정에 따라 특정 종류의 문제를 해결할 수 없음을 알려줍니다. 이런 종류의 문제의 예는 풍부합니다. 수백 개의 주소로 배달하기위한 경로 최적화 트럭의 포장 상자; 큰 프로그램에서 버그 찾기!
따라서 동료에게 예산과 일정을 요청하고 해당 예산이나 일정 내에서 해결할 수없는 문제를 일으킬 수 있다고 약속하십시오. 그 약속은 지키기 매우 쉬울 것입니다.
while True: print "doing stuff"; print "Finished"; 그것은 마치기까지 무한한 시간이 걸리는 프로그램의 예입니다. 완료하는데 많은 시간이 걸리는 무한한 다른 프로그램이 있습니다. 우리는 정기적으로 목적을 달성하는 데 무한한 시간이 걸리는 프로그램을 만듭니다. 이를 '장기 실행 프로세스'라고합니다. 대부분의 동적 웹 사이트가 그 중 하나입니다.