ไลบรารี C ++ สำหรับการลดข้อ จำกัด แบบไม่เชิงเส้น


9

ขณะนี้ฉันกำลังพยายามแก้ไขปัญหาการลดข้อ จำกัด แบบไม่เชิงเส้นเนื่องจากมีการใช้งานในฟังก์ชัน "fmincon" ของ matlab ความคาดหวังของฉันคือลด (fun1, x0, uB, lB, fun2) โดยที่ x0 เป็นสถานะเริ่มต้น fun1 คือฟังก์ชั่นที่ต้องลดให้น้อยที่สุด uB เป็นขอบเขตด้านบน lB เป็นขอบเขตล่างและ fun2 เป็นฟังก์ชันที่ให้เวกเตอร์ / inequalities ตามที่อธิบายไว้ในhttp://www.mathworks.com/help/optim/ug/fmincon.htmlเป็นฟังก์ชั่น nonlcon เวกเตอร์เหล่านี้มีการเปลี่ยนแปลงผ่านการวนซ้ำเช่นกัน (พวกมันไม่ใช่เชิงเส้นขึ้นอยู่กับ x_n, การวนซ้ำ n-th ของเวกเตอร์การแก้ปัญหา) ในการนำ MATLAB มาใช้จะอยู่ในรูปแบบ c (x) <= 0 นี่เป็นรหัสชิ้นสุดท้ายที่จำเป็นต้องทำการย้ายจาก matlab ไปยัง c ++ และฉันพยายามอย่างมากในขณะที่พยายามค้นหาไลบรารี c ++ ที่เหมาะสมซึ่งมีอัลกอริธึมนี้ นี่คือเหตุผลที่ฉันขอความช่วยเหลือที่นี่และฉันจะขอบคุณมากถ้าคุณสามารถให้ความเชี่ยวชาญของคุณ

ตัวอย่างที่ดีของสิ่งที่ฉันต้องการทำคืออันแรกในหน้านี้http://www.mathworks.com/help/optim/ug/constrained-nonlinear-optimization-examples.html#f10960?s_tid=doc_12bความแตกต่างเพียงอย่างเดียวคือฉัน ต้องการขอบเขตเช่นกัน ...

ขอบคุณล่วงหน้า.

จางไป


มีความเป็นไปได้ของการใช้ NLOPT ab-initio.mit.edu/wiki/index.php/NLopt_C-plus-plus_Referenceแต่ฉันต้องการคำนวณความแตกต่างที่ จำกัด โดยใช้การเรียกใช้ฟังก์ชัน "ลดขนาด" จำนวนมากจากฟังก์ชันวัตถุประสงค์และฉันก็ใจดี หวังว่าจะได้รับการดูแลโดยอัลกอริทึมมันด้วยตนเองเพื่อปรับปรุงประสิทธิภาพ ฟังก์ชั่นย่อเล็กสุดของฉันมีราคาแพงมากในการคำนวณ เพียงชี้แจงให้ฟังก์ชั่นที่ย่อเล็กสุดนั้นมีความเป็นไปได้ในการบันทึกของแบบจำลองโดยประมาณกับข้อมูลดั้งเดิมในการประมาณแบบจำลองการสลับมาร์คอฟแบบอนุกรม
Peter Kottas

1
คุณดูคำตอบของคำถามนี้หรือไม่ หากความต้องการของคุณไม่ได้รับการตอบสนองอย่างเพียงพอคุณควรแก้ไขคำถามของคุณเพื่อชี้ให้เห็นเพื่อรับคำแนะนำที่เป็นประโยชน์
Christian Clason

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

1
คำถามหลายข้อ: 1. ปัญหาของคุณเป็นแบบนูนหรือไม่? 2. วัตถุประสงค์และข้อ จำกัด ต่างกันหรือไม่? ถ้าเป็นเช่นนั้นกี่ครั้ง? เมื่อ? ครั้งที่สอง? 3. คุณสามารถคำนวณอนุพันธ์เหล่านั้นได้อย่างง่ายดายถ้ามีอยู่? การประมาณความแตกต่างอัน จำกัด จะง่ายต่อการคำนวณถ้าคุณไม่มีอนุพันธ์ที่พร้อมใช้งานหรือไม่? 4. คุณมีตัวแปรการตัดสินใจกี่ตัว? (เช่นคุณพยายามลดจำนวนตัวแปรให้มากที่สุด) การประมาณคร่าวๆจะเพียงพอ 5. การประเมินฟังก์ชั่นมีราคาแพงหรือไม่ มันจะมีประโยชน์หากมีข้อมูลทั้งหมดนี้เพื่อให้คำตอบที่ดีขึ้น
Geoff Oxberry

Hi! ก่อนอื่นขอขอบคุณสำหรับการตอบกลับ 1. ยากที่จะบอก แต่น่าจะไม่ใช่เพราะฟังก์ชั่นที่ถูกย่อขนาดนั้นคือความเป็นไปได้ที่จะเกิดขึ้นระหว่างการประมาณแบบจำลองการสลับมาร์คอฟของไทม์เซอร์ในแอปพลิเคชั่นทางการเงินและจากลักษณะของมัน 2. ไม่มี 3. ใช้เฉพาะความแตกต่างที่แน่นอน 4. เวกเตอร์การแก้ไขประกอบด้วยตัวแปร n โดยที่ n ขึ้นอยู่กับพารามิเตอร์ของโมเดลที่ต้องการโดยทั่วไปจาก 12 เพื่อให้บอกว่า 30 5. ความน่าจะเป็นล็อกระหว่างโมเดลและข้อมูลดั้งเดิมมีราคาแพง ชีพในการคำนวณ
Peter Kottas

คำตอบ:


2

หากฟังก์ชั่นของคุณไม่แตกต่างกันคุณควรระมัดระวังเกี่ยวกับวิธีการใช้ความแตกต่างแน่นอน หากคุณต้องการใช้ข้อมูลอนุพันธ์ทางออกที่ดีที่สุดของคุณน่าจะเป็นวิธีกึ่ง semismooth ประเภทของนิวตัน ชุดของบันทึกการอธิบายวิธีการดังกล่าวสามารถพบได้ที่นี่

ตัวแปรสิบถึงสามสิบน่าจะอยู่ที่ปลายด้านบนของสิ่งที่ทำได้ด้วยการค้นหารูปแบบ (หรือที่เรียกว่าการค้นหาโดยตรง) รายงานการตรวจสอบล่าสุดโดย Rios และ Sahinidis ใน Journal of Global Optimization เกี่ยวกับวิธีการเพิ่มประสิทธิภาพที่ปราศจากอนุพันธ์ (เช่นวิธีการค้นหารูปแบบ) สามารถดูได้ที่นี่พร้อมกับหน้าเว็บที่แสดงร่วม กระดาษตรวจสอบล่าสุดน้อยลงในวิธีการเหล่านี้โดย Kolda ลูอิสและ Torczon ในสยามรีวิวสามารถพบได้ที่นี่ วิธีการเหล่านี้ทำงานได้ค่อนข้างดีกับการประเมินฟังก์ชั่นที่มีราคาแพงและไม่จำเป็นต้องมีความแตกต่างหรือข้อมูลอนุพันธ์

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


2

หากสิ่งที่คุณต้องเป็นไลบรารี c ++ ในการแก้ปัญหาการเพิ่มประสิทธิภาพเชิงคุณสามารถใช้RobOptim แม้ว่า RobOptim ได้รับการพัฒนาในขั้นต้นโดยคำนึงถึงปัญหาการเพิ่มประสิทธิภาพของหุ่นยนต์ในใจ แต่ก็เหมาะสำหรับปัญหาการเพิ่มประสิทธิภาพแบบไม่เชิงเส้นใด ๆ มันมีอินเตอร์เฟส C ++แบบง่ายพร้อมปลั๊กอินสำหรับตัวแก้ปัญหาแบบไม่เชิงเส้นหลายตัว ( Ipopt , NAGเป็นต้น) การใช้ตัวห่อแบบนั้นทำให้ง่ายต่อการใช้ตัวแก้ไข NLP อื่น หากคุณไม่สามารถให้การไล่ระดับสีการคำนวณผลต่าง จำกัด สามารถทำได้โดยอัตโนมัติ

เป็นโอเพ่นซอร์สดังนั้นคุณสามารถตรวจสอบซอร์สโค้ดได้ที่ GitHub: https://github.com/roboptim/

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

หมายเหตุ: ฉันเป็นหนึ่งในผู้พัฒนาของโครงการนี้

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