FP สำหรับการจำลองและการสร้างแบบจำลอง


12

ฉันกำลังจะเริ่มโครงการจำลองสถานการณ์ / การสร้างแบบจำลอง ฉันรู้อยู่แล้วว่า OOP ใช้สำหรับโครงการประเภทนี้ อย่างไรก็ตามการเรียน Haskell ทำให้ฉันพิจารณาใช้กระบวนทัศน์ของ FP สำหรับการสร้างแบบจำลองระบบของส่วนประกอบ ให้ฉันทำอย่างละเอียด:

สมมติว่าฉันมีองค์ประกอบประเภท A ซึ่งมีลักษณะเป็นชุดข้อมูล (พารามิเตอร์เช่นอุณหภูมิหรือความดัน PDE และเงื่อนไขขอบเขต ฯลฯ ) และส่วนประกอบประเภท B ซึ่งมีชุดข้อมูลแตกต่างกัน (แตกต่างกัน หรือพารามิเตอร์เดียวกัน PDE และเงื่อนไขขอบเขตที่แตกต่างกัน) สมมติว่าฟังก์ชั่น / วิธีการที่จะนำไปใช้กับแต่ละองค์ประกอบเหมือนกัน (ตัวอย่างวิธี Galerkin) สถานะที่ไม่แน่นอนของวัตถุจะถูกใช้สำหรับพารามิเตอร์ที่ไม่คงที่

ถ้าฉันจะใช้วิธีการของ OOP ฉันจะสร้างวัตถุสองชนิดที่จะห่อหุ้มข้อมูลของแต่ละประเภทวิธีการในการแก้ไข PDE (การสืบทอดจะใช้ที่นี่เพื่อนำโค้ดกลับมาใช้ใหม่) และวิธีแก้ปัญหากับ PDE

ในทางตรงกันข้ามถ้าฉันจะใช้วิธีการ FP แต่ละองค์ประกอบจะถูกแบ่งออกเป็นส่วนข้อมูลและฟังก์ชั่นที่จะดำเนินการกับข้อมูลเพื่อให้ได้โซลูชั่นสำหรับ PDE พารามิเตอร์ที่ไม่คงที่จะถูกส่งผ่านเป็นฟังก์ชั่นของอย่างอื่น (เวลาเช่น) หรือแสดงโดยความไม่แน่นอนบางอย่าง (การเลียนแบบความไม่แน่นอน ฯลฯ ) วิธีการนี้ดูเหมือนง่ายกว่าสำหรับฉันโดยสมมติว่าการดำเนินการเชิงเส้นบนข้อมูล

โดยสรุปแล้วการใช้วิธีการ FP จะง่ายกว่าและง่ายกว่าในการจัดการ (เพิ่มประเภทของส่วนประกอบหรือวิธีการใหม่ในการแก้ปัญหา pde) เมื่อเทียบกับ OOP หรือไม่

ฉันมาจากพื้นหลัง C ++ / Fortran รวมทั้งฉันไม่ใช่โปรแกรมเมอร์มืออาชีพดังนั้นแก้ไขสิ่งที่ฉันทำผิดให้ถูกต้อง

คำตอบ:


7

เป็นคำถามที่ดีฉันกำลังคิดถึงเส้นที่คล้ายกัน ในอดีตกระบวนทัศน์ OO เกิดขึ้นจากความจำเป็นในการจำลองด้วยคอมพิวเตอร์ - ดูประวัติของSimula - และแม้จะมีภาษา OO ยุคต้นเช่นSmalltalkถูกสร้างขึ้นโดยคนที่รู้ว่าสิ่งที่พวกเขากำลังทำ (เช่น Alan Kay) ตอนนี้ OO เป็นเนื้อหาที่ใช้เกิน นำในมากเกินไปซับซ้อนโดยไม่ได้ตั้งใจ

โดยทั่วไปโปรแกรมสไตล์ FP จะสั้นกว่าง่ายกว่าในการทดสอบและปรับเปลี่ยนได้ง่ายกว่าโปรแกรม OO ในขณะที่ Rob Harrop กล่าวไว้ในคำบรรยายของเขาIs the Future Functional? คุณจะไม่มีวันทำได้ง่ายกว่าฟังก์ชั่นและข้อมูล ทั้งสองแต่งอย่างไม่มีที่สิ้นสุดเพื่อสร้างสิ่งที่ต้องการ abstractions ดังนั้นวิธีหนึ่งในการตอบคำถามของคุณ (หรือฉันเพิ่งจะเรียกมันคืนกลับมา?) คือถามว่าอะไรคือฟังก์ชั่นระดับสูงสุดและอินพุทข้อมูลระดับสูงสุด -> เอาท์พุตข้อมูลเป็นอย่างไร จากนั้นคุณสามารถเริ่มฟังก์ชั่นและชนิดข้อมูล "อัลฟา" เหล่านั้นลงในเลเยอร์ถัดไปของ abstractions และทำซ้ำตามความจำเป็น

อีกมุมมองหนึ่ง (ไม่ใช่คำตอบ) สำหรับคำถามของคุณคือดูที่กระทู้นี้ (ข้อจำกัดความรับผิดชอบฉันเริ่มต้น) ใน StackOverflow คำตอบบางคำน่าสนใจมาก: /programming/3431654/how-does- การทำงานเขียนโปรแกรมใช้การจำลอง

ความคิดเห็นของฉันเอง ณ จุดนี้คือถ้าคุณไม่ทำแบบจำลองสถานการณ์ที่มีวัตถุที่ไม่ต่อเนื่องซึ่งมีปฏิสัมพันธ์ในรูปแบบที่แน่นอนเท่านั้น (เช่นแบบจำลองของเครือข่ายคอมพิวเตอร์) - และทำแผนที่โดยตรงกับความสามารถในการทำความสะอาด การผ่านกระบวนทัศน์ OO ภาษา - ง่ายกว่าที่จะไป FP โปรดทราบว่าแม้ในชุมชนเกมการเขียนโปรแกรม - ที่การจำลองมีความแพร่หลายและความต้องการด้านประสิทธิภาพเป็นสิ่งสำคัญยิ่งนักพัฒนาที่มีประสบการณ์กำลังเคลื่อนตัวออกจากกระบวนทัศน์ OO และ / หรือใช้ FP เพิ่มเติมเช่นดูการสนทนา HNนี้หรือความเห็นของ John Carmack บน FP


เป็นการดีที่รู้ว่าฉันไม่ใช่คนเดียวที่สงสัยเกี่ยวกับ OOP ในการจำลองและขอบคุณที่ตอบคำถามของฉัน! ฉันได้อ่านความคิดเห็นของ John Carmack เกี่ยวกับ FP และฉันคิดเกี่ยวกับการนำ FP มาใช้ใน C ++ (การคัดลอกวัตถุหรือรวบรวมอินพุตและส่งผ่านไปยังฟังก์ชัน) แต่แล้วอีกครั้งฉันไม่รู้ว่าฉันควรเริ่มโครงการด้วย C ++ แทนที่จะเป็นภาษา FP เช่น Haskell เนื่องจากด้าน FP มีอยู่แล้วและคุณแสดงความไม่แน่นอนเมื่อจำเป็นเท่านั้น คุณเคยใช้ Clojure หรือ FP ต่อไปโดยพิจารณาว่าคุณมีปัญหา / คำถามที่คล้ายกันหรือไม่
heaptobesquare

@heaptobesquare - ใช่ฉันได้พยายามอย่างต่อเนื่องในการ Clojure-fu ของฉันโดยมีเป้าหมายในการเขียนแบบจำลองในนั้น ยังไม่มีอะไรพร้อมที่จะแสดง แต่ฉันเห็นว่าไม่มีการจัดวางโชว์และการออกแบบของ Clojure นั้นใช้งานได้อย่างสวยงามเช่นคุณสามารถใช้ทรานแซคชัน / การกลายพันธุ์ได้ถ้าต้องการรวมถึงตัวแทนของมัน ในบางจุด (สัญญาเมื่อ) ฉันจะเขียนบทความในหัวข้อที่ ...
limist

ฉันดู Clojure แต่ฉันไม่สามารถพูดได้ว่าฉันชอบ S-expressions ฉันรู้ว่ามันใช้งานได้จริง (รหัสเสียงกระเพื่อมเป็นข้อมูล) แต่ง่ายต่อการใช้งานหรือไม่
heaptobesquare

@heaptobesquare - s-expressions / Lisp syntax เป็นเรื่องง่ายมากที่จะคุ้นเคย ก่อนเลือกบรรณาธิการที่ดี (Emacs หรือ vim การลงคะแนนของฉันคือ Emacs ดูdev.clojure.org/display/doc/Getting+Started+with+Emacs ) ที่มีโหมดสำหรับ Clojure รับหนังสือดีๆ (เช่น Programming Clojure ) และเริ่มแฮ็ค หลังจากผ่านไปไม่กี่สัปดาห์ไวยากรณ์จะจางหายไปเป็นพื้นหลังอย่างที่ควรจะเป็นซึ่งสอดคล้องกันอย่างสมบูรณ์แบบที่คุณจะนึกถึงบ่อยครั้งน้อยลงและเพิ่มวัฏจักรจิตสำหรับสิ่งที่สำคัญกว่า :)
limist

ฉันจะลองทำดู ความสม่ำเสมอของ Lisp นั้นน่าสนใจมาก
heaptobesquare

2

IMHO สำหรับงานที่มีความซับซ้อนพอสมควรเกือบทุกคำถาม "เป็นรูปแบบ FP หรือรูปแบบ OOP ทางเลือกที่ดีกว่า" ไม่สามารถตอบอย่างเป็นกลาง โดยทั่วไปแล้วในสถานการณ์เช่นนี้คำถามไม่ใช่ "ทั้ง FP หรือ OOP" แต่จะรวมส่วนที่ดีที่สุดของกระบวนทัศน์ทั้งสองเพื่อแก้ปัญหาของคุณได้อย่างไร

ปัญหาที่คุณได้คิดไว้ข้างต้นดูเหมือนจะเป็นปัญหาทางคณิตศาสตร์และฉันเดาได้ว่าคุณจะต้องใช้การดำเนินการของเมทริกซ์ OOP นั้นดีมากสำหรับการสร้างแบบจำลองชนิดข้อมูลนามธรรมและแคลคูลัสของเมทริกซ์สามารถนำไปใช้อย่างง่ายดายในฐานะ "วัตถุเมทริกซ์" ที่มีการดำเนินการเกี่ยวกับเมทริกซ์ การนำสิ่งนี้ไปใช้ในลักษณะที่การดำเนินการของเมทริกซ์ทั้งหมดเป็นส่วนหนึ่งของคลาสเมทริกซ์ช่วยให้คุณสามารถเก็บสิ่งต่าง ๆ เข้าด้วยกันซึ่งเป็นของร่วมกันดังนั้นการรักษาโครงสร้างโดยรวมที่ดี

ในทางตรงกันข้าม PDEs เป็นสมการในฟังก์ชั่นและวิธีการแก้ปัญหาอาจจะทำงานอีกครั้ง ดังนั้นการใช้วิธีการทำงานสำหรับ "ส่วนประกอบ" ประเภทนั้นอาจดูเป็นธรรมชาติที่นี่ ฟังก์ชั่นเหล่านั้นอาจมีพารามิเตอร์เมทริกซ์โดยแสดงตัวอย่างหนึ่งของวิธีรวม OOP และ FP อีกตัวอย่างหนึ่งคือการนำคลาสเมทริกซ์มาใช้ซึ่งใช้เครื่องมือการทำงานเพื่อแมปการดำเนินการบางอย่างกับทุกองค์ประกอบของเมทริกซ์ของคุณ ดังนั้นที่นี่เหมือนกันไม่ใช่ "OOP กับ FP" แต่ "OOP รวมกับ FP" ซึ่งให้ผลลัพธ์ที่ดีที่สุดแก่คุณ


ขอบคุณสำหรับคำตอบ! ดังนั้นถ้าฉันจะใช้ C ++ จะ encapsulating ข้อมูลเท่านั้น (นั่นคือพารามิเตอร์เงื่อนไขขอบเขตและ PDE ในรูปแบบเมทริกซ์) ขององค์ประกอบไปยังวัตถุและการกำหนดฟังก์ชั่น (แม้บางคนลำดับสูงกว่าในกรณีที่ พารามิเตอร์เป็นหน้าที่ของอย่างอื่น) นอกขอบเขตของวัตถุที่จะทำงานกับข้อมูลของวัตถุจะมีประสิทธิภาพ?
heaptobesquare

@heaptobesquare: โดยสุจริตฉันไม่สามารถบอกคุณได้ว่ามันจะมีประสิทธิภาพในกรณีของคุณ ลองดูสิคิดใหญ่เริ่มเล็ก เริ่มเขียนโปรแกรม "tracer code" ( artima.com/intv/tracer.html ) เพื่อค้นหาว่าอะไรทำงานได้ดีที่สุดและไม่ทำงาน และถ้าคุณเกิดสถานการณ์ที่คุณสังเกตเห็นว่ามีบางสิ่งที่ทำงานไม่ถูกต้อง
Doc Brown

Haskell มีไลบรารี่ของ Hmatrix ซึ่งเป็นการเชื่อมโยงกับไลบรารี BLAS / LAPACK และไวยากรณ์ที่ดีมากสำหรับมันซึ่งฉันจะเลือกใช้วิธี OOP เป็นการส่วนตัว
paul

@ พอล: ขอบคุณฉันจะดูแน่นอน! โดยทั่วไปแล้วห้องสมุด Haskell มีเนื้อหาที่สอดคล้องและอุดมไปด้วยหรือไม่? วิกิพูดเช่นนั้น แต่นี่เป็นความจริงหรือ
heaptobesquare

@heaptobesquare: ห้องสมุด Haskell เพียงแห่งเดียวที่ฉันคุ้นเคยคือ Parsec (ฉันใช้เพื่อเขียนแอสเซมเบลอร์) แต่ฉันชอบที่จะใช้มัน ฉันเพิ่งทำการสำรวจ GHCI ของ Hmatrix และการเชื่อมโยง Haskell OpenGL แต่พวกเขาดูดีมาก Hmatrix ดูเหมือนว่าจะกระชับพอ ๆ กับ MATLAB (ซึ่งฉันเคยใช้มาสักหน่อย) - ซึ่งทำขึ้นเพื่อสิ่งนั้นโดยเฉพาะ จากประสบการณ์ที่ จำกัด ของฉันห้องสมุดมีความสอดคล้องกัน - นี่เป็นเพราะ Haskell สร้างขึ้นจากการสร้างบล็อคง่ายๆจำนวนน้อย - และพวกเขาก็รวยเพราะ Haskeller ไม่ชอบทำสิ่งที่ธรรมดา :)
paul
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.