Hesaplama imkansız bir iş problemine örnek nedir?


17

Turing makinelerinin (ve Von Neuman makinelerinin uzatma ile) kendi durma problemini çözemediğini kabul etmeyi reddeden bir iş arkadaşım var:

Yeterli zaman ve para ile her şeyi yapabilirsiniz.

Ayrıca, aşağıdakileri savunarak teorik sorunları sevmez:

Alanımızda asla bu sorularla karşılaşmayacağız. Teorik bilim adamları değil, uygulama geliştiricileriz.

Onu buna ikna etmem için kullanabileceğim, hesaplama açısından imkansız olan bir iş sorununa iyi bir örnek var mı?


11
Örnek olarak bir şeyin imkansız olduğunu gösteremezsiniz. İş arkadaşınız sadece "Çalışmıyor çünkü doğru yaklaşımı anlayamadık" diyecektir. Yapabileceğiniz en iyi şey ona bir kanıt göstermek. Satın almazsa, ya gerçekten aptal ya da salak ya da her ikisi birden.
Karar

18
Bir teorisyen ve mühendise, aralarındaki mesafeyi tekrar tekrar yarı yarıya dolaşarak bir kızı öpebilecekleri söylendi. Teorisyen derhal vazgeçti "imkansız, oraya asla gidemeyeceğim". Mühendis, "Pratik amaçlar için yeterince yaklaşacağım" diyerek bunun için gitti. Siz, efendim, bu öpücüğü denemeniz gerekiyor.
gbjbaanb

2
@gbjbaanb: O NP-zor sorunlara en uygun olmayan çözümlere çoğunun iyi açıklayıcısı olduğunu ve bilerek bu sorunlardır klasik çözmek için (pratik olarak) mümkün değildir niçin alternatif yöntem için gidin. Bazı sorunların pratik olarak veya kelimenin tam anlamıyla çözülmesinin imkansız olduğunu kabul etmezseniz, belirlenemeyen bir süre sonra "yeterince iyi" bir cevap verebilecek kusurlu çözümler aramazsınız.
Phoshi

3
@Phoshi hayır, gerçek dünya mühendislik çözümlerinin sadece problemi kabul için yeterince çözecek kadar iyi bir çözüme ihtiyaç duyması. Mükemmel bir şekilde çözmek zaman ve masrafa değmez. Örneğin. Seyahat eden satıcı sorunu birkaç düğümden fazlası göz önüne alındığında imkansızdır, ancak birçok işletme için hala optimalden daha az bir çözüm gereklidir (ve teslim edilir). Sadece mükemmellik üretseydik, hiç kimse bunlara sahip olmazdı.
gbjbaanb

10
@gbjbaanb: Doğru, ancak bu sorunları çözmelerinin tek nedeni, öncelikle "yeterli zaman ve para ile hiçbir şey yapamayacağınızı" kabul ederek en uygun çözümü kovalamayı bırakmanızdır. Ne bilgisi olamaz yapmak çoğu zaman ne bilgisi olarak bir çözüm bulmaya kadar önemlidir edebilirsiniz yapmak.
Phoshi

Yanıtlar:


11

Teknik olarak imkansız değil, ama ...

Zaman aralıklarının kullanımını en üst düzeye çıkaran ideal programı bulmak amacıyla kaynakları zamanlama. Bir zamanlar bir projedeydim, daha önceki bilgisayar günlerimde bu gereksinim vardı. NP-zor olduğunu fark etmeden bir süre üzerinde çalıştım.

Teknik olarak imkansız olmayan, ancak teknik olarak zor olan diğer sorun örnekleri burada bulunabilir .

İşletme bilgisayarlarındaki en zor hesaplama problemleri imkansız değil, sadece pratik değildir. Arkadaşın haklı; onlara yeterince para atarsanız çoğunu çözebilirsiniz. Ancak argüman fena; bir iş yürütmenin tüm amacı para kazanmaktır, kaybetmek değil.

Günlük pratikte, Turing bütünlüğünü belirsiz bir şekilde, bazı matematiksel prensipleri göstermek değil, HTML ve CSS'nin tam özellikli programlar üretmek için eksiksiz bir araç olarak yetersizliğini göstermek (örneğin) hakkında konuşuyoruz.

Benzer şekilde, Durma Sorunu teorisyenler için önemlidir, ancak çoğu işletme için çok fazla ilgisi yoktur.


14
Durma problemi, kodun statik analizinde ortaya çıkar. Bundan "burada bazı kod var, güzel görünmesi" gibi sıradan problemler alabilirsiniz "burada bazı kod, kötü amaçlı yazılım mı" - ilki IDE (sözdizimi vurgulama, yeniden düzenleme) yapan şirketler için önemli, ikincisi antivirüs şirketleri ve güvenlik uzmanları.

12
"Benzer şekilde, Durma Sorunu teorisyenler için önemlidir, ancak çoğu işletme için çok fazla ilgisi yoktur.": Durma problemi hesaplanabilirse, bir yazılım parçasının sonlandırılıp kapanmayacağını otomatik olarak kontrol edebiliriz belirli bir giriş olsun veya olmasın. Muhtemelen artık BSOD'imiz olmayacaktı. Bu mümkün olmadığından, yazılım kalitesini (test gibi) sağlamak için başka teknikler kullanmak zorundayız ve hiç kimse genel bir “sonlandırma kontrolü” programı geliştirmek için zaman ve para yatırmıyor. Bu teorik sonucun pratikte büyük bir ilgisi olduğunu düşünüyorum.
Giorgio

4

Diğerleri bu konuda yorum yaptı, ama benim bakış açımı veren bir cevap yazmaya çalışacağım.

Robert Harvey'nin cevabını ve cevabının yorumlarını seviyorum ve bunları genişletmek istiyorum.

Bu kararsız sorunları (sonlandırma gibi) sıradan bir şekilde sunmanız gerektiğini düşünüyorum: örneğin, "bu işlev her zaman bir değer döndürüp döndürmediğini denetler" IDE aracı.

Öğretirken en sevdiğim örnek yeniden düzenleme ( işlev denkliği, başka bir karar verilemez problem ) idi. Diye sordum:

güzel yeniden düzenlemenizden sonra bir fonksiyonun / programın aynı şeyi yapıp yapmadığını nasıl kontrol edersiniz? Elbette, bunun için birim testlerimiz var, ancak tüm vakaları kapsamıyorlar. Ve yazmak için sıkıcılar ... Ama biz programcıyız! Bu iki işlevin her zaman aynı sonucu üretip üretmediğini kontrol eden bir program yazmalıyız! Neden yazmaya çalışmıyorsun?

veya bir varyasyon olarak davanıza daha yakın olabilir:

Bu eski kodu, hiçbir spec ve / veya derleyici bulunmayan eski, belirsiz bir COBOL lehçesinde yazılmış. Sadece programımız var. Tüm işimiz buna dayanıyor, bu yüzden yeni Java kodunun her durumda aynı şeyi yaptığından% 100 emin olmalıyız. Yönetim, bunu yapan bir program istiyor, olası tüm vakaları kontrol ediyor ve 6 ila 8 hafta içinde yapılabileceğini tahmin ediyor. Neden yazmaya çalışmıyorsun?

Mesele böyle bir program yazmak değil. Ya da gereksinimlere yeterince yakın. Mesele, bunun doğrudan bir şekilde yapılamayacağının farkına varmaktır, nasıl yapılacağını anlamaya çalışırken sayısız bizim israfınızı YAPMAYIN (sadece mümkün olmadığını fark etmek için), ancak bunu fark edin. "Ah! Bu karar verilemez! Doğrudan yapmak mümkün değil. Yeterince iyi bir yaklaşımla bunu yapmak için farklı, daha akıllıca bir yol bulmam gerekiyor".

Sorunu tanınabilir ve görünüşte basit bir şekilde sunmanın bir yolunu bulmalısınız. Kaç CS öğrencisinin böyle bir programı hemen yazmaya çalışacağına inanamayacaksınız ... bir hesaplama sınıfına girmeden önce :)


İkinci alıntı, durdurma sorununu yanlış çağırmaya çalışır; ancak COBOL programının çalıştığını ve bir test ortamında çalıştırabileceğini biliyoruz (vm-klon gerekirse tüm PROD) durdurma sorunu hariç tutulur ve bunu deneyebiliriz. Muhtemelen programdan ziyade elle, ama aynı şekilde yapabiliriz. Gerekirse tüm olası giriş formlarını ağaçlara ayırabiliriz. Çünkü hedef program durur, ağaç parçalanır.
Joshua

2

Şu anda ahlaki soruları bir kenara atabileceğimizi varsayarsak:

İş A, A1 ve A2'deki yetkili kişilerin yanı sıra iletişimi anlayabilmeleri dışında herhangi biri olmadan A1 ve A2 uydu ofisleri arasında iletişim kurmanın bir yolu için size sözleşme yapmıştır.

B İşletmesi, A1 ve A2 arasındaki tüm iletişimleri akıllıca dinlemek için bir sözleşme yapmıştır.

Açıkçası her ikisini de yapamazsınız.

Matematiğin çalışma şekli nedeniyle (kesin matematik 100 yıldır devam eden araştırmaya tabi tutulmuştur), aşağıdaki gereksinimlerden biri karşılanamaz:

(1): Bir saldırgan tarafından keyfi olarak parayla kırılamayan bir şifreleme algoritması sağlayın.

(2): Makul bir zamanda çalışan rasgele bir şifreleme algoritması için bir şifreleme kırma algoritması sağlayın.


1
(3): Piyasa her ikisini de denediğini
öğrendikten

1

Son zamanlarda İş Süreç Modeli ve Gösterim ( BPMN ) üzerine bir ders aldım . Orada çok fazla bölme, birleşme ve döngüye sahip iş akışlarının (XOR bölmeleri yerine çok fazla OR bölmesi kullandığınızda) anlamak ve kontrol etmek için hızlı bir şekilde pratik olmadığı (mutlaka imkansız olmasa da AFAIK) kolayca görülebilir .

Yazılım endüstrisi için, aynı durumun kod kapsamı analizindeki "çoklu koşul kapsamı" benzer sorunları için de geçerli olduğunu düşünüyorum .

Bir işletme için gidilecek yol, sorunlu alanı küçültmek ve karmaşık soruna daha fazla kaynak atmamaktır. Örneğimde, N'nin hayal edilemeyecek kadar büyük bir sayı olduğu tüm olası izleri ve sonuçları bulmak için çok çalışmak yerine, iş akışına kısıtlamalar ekleyin (veya kod kapsamı analizinde kodu basitleştirin).

Bunun yanı sıra, / grafik analizinde çözülmesi imkansız birçok sorun olduğunu düşünüyorum (tüm yolları tekrar tekrar yürüterek bir ağ topolojisi belirlemeye çalışıyor).


0

Klasik örnek, HTML'yi normal ifadelerle ayrıştırmaya çalışıyor . Bu, sınırlı HTML kümeleriyle çalışabilir, ancak farklı Chomsky gramerlerine sahip oldukları için genel bir çözüm imkansızdır (bağlantı açıkça belirtildiği gibi (ish)).

Daha genel olarak bazı insanlar felsefi düşünmeyi sevmezler (iş arkadaşınız gibi) ve bir zihin setinden çıkış yolunuzu tartışabileceğinizden emin değilim. İlk noktası kesinlikle yanlış ama ikincisi sadece mal almak için web formlarını kodlamak için bu konuda endişelenmenize gerek olmadığını söylemenin bir yolu olabilir. Buna biraz sempati duyuyorum ama bazen teoriyi bilmek, Kutsal Kâse'yi çalışma zamanında bulmaya kendini adamadığın anlamına geliyor.


-6

Belki de cevap, iş arkadaşınızın doğru olmasıdır. Belki Turing'i yanlış anladınız, ya da burada nasıl uygulanır?

Tüm makineler sonludur, bu nedenle 'gerçek' Turing makineleri ve asla durmayacak programlar yoktur. Basit bir sonsuz döngü yürüten önemsiz bir program 5 dakika veya 50 yıl çalışabilir, ancak sonlu bir makinede durur. 'Pi'yi tam olarak hesapla' gibi önemsiz, durmayan bir sorun da durdurulacaktır, çünkü sonunda hesaplama daha fazla basamak saklama kapasitesini aşacaktır.

Turing sonucu, sonlu makinelerde özellikle yararlı olan hiçbir şeyi garanti etmez, bu nedenle göreviniz sonuçta meyvesizdir. Matematikçilere ne kadar zaman ve ne kadar para ve sonsuzluk bırakmaya odaklanmak daha iyidir.

Gibi bir programın { while true: print "running"; print "halted"; }bir karşı örnek olduğunu düşünebilirsiniz, ama değil. Bu programın durmasına neden olan veya olmayan yan etkileri vardır. Yan etkileri göz ardı ederek, bu programın durmayacağına dair resmi bir kanıt hazırlamak mümkündür. Bu soruda, yalnızca durma sorununun kararsız olduğu resmi durma kanıtı olmayan programlarla ilgileniyoruz. Bu böyle bir program değil.

'Güçlü' Turing'i 'zayıf' Turing'den ayırt etmeye yardımcı olabilir. Güçlü Turing makineleri aslında sonsuzdur ve durmazlarsa sonsuz süre boyunca çalışırlar. Bunları inşa edemeyiz.

Zayıf Turing makinelerinin zaman ve mekan üzerinde sınırlı sınırları vardır ve bunlar yapabileceğimiz tek türdür. Bu sınırlar içinde durduğu kanıtlanamayan programlarla ilgileniyoruz. Turing bize böyle programlar olduğunu söyler ama onları tanımlayamayız. Sınırlar yeterince düşükse programı yazıp sınırlarına kadar çalıştırarak tanımlayabiliriz.

Turing'in özü, kısayol olmamasıdır. Bir sorunun hesaplamalı olarak uygulanabilir olup olmadığından emin olmanın tek yolu programı yazmak, çalıştırmak ve bulmaktır. Yeterli zaman ve para ile tüm programları yazabilir, sonsuza kadar ve zaman içinde çalıştırabilir ve sonuç üreten programları bulabilirsiniz (yular). Diğerleri hala çalışıyor olacak. İş arkadaşınızın bunu yapmak için yeterli zamanı ve parası var mı?

Cidden, anlaşmazlık sınırlarla ilgili. Turing ve NP tamamlandı, belirli bütçe sınıflarındaki veya belirli bir programdaki bilgisayarlar tarafından belirli bütçe sınıflarının ne kadar büyük veya program ne kadar cömert olursa olsun çözülemeyeceğini bize söyler. Bu tür problemlerin örnekleri bol: kriptografik anahtarları kırmak; yüzlerce adrese teslimat yapmak için rotaların optimize edilmesi; kamyonlarda ambalaj kutuları; büyük programlarda hata bulma!

Bu nedenle iş arkadaşınızdan bir bütçe ve bir program isteyin ve bu bütçe veya program dahilinde çözülemeyen bir sorun üretebileceğiniz konusunda söz verin. Bu sözün tutulması çok kolay olacak.


2
Durma probleminin özü, sonsuz zaman ve parayla bile, asla hesaplanamayan problem sınıflarının olmasıdır. İş arkadaşım bunu kabul etmeyi reddediyor.
Jesan Fafon

Sonra aynı fikirde değiliz. Cevabımı düzenledim, ama aslında mesaj aynı. Posed olarak sorunuzun bir cevabı yoktur (ya da hoşunuza gidecek bir cevap yoktur), ancak bunun altında yatan gerçek bir konudur ve yapılması gereken gerçek bir noktadır. Eğer bu argümanı kazanmak istiyorsan, bir şekilde yer değiştirmelisin ve bunu yaparken biraz yardım sağlamaya çalıştım. [Bu gibi soruları tekrar cevaplamamaya hatırlat - olumsuz oylar hoş karşılanmadı.]
david.pfx

2
@simon: Kendimi tekrarlama riski altında, tamamlanması için sonsuz zaman alan hiçbir program yok çünkü Turing tam bilgisayarları yok, sadece sonlu yaklaşımlar var. Rastgele bir programın, programı gerçekten çalıştırmaktan daha hızlı olan herhangi bir yöntemle belirli bir sürede tamamlanacağını kanıtlayamazsınız. Uygulamada, içinde 'sonsuz' kelimesi bulunan herhangi bir cümle hiçbir anlam ifade etmeme riski taşır.
david.pfx

3
while True: print "doing stuff"; print "Finished"; Bu, bitmesi sonsuz zaman alan bir program örneğidir. Tamamlanması için sonsuz zaman alan başka programlar da sınırsızdır. Düzenli olarak amacına ulaşmak için sonsuz zaman alan programlar oluştururuz. Bunlara 'uzun süren süreçler' denir. Çoğu dinamik web sitesi bunlara örnektir.
Singletoned

2
Mesele şu ki, etkili bir şekilde sonsuz olan bilgisayar programları var, asla kendi buharları altında durmayacaklar (mola vereceğiz, sonunda gücü çekeceğiz vb.), Eğer onları bir Turing makinesine programlasaydık durmadan koş. Durma probleminin özü, durmak bilmeyen programları algoritmik olarak belirlemenin pratik veya teorik olarak bir yolu yoktur.
Alistair Mackenzie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.