กลยุทธ์การเขียนโปรแกรมใดที่ฉันสามารถแก้ไขพารามิเตอร์อัลกอริทึมได้อย่างง่ายดาย


17

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

คำตอบ:


14

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

ระบบการกำหนดค่าของ PETSc ทำงานผ่านการรวมกันของการกำหนดค่าที่ผู้ใช้ระบุซึ่งจัดการโดยวัตถุตัวแก้ปัญหา (พร้อมรับและตั้งค่าแบบสอบถาม) และฐานข้อมูลตัวเลือก องค์ประกอบของการจำลองใด ๆ สามารถประกาศตัวเลือกการกำหนดค่าค่าเริ่มต้นและสถานที่ที่จะนำผลลัพธ์ วัตถุที่ซ้อนกันมีคำนำหน้าซึ่งสามารถประกอบได้เช่นวัตถุทุกชิ้นที่ต้องการการกำหนดค่าสามารถแก้ไขได้อย่างอิสระ ตัวเลือกสามารถอ่านได้จากบรรทัดคำสั่งสภาพแวดล้อมไฟล์กำหนดค่าหรือจากรหัส เมื่อมีการประกาศตัวเลือกจะมีการระบุสตริงช่วยเหลือและหน้าคนเพื่อให้-helpตัวเลือกนั้นเป็นที่เข้าใจได้และเพื่อให้สามารถเขียน GUI ที่เชื่อมโยงอย่างถูกต้องได้

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

การกำหนดค่าทั่วไปที่เรียกว่าผ่าน

PetscObjectOptionsBegin(object); /* object has prefix and descriptive string */
PetscOptionsReal("-ts_atol",                                      /* options database key */
                 "Absolute tolerance for local truncation error", /* long description */
                 "TSSetTolerances",                               /* function and man page on topic */
                  ts->atol,                                       /* current/default value *?
                  &ts->atol,                                      /* place to store value */
                  &option_set);                                   /* TRUE if the option was set */
PetscOptionsList("-ts_type","Time stepping method","TSSetType",TSList,
                 defaultType,typeName,sizeof typeName,&option_set);
TSAdaptSetFromOptions(ts->adapt);                                 /* configures adaptive controller method */
/* ... many others */
/* ... the following is only called from implicit implementations */
SNESSetFromOptions(ts->snes);                                     /* configure nonlinear solver. */
PetscOptionsEnd();

หมายเหตุ:

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

11

ฉันประสบปัญหานี้หลายครั้งเมื่อพัฒนารหัสจำลองของฉันเองตั้งแต่เริ่มต้น: พารามิเตอร์ใดควรอยู่ในไฟล์อินพุตซึ่งควรนำมาจากบรรทัดคำสั่ง ฯลฯ หลังจากทำการทดลองบางอย่างแล้วสิ่งต่อไปนี้จะมีประสิทธิภาพ (ไม่เป็นขั้นสูงเท่ากับ PETSc)

แทนที่จะเขียน 'โปรแกรม' การจำลองการทดลองฉันมีแนวโน้มมากกว่าที่จะเขียนแพ็คเกจ Python ที่มีฟังก์ชั่นและคลาสทั้งหมดที่จำเป็นในการเรียกใช้การจำลอง ไฟล์อินพุตดั้งเดิมจะถูกแทนที่ด้วยสคริปต์ Python ขนาดเล็กที่มีรหัส 5 ถึง 10 บรรทัด โดยทั่วไปบางบรรทัดจะเกี่ยวข้องกับการโหลดไฟล์ข้อมูลและระบุเอาต์พุต ส่วนอื่น ๆ นั้นเป็นคำแนะนำสำหรับการคำนวณจริง ค่าเริ่มต้นที่ดีสำหรับอาร์กิวเมนต์ที่เป็นตัวเลือกในแพ็คเกจ Python ช่วยให้ผู้เริ่มต้นสามารถใช้ไลบรารีสำหรับการจำลองอย่างง่ายในขณะที่ผู้ใช้ขั้นสูงยังคงสามารถเข้าถึงระฆังและนกหวีดทั้งหมดได้

ตัวอย่างบางส่วน:


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

xmonadใช้วิธีนี้ในการกำหนดค่าตัวจัดการหน้าต่างสำหรับ X
rcollyer

2

เป็นจุดแรกฉันจะทำอัลกอริทึมและซอฟต์แวร์ทั่วไปที่สุด ฉันเรียนรู้วิธีนี้อย่างหนัก

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

สิ่งนี้เกี่ยวข้องกับการทดสอบเพิ่มเติมตั้งแต่ต้นเนื่องจากคุณจะมีพารามิเตอร์มากขึ้นจากจุดเริ่มต้น แต่จะหมายความว่าคุณสามารถเล่นได้มากขึ้นด้วยอัลกอริทึมที่ศูนย์หรือต้นทุนต่ำมาก

ตัวอย่าง: อัลกอริทึมเกี่ยวข้องกับการคำนวณอินทิกรัลอินทิกรัลกับผลคูณของจุดของฟังก์ชันเวกเตอร์สองตัว อย่าคิดตั้งแต่ต้นขนาดเรขาคณิตและการแยกส่วนของพื้นผิวหากในอนาคตคุณอาจต้องการเปลี่ยนสิ่งนั้น สร้างฟังก์ชั่น dot-product สร้างพื้นผิวโดยทั่วไปให้มากที่สุดคำนวณอินทิกรัลแบบเป็นทางการ คุณสามารถทดสอบแต่ละฟังก์ชั่นที่คุณทำแยกกัน

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

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