มีทฤษฎีที่จะตอบว่า "โปรแกรมที่ง่ายที่สุดในการแก้ปัญหา" หรือไม่?


10

เพื่อตอบ "ปัญหาที่สามารถแก้ไขได้ด้วยการคำนวณ" เราได้พัฒนาทฤษฎีการคำนวณ สำหรับปัญหาที่คำนวณได้มีทฤษฎีที่จะตอบคำถามที่ว่า "เป็นโปรแกรมที่ฉันได้ง่ายที่สุด" หรือไม่?

ฉันไม่คิดว่าความซับซ้อนในการคำนวณตอบคำถาม ฉันคิดว่ามันจะพิจารณาระยะเวลาที่เราต้องการ (แม้ว่าวัดเป็นนามธรรม)

ฉันไม่แน่ใจว่าทฤษฎีข้อมูลอัลกอริทึมตอบคำถามหรือไม่ ดูเหมือนว่าทฤษฏีพูดถึงเรื่องขนาดซึ่งการเทียบขนาดเล็กและเรียบง่ายที่สุดนั้นไม่ชัดเจนสำหรับฉัน (อย่างน้อยพวกเขาก็รู้สึกแตกต่างจากฉัน)

ฉันคิดว่าอย่างน้อยทฤษฎีควรนิยามความสัมพันธ์ "ง่าย" หรือ "ง่ายกว่า"


ตอนนี้ฉันเชื่อแล้วว่าฉันควรจะดู Kolmogorov Complexity อย่างไรก็ตามฉันต้องการอธิบายสิ่งที่อยู่ในใจของฉันเมื่อฉันถามคำถาม

เมื่อฉันปรับปรุงโปรแกรมฉันพยายามลดการเชื่อมต่อที่ไม่จำเป็นระหว่างส่วนต่าง ๆ ของโปรแกรม (อาจแบ่งส่วนใหม่เพื่อให้มีการเชื่อมต่อน้อยลงหรืออ่อนแอลง) เนื่องจากการเชื่อมต่อลดลงโปรแกรมจึงรู้สึกว่า "เรียบง่าย" ดังนั้นการเลือกคำว่า "เรียบง่าย" เมื่อฉันใช้คำถาม มีโอกาสมากที่ขนาดของโปรแกรมจะลดลง แต่นั่นเป็นผลข้างเคียงที่ดีไม่ใช่เป้าหมายหลัก เห็นได้ชัดว่ากระบวนการปรับปรุงไม่สามารถดำเนินต่อไปได้ตลอดไป มีประเด็นที่ฉันควรหยุด ถ้าเพียงแค่พิจารณา "โครงสร้าง" (ขออภัยสำหรับแนวคิดที่ไม่ได้กำหนดไว้อื่น) หรือ "ความสัมพันธ์" ฉันสามารถโน้มน้าวตัวเองได้ว่าไม่มีอะไรที่จะทำได้อีกต่อไป?

ที่นี่มีคำอธิบายที่ดีกว่าของความคิดความซับซ้อนของฉัน

Olaf Sporns (2007) Complexity . Scholarpedia , 2 (10): 1623



4
คุณอาจสนใจแนวคิดของ Logistic Depth Li และ Vitanyi ได้อุทิศบทที่ 7.7 ในหนังสือของพวกเขาเกี่ยวกับ Kolmogorov Complexity
Martin Schwarz

2
@YuNing: คุณหมายถึงอะไร "ง่ายที่สุด" ถ้าไม่ใช่ขนาด?
Rob

1
@Yu Ning: ถ้าอย่างนั้นแทนที่จะเป็นโปรแกรมที่เล็กที่สุดในการสร้างผลผลิตมันเป็นเครื่องทัวริงที่มีความยาวขั้นต่ำคำอธิบายที่ดีที่สุด - เพื่อให้มีความสมดุลระหว่าง 'smallness' และ 'structure'?
Ross Snider

3
ฉันคิดว่าคำถามนั้นไม่ชัดเจน โปรดทราบว่ามีอัลกอริทึมที่ง่ายมาก แต่ก็ยากที่จะพิสูจน์ว่าถูกต้อง และมีอัลกอริธึมที่เรียบง่ายและถูกต้อง แต่ก็ยากที่จะพิสูจน์ว่ามันรวดเร็ว
Jukka Suomela

คำตอบ:


16

ปัญหานี้มีการศึกษาในทฤษฎีข้อมูลอัลกอริทึม สิ่งที่คุณกำหนดคือความซับซ้อนของ Kolmogorov-Chaitin

http://en.wikipedia.org/wiki/Kolmogorov_complexity

และดูเหมือนว่าความคิดเรื่องความเรียบง่ายที่คุณต้องการนั้นสามารถทำให้เป็นทางการผ่านแนวคิดเรื่องความซับซ้อนซึ่งเป็นรูปธรรมโดยหลักการของ Blum

http://en.wikipedia.org/wiki/Blum_axioms

ดูเหมือนว่ายังมีความเป็นไปได้ที่จะสรุปความซับซ้อนของ Kolmogorov ที่จะใช้มาตรการความซับซ้อนอื่น ๆ ในการพิจารณา ดูการอ้างอิงด้านล่าง (บทความของ Wikipedia เกี่ยวกับความซับซ้อนของ Kolmogorov แก้ไขปัญหานี้)

Burgin1990- ความซับซ้อน kolmogorov ทั่วไปและมาตรการความซับซ้อนคู่อื่น ๆ Cybernetics และการวิเคราะห์ระบบเล่มที่ 26, หมายเลข 4, 481-490


@Jukka Suomela พูดว่าคำถามดังกล่าวไม่ชัดเจน ดังนั้นฉันสงสัยว่าฉันจะได้รับคำตอบที่สมบูรณ์สำหรับคำถามนั้น อย่างไรก็ตามเนื่องจากคำตอบนี้ค่อนข้างให้ข้อมูลและมีส่วนสำคัญในคำถามจึงยังคงแท็กเป็นคำตอบ
Yuning

โดยวิธีการที่คุณสามารถชี้ให้ฉันเพิ่มเติมเกี่ยวกับการประยุกต์ใช้หัวข้อโดยเฉพาะถ้ามีข้อกำหนดอย่างเป็นทางการของโปรแกรมเธอสามารถหาขนาดที่เล็กที่สุดจากข้อกำหนดได้หรือไม่
Yuning

1

คำตอบสำหรับคำถามแรกคือใช่มีทฤษฎีเป็นทฤษฎีข้อมูลอัลกอริทึมและที่เรียกว่า Elegant Programs (โดย Gregory Chaitin)

สำหรับคำถามที่สองเกี่ยวกับ "โปรแกรมที่ฉันได้รับง่ายที่สุด" คืออะไร?

ไม่มีคำตอบเนื่องจากเป็นคำถามที่ไม่สามารถคำนวณได้จึงไม่สามารถพิสูจน์ได้ว่าโปรแกรมเป็นโปรแกรม Elegant

ฉันได้ใส่คำตอบที่จะเพิ่มการพูดถึงเกี่ยวกับโปรแกรมที่สง่างาม


-1

มีวิธีการที่แตกต่างกันในการตัดสินใจว่าอะไรคือรหัสที่เรียบง่ายและอะไรที่ไม่ใช่

แต่น่าเศร้าที่ไม่มีวิธีอัตโนมัติในการพิจารณาตัวอย่างเช่น Kolmogorov Complexity ล้มเหลวด้วยฟังก์ชั่นแบบเรียกซ้ำบางฟังก์ชันแบบเรียกซ้ำ (ตรรกะลึก) นั้นเรียบง่าย แต่ความเข้าใจเกี่ยวกับมันไม่ง่ายนัก

จากประสบการณ์ของฉันทีมงานของเราทำงานในระบบและเราพบกระบวนการ "ง่าย" ใน Oracle (ไม่เกิน 50 บรรทัด) ... และเราพยายามที่จะเข้าใจมันใช้เวลา 2 เดือน (และการประชุมหลายครั้ง) เพื่อทำความเข้าใจอย่างเต็มที่ ไม่ใช่โดยความซับซ้อนของโค้ด แต่อยู่ในตรรกะหลังตัวแปรทุกตัว

ฉันคิดว่าวิธีการกำหนดรหัสง่าย ๆ คือ: "อ่านรหัสและพิจารณาเวลาที่ใช้ในการทำความเข้าใจ"

ดังนั้น "โปรแกรมที่ง่ายที่สุดในการแก้ปัญหา?" สามารถแบ่งออกเป็น:

a) ความเรียบง่ายของรหัส (รหัสที่ชัดเจน) แต่มันเป็นอัตวิสัยเกินไป

b) ความซับซ้อนของฟังก์ชั่นถ้าฉันมีปัญหา X แล้วฉันจะต้องแก้งาน DX (Delta X) เพื่อแก้มันโดยที่ DX ต้องมีแนวโน้มเป็น X

ตัวอย่างเช่นหากปัญหาของฉันคือ (หนึ่ง) "เพื่อปอกแอปเปิ้ล" และฉันต้องทำใน PHP (และภาษา) แล้ว

ถ้าฉันโชคดีมากและ PHP มีฟังก์ชั่น function_peel_apple () มันเป็นโค้ดที่ง่ายที่สุดเท่าที่เคยมีมา X = 1 DX = 1 เพียงแค่เรียกใช้ฟังก์ชั่นแล้วก็แค่นั้นแหละ!

ตรงกันข้ามถ้าฉันไม่โชคดี แต่มี function_peel () และ function_get_apple () แล้ว X = 1 (หนึ่งปัญหา) และ DX = 2 (สองงาน)

หากในกรณีที่เลวร้ายที่สุดไม่มีฟังก์ชั่นใด ๆ ฉันต้องสร้างหนึ่ง (หรือมากกว่าหนึ่ง) ด้วยตัวเองและมันเพิ่มงานหลายอย่างก่อนที่จะแก้ปัญหาตอนนี้มันเป็นโปรแกรมที่ซับซ้อน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.