Apa contoh masalah bisnis yang mustahil secara komputasi?

17

Saya memiliki rekan kerja yang menolak untuk menerima kenyataan bahwa mesin Turing (dan mesin Von Neuman dengan ekstensi) tidak dapat memecahkan masalah mereka sendiri yang menyatakan:

Anda dapat melakukan apa saja dengan cukup waktu dan uang.

Dia juga tidak suka masalah teoritis dengan alasan bahwa:

Di bidang kami, kami tidak akan pernah mengalami pertanyaan itu. Kami pengembang aplikasi, bukan ilmuwan teoretis.

Apakah ada contoh yang baik dari masalah bisnis yang secara komputasi tidak mungkin saya dapat gunakan untuk membantu meyakinkannya tentang hal ini?

Jesan Fafon
sumber
11
Anda tidak dapat menunjukkan dengan contoh bahwa ada sesuatu yang tidak mungkin. Rekan kerja Anda hanya akan mengatakan "Itu tidak berhasil karena kami belum menemukan pendekatan yang benar". Yang terbaik yang bisa Anda lakukan adalah menunjukkan kepadanya bukti. Jika dia tidak membelinya, dia benar-benar bodoh atau bodoh atau keduanya. Berikut daftar masalah yang belum diputuskan: en.wikipedia.org/wiki/List_of_undecidable_problems
Thomas Eding
18
Seorang ahli teori dan insinyur diberitahu bahwa mereka dapat mencium seorang gadis dengan berulang kali menempuh jarak antara mereka dan dia sampai setengahnya. Ahli teori itu langsung menyerah mengatakan "tidak mungkin, aku tidak akan pernah sampai di sana". Insinyur itu mengatakan, "Saya akan cukup dekat untuk tujuan praktis". Anda, tuan, perlu mencoba ciuman itu.
gbjbaanb
2
@ gbjbaanb: Itu adalah deskripsi yang baik dari banyak solusi tidak optimal untuk masalah NP-hard, dan mengetahui masalah-masalah itu (secara praktis) tidak mungkin untuk diselesaikan secara klasik adalah mengapa Anda memilih metode alternatif. Jika Anda tidak menerima bahwa beberapa masalah praktis atau secara harfiah tidak mungkin untuk dipecahkan maka Anda tidak akan mencari solusi yang tidak sempurna yang dapat memberikan jawaban "cukup baik" setelah periode waktu yang tidak dapat ditentukan.
Phoshi
3
@ Phoshi tidak, intinya adalah bahwa solusi rekayasa dunia nyata hanya membutuhkan solusi yang cukup baik untuk menyelesaikan masalah yang cukup untuk diterima. Memecahkannya dengan sempurna tidak sebanding dengan waktu dan biaya. misalnya. Perjalanan penjual masalah tidak mungkin diberikan lebih dari beberapa node, tetapi solusi yang kurang optimal masih diperlukan (dan disampaikan) oleh banyak bisnis. Jika kita hanya menghasilkan kesempurnaan, tidak ada yang akan memilikinya.
gbjbaanb
10
@ gbjbaanb: Benar, tetapi satu-satunya alasan mereka memecahkan masalah tersebut adalah dengan terlebih dahulu menerima bahwa Anda tidak dapat "melakukan apa pun dengan cukup waktu dan uang" dan berhenti mengejar solusi optimal. Pengetahuan tentang apa yang tidak dapat Anda lakukan seringkali sama pentingnya untuk menemukan solusi sebagaimana pengetahuan tentang apa yang dapat Anda lakukan.
Phoshi

Jawaban:

11

Secara teknis tidak mungkin, tapi ...

Sumber daya penjadwalan , dengan tujuan menemukan jadwal ideal yang memaksimalkan penggunaan slot waktu. Saya pernah mengerjakan sebuah proyek, pada hari-hari komputasi saya sebelumnya, yang memiliki persyaratan ini. Saya mengerjakannya beberapa saat sebelum saya menyadari bahwa itu NP-keras.

Contoh masalah lain yang secara teknis tidak mungkin, tetapi secara teknis sulit, dapat ditemukan di sini .

Sebagian besar masalah komputasi yang sulit dalam komputasi bisnis bukan tidak mungkin, hanya tidak praktis. Temanmu benar; Anda dapat memecahkan sebagian besar dari mereka jika Anda memberikan cukup uang kepada mereka. Namun argumen itu tidak masuk akal; Inti menjalankan bisnis adalah menghasilkan uang, bukan kehilangannya.

Dalam praktik sehari-hari, kita berbicara tentang kelengkapan Turing dengan cara yang tidak jelas, bukan untuk menunjukkan beberapa prinsip matematika, tetapi untuk mengilustrasikan (misalnya) ketidakcukupan HTML dan CSS sebagai sarana lengkap untuk memproduksi program fitur-lengkap.

Demikian pula, Masalah Pemutusan penting bagi ahli teori, tetapi tidak memiliki banyak relevansi dengan sebagian besar bisnis.

Robert Harvey
sumber
14
Masalah penghentian muncul dalam analisis kode statis. Dari sini Anda bisa mendapatkan masalah duniawi seperti "ini beberapa kode, buat terlihat cantik" hingga "ada beberapa kode, apakah ini malware" - yang pertama adalah bisnis yang penting bagi perusahaan yang membuat IDE (penyorotan sintaks, refactoring), yang kedua adalah perusahaan anti-virus dan profesional keamanan.
12
"Demikian pula, Masalah Pemutusan penting bagi ahli teori, tetapi tidak memiliki banyak relevansi dengan sebagian besar bisnis.": Nah, jika masalah penghentian dapat dihitung, kita dapat secara otomatis memeriksa apakah suatu perangkat lunak akan berakhir / bertahan input tertentu atau tidak. Kami mungkin tidak memiliki BSOD lagi. Karena ini tidak mungkin, kami harus menggunakan teknik lain untuk memastikan kualitas perangkat lunak (seperti pengujian) dan tidak ada yang menginvestasikan waktu dan uang untuk mengembangkan program "pemeriksaan penghentian" umum. Jadi saya pikir hasil teoretis ini memiliki relevansi praktis yang sangat besar.
Giorgio
4

Yang lain mengomentari ini, tetapi saya akan mencoba menuliskan jawaban yang memberikan sudut pandang saya.

Saya suka Robert Harvey menjawab, dan komentar untuk jawabannya, dan saya ingin memperluas itu.

Saya pikir Anda harus menyajikan masalah yang tidak dapat dipastikan ini (seperti pemutusan hubungan kerja) dengan cara biasa: misalnya, alat IDE yang "memeriksa apakah fungsi ini selalu mengembalikan nilai".

Saat mengajar, contoh favorit saya adalah refactoring ( kesetaraan fungsi, masalah lain yang tidak dapat dipastikan ). Saya bertanya:

bagaimana Anda memeriksa apakah suatu fungsi / program melakukan hal yang sama setelah Anda refactoring bagus? Tentu, kami memiliki unit test untuk itu, tetapi mereka tidak mencakup semua kasing. Dan mereka bosan menulis ... Tapi kita adalah programmer! Kita harus menulis sebuah program yang memeriksa apakah kedua fungsi ini menghasilkan hasil yang selalu sama! Mengapa Anda tidak mencoba menulisnya?

atau, sebagai variasi, mungkin lebih dekat dengan kasus Anda:

Kami memiliki kode warisan ini ditulis dalam dialek COBOL kuno yang tidak diketahui, yang tidak memiliki spesifikasi dan / atau kompiler. Kami hanya punya program. Seluruh bisnis kami bergantung padanya, jadi kami harus 100% yakin kode Java yang baru melakukan hal yang persis sama dalam setiap situasi. Manajemen menginginkan program yang melakukan itu, memeriksa semua kasus yang mungkin, dan memperkirakannya dapat dilakukan dalam 6 hingga 8 minggu. Mengapa Anda tidak mencoba menulisnya?

Intinya bukan untuk menulis program seperti itu. Atau perkiraan yang cukup baik dari persyaratan. Intinya adalah untuk menyadari bahwa itu TIDAK dapat dilakukan dengan cara langsung, JANGAN sia-siakan usaha kita untuk mencari cara melakukannya (hanya untuk menyadari bahwa itu tidak mungkin), tetapi kenali itu. "Ah! Ini tidak bisa dipastikan! Tidak mungkin melakukannya secara langsung. Aku harus mencari cara lain yang lebih pintar untuk melakukannya, dengan perkiraan yang cukup baik".

Anda harus mencari cara untuk menyajikan masalah dengan cara yang mudah dikenali, dan tampaknya sederhana. Anda tidak akan percaya berapa banyak siswa CS yang akan mencoba untuk menulis program seperti itu secara langsung ... sebelum mengambil kelas komputasi :)

Lorenzo Dematté
sumber
Kutipan kedua Anda mencoba untuk memunculkan masalah penghentian secara salah; namun jika kita tahu program COBOL bekerja dan dapat menjalankannya dalam lingkungan pengujian (vm-klon semua PROD jika perlu) masalah penghentian dikecualikan dan kita dapat mencoba. Mungkin dengan tangan daripada dengan program tetapi semua sama kita bisa melakukannya. Kita bisa membagi dua bentuk input yang mungkin jika perlu. Karena program target terhenti, maka pohon akan membagi dua.
Joshua
2

Dengan asumsi kita dapat mengesampingkan pertanyaan moral untuk saat ini:

Bisnis A telah mengontrak Anda untuk cara berkomunikasi antara kantor satelit A1 dan A2 tanpa siapa pun selain orang yang berwenang di A1 dan A2 yang dapat memahami komunikasi tersebut.

Bisnis B telah mengontrak Anda untuk cara menguping secara cerdas semua komunikasi antara A1 dan A2.

Jelas Anda tidak bisa melakukan keduanya.

Karena cara matematika bekerja (matematika yang tepat telah menjadi subjek penelitian yang sedang berlangsung selama 100 tahun), salah satu dari persyaratan berikut tidak dapat dipenuhi:

(1): Memberikan algoritma enkripsi yang tidak dapat dipecah oleh penyerang dengan jumlah uang sewenang-wenang yang tersedia.

(2): Menyediakan algoritma pemecahan enkripsi untuk algoritma enkripsi sewenang-wenang yang berjalan dalam waktu yang wajar.

Joshua
sumber
1
(3): Gagal mendapatkan pekerjaan lain setelah pasar mengetahui Anda bahkan mencoba keduanya
TruthOf42
1

Saya baru saja mengambil kelas tentang Model Proses Bisnis dan Notasi ( BPMN ). Di sana dapat dengan mudah dilihat bahwa alur kerja dengan terlalu banyak pemisahan, sambungan, dan putaran menjadi cepat tidak praktis (meskipun tidak selalu mustahil , AFAIK) untuk dipahami dan dikendalikan, (ketika Anda menggunakan terlalu banyak OR-split bukannya XOR-splits).

Untuk industri perangkat lunak, saya pikir hal yang sama berlaku untuk masalah serupa "cakupan beberapa kondisi" dalam analisis cakupan kode .

Untuk bisnis, cara yang harus ditempuh adalah mengecilkan ruang masalah, dan tidak membuang lebih banyak sumber daya pada masalah yang kompleks. Dalam contoh saya, tambahkan kendala pada alur kerja, (atau dalam analisis cakupan kode, sederhanakan kode), alih-alih bekerja keras untuk menemukan semua, katakanlah, N jejak yang mungkin dan hasil di mana N adalah jumlah yang sangat besar.

Selain itu saya pikir ada banyak masalah dalam analisis jaringan / grafik yang tidak mungkin untuk dipecahkan (mencoba menentukan topologi jaringan dengan secara iteratif berjalan di semua jalur dll).

knb
sumber
0

Contoh klasik sedang mencoba mem - parsing HTML dengan ekspresi reguler . Ini dapat bekerja dengan himpunan HTML terbatas tetapi solusi umum tidak mungkin, karena fakta bahwa mereka memiliki tata bahasa Chomsky yang berbeda (karena tautannya memperjelas (ish)).

Secara umum, beberapa orang tidak suka berpikir secara filosofis (seperti rekan kerja Anda) dan saya tidak yakin Anda bisa membantah jalan keluar dari pola pikir Anda. Poin pertamanya jelas salah, tetapi yang kedua mungkin hanya cara mengatakan saya tidak perlu khawatir tentang hal ini untuk kode formulir web untuk barang yang diterima. Saya punya simpati dengan ini, tetapi kadang-kadang mengetahui teorinya berarti Anda tidak berkomitmen untuk menemukan Holy Grail di waktu kerja.

Alistair Mackenzie
sumber
-6

Mungkin jawabannya adalah rekan kerja Anda benar. Mungkin Anda salah mengerti Turing, atau bagaimana penerapannya di sini?

Semua mesin terbatas, oleh karena itu tidak ada mesin Turing 'nyata' dan tidak ada program yang tidak akan pernah berhenti. Program sepele yang mengeksekusi loop infinite sederhana dapat berjalan 5 menit atau 50 tahun tetapi pada mesin yang terbatas itu akan berhenti. Masalah non-sepele yang non-sepele seperti 'menghitung pi dengan tepat' juga akan berhenti, karena pada akhirnya perhitungan akan melebihi kapasitas untuk menyimpan angka lebih lanjut.

Hasil Turing tidak menjamin apa pun yang sangat berguna pada mesin yang terbatas, sehingga pencarian Anda pada akhirnya tidak membuahkan hasil. Lebih baik fokus pada berapa banyak waktu dan berapa banyak uang dan biarkan tak terhingga bagi para matematikawan.

Anda mungkin berpikir bahwa program seperti { while true: print "running"; print "halted"; }adalah contoh tandingan tetapi tidak. Program ini memiliki efek samping, yang mungkin atau tidak dapat menghentikannya. Mengabaikan efek samping, adalah mungkin untuk menemukan bukti formal bahwa program ini tidak akan berhenti. Dalam pertanyaan ini kami hanya memusatkan perhatian pada program-program yang menghindari bukti formal tidak berhenti, di mana pertanyaan berhenti tidak dapat diputuskan. Ini bukan program seperti itu.

Mungkin membantu membedakan Turing 'kuat' dari Turing 'lemah'. Mesin Turing yang kuat sebenarnya tak terbatas dan jika gagal berhenti, akan berjalan untuk waktu yang tak terbatas. Kita tidak bisa membangun itu.

Mesin Turing yang lemah memiliki batas waktu dan ruang yang terbatas, dan mereka adalah satu-satunya jenis yang dapat kita bangun. Kami tertarik pada program yang tidak dapat dibuktikan berhenti dalam batas-batas itu. Turing memberi tahu kami bahwa ada program semacam itu tetapi kami tidak dapat mengidentifikasi mereka. Jika batasnya cukup rendah, kami dapat mengidentifikasinya dengan menulis program dan menjalankannya hingga batasnya.

Inti dari Turing adalah tidak ada jalan pintas. Satu-satunya cara untuk memastikan apakah suatu masalah layak secara komputasi adalah dengan menulis program, menjalankannya, dan mencari tahu. Dengan waktu dan uang yang cukup, Anda dapat menulis semua program, menjalankannya selamanya dan seiring waktu, dan menemukan program yang menghasilkan hasil (penghalang). Yang lain masih akan berjalan. Apakah Anda rekan kerja punya cukup waktu dan uang untuk melakukan itu?

Namun serius, perselisihan adalah tentang batasan. Turing dan NP selesai memberi tahu kami bahwa kelas masalah tertentu tidak dapat diselesaikan oleh komputer dalam anggaran apa pun atau pada jadwal apa pun, tidak peduli seberapa besar anggaran itu atau seberapa murahnya jadwal itu. Contoh-contoh masalah semacam itu berlimpah: putus kunci kriptografi; mengoptimalkan rute untuk melakukan pengiriman ke ratusan alamat; kotak kemasan di truk; menemukan bug dalam program besar!

Jadi mintalah rekan kerja Anda anggaran dan jadwal, dan buat janji bahwa Anda dapat menghasilkan masalah yang tidak dapat diselesaikan dalam anggaran atau jadwal itu. Janji itu akan sangat mudah untuk ditepati.

david.pfx
sumber
2
Inti dari masalah penghentian adalah bahwa ada kelas masalah yang tidak dapat dihitung, bahkan dengan waktu dan uang yang tidak terbatas. Itulah yang ditolak oleh rekan kerja saya.
Jesan Fafon
Lalu kami tidak setuju. Saya sudah mengedit jawaban saya, tetapi pada dasarnya pesannya sama. Pertanyaan Anda yang diajukan tidak memiliki jawaban (atau tidak yang Anda sukai), tetapi yang mendasarinya adalah masalah nyata dan poin nyata yang harus dibuat. Jika Anda ingin memenangkan argumen ini, Anda harus bergeser sedikit, dan saya sudah mencoba memberikan bantuan dalam melakukan itu. [Ingatkan saya untuk tidak mencoba menjawab pertanyaan seperti ini lagi - suara negatif tidak diterima.]
david.pfx
2
@simon: Dengan risiko berulang, tidak ada program yang membutuhkan waktu tak terbatas untuk diselesaikan karena tidak ada komputer lengkap Turing, hanya perkiraan yang terbatas untuk mereka. Anda tidak dapat membuktikan bahwa program sewenang-wenang akan selesai dalam jumlah waktu tertentu dengan metode apa pun yang lebih cepat daripada benar-benar menjalankan program. Dalam praktiknya, kalimat apa pun dengan kata 'tak terbatas' di dalamnya berisiko tidak masuk akal.
david.pfx
3
while True: print "doing stuff"; print "Finished"; Itu adalah contoh program yang membutuhkan waktu tak terbatas untuk menyelesaikannya. Ada jumlah tak terbatas dari program lain yang juga membutuhkan waktu tak terbatas untuk menyelesaikannya. Kami secara teratur membuat program yang membutuhkan waktu tak terbatas untuk menyelesaikannya dengan sengaja. Mereka disebut 'proses yang berjalan lama'. Sebagian besar situs web dinamis adalah contohnya.
Singletoned
2
Intinya adalah pasti bahwa ada set program komputer yang efektif tak terbatas, mereka tidak akan pernah berhenti di bawah uap mereka sendiri (kami akan menekan istirahat, mengeluarkan daya dll akhirnya), jika kami memprogram mereka ke dalam mesin Turing itu akan lari tanpa henti. Inti dari masalah penghentian adalah tidak ada cara praktis atau teoritis untuk menentukan program yang tidak berhenti sama sekali secara algoritmik.
Alistair Mackenzie