มีตัวแก้ปัญหาการเขียนโปรแกรมแบบไม่เชิงเส้นคุณภาพสูงสำหรับ Python หรือไม่?


77

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

  • สามารถรับมือกับความไม่เสมอภาคและความไม่เท่าเทียมกันได้
  • ไม่ต้องการให้ผู้ใช้จัดหายาโคบ

ไม่เป็นไรหากไม่รับประกันว่าจะมีประสิทธิภาพระดับโลก ( fmincon()ไม่) fmincon()ฉันกำลังมองหาบางสิ่งบางอย่างที่ทนทานลู่ไปยังท้องถิ่นที่เหมาะสมแม้สำหรับความท้าทายปัญหาและแม้ว่ามันจะช้ากว่าเล็กน้อย

ฉันได้พยายามแก้หลายที่ให้บริการผ่าน OpenOpt และพบว่าพวกเขาจะด้อยกว่าของ fmincon/sqpMATLAB

เพียงเพื่อเน้นฉันมีสูตรเวิ้งว้างและแก้ปัญหาที่ดี เป้าหมายของฉันคือการเปลี่ยนภาษาเพื่อให้เวิร์กโฟลว์มีความคล่องตัวมากขึ้น

เจฟฟ์ชี้ให้เห็นว่าคุณลักษณะบางอย่างของปัญหาอาจเกี่ยวข้องกัน พวกเขาคือ:

  • 10-400 ตัวแปรการตัดสินใจ
  • 4-100 ข้อ จำกัด ความเท่าเทียมกันของพหุนาม (ดีกรีพหุนามมีช่วงตั้งแต่ 1 ถึงประมาณ 8)
  • จำนวนข้อ จำกัด ของความไม่เท่าเทียมกันที่มีเหตุผลเท่ากับจำนวนตัวแปรการตัดสินใจประมาณสองเท่า
  • ฟังก์ชั่นวัตถุประสงค์เป็นหนึ่งในตัวแปรการตัดสินใจ

ชาวจาโคเบียนแห่งข้อ จำกัด ความเท่าเทียมมีความหนาแน่นสูงเช่นเดียวกับชาวจาโคเบียนแห่งข้อ จำกัด ที่ไม่เท่าเทียมกัน


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

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

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

Coopr จัดเตรียมการโยงกับ ipopt โดยใช้ asl: ipopt
denfromufa

คำตอบ:


32

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

แพ็คเกจที่ดีที่สุดที่ฉันทราบสำหรับการเพิ่มประสิทธิภาพแบบไม่เชิงเส้นทั่วไปคือIPOPT [1] เห็นได้ชัดว่าแมทธิว Xu คงชุดของการผูก Python ไว้ที่ IPOPTดังนั้นนี่อาจเป็นจุดเริ่มต้น

[1]: Andreas Wachter เป็นเพื่อนส่วนตัวดังนั้นฉันอาจจะลำเอียงเล็กน้อย


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

จับดี. ฉันหมายถึงอดีต; ฉันได้อัปเดตคำถามแล้ว
David Ketcheson

ผมจนสามารถนำไปใช้ในการแก้ไขปัญหา IPOPT ของฉันโดยใช้sage.openopt.org มันยอดเยี่ยมมาก!
David Ketcheson

4
วันนี้ (2017) คุณยังสามารถใช้ IPOPT ในหลามรางPyomo คุณได้รับภาษาการสร้างแบบจำลองพีชคณิตและต่างอัตโนมัติสำหรับจาโคเบียนและรัฐ
Antonello

@Antonello ลิงก์ที่แก้ไขคือpyomo.org
Moonwalker

37

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

หากคุณสามารถกำหนดปัญหาของคุณเป็นระบบสมการที่ชัดเจนและต้องการตัวแก้ปัญหาฟรีทางออกที่ดีที่สุดของคุณน่าจะเป็น IPOPT ตามที่ Aron กล่าว แก้ฟรีอื่น ๆ สามารถพบได้บนเหรียญหรือเว็บไซต์ สำหรับความรู้ของฉันตัวแก้ปัญหาแบบไม่เชิงเส้นไม่มีการรวม Python โดยนักพัฒนา การผูกข้อมูลใด ๆ ที่คุณพบว่าเป็นบุคคลที่สาม เพื่อให้ได้โซลูชั่นที่ดีคุณจะต้องห่อตัวแก้ปัญหาที่ไม่เป็นเชิงเส้นนูนที่คุณพบในฮิวริสติกการเพิ่มประสิทธิภาพแบบสุ่มทั่วโลกที่เหมาะสม อีกวิธีหนึ่งคุณสามารถใช้ Bonmin หรือ Couenne ซึ่งทั้งสองอย่างเป็นตัวแก้ปัญหาการเพิ่มประสิทธิภาพแบบ non-convex แบบกำหนดค่าได้ซึ่งทำงานได้ดีมากเมื่อเปรียบเทียบกับตัวแก้ปัญหาBARONบารอน

หากคุณสามารถซื้อเครื่องมือเพิ่มประสิทธิภาพเชิงพาณิชย์คุณอาจพิจารณาดูภาษาการสร้างแบบจำลองGAMSซึ่งรวมถึงตัวแก้ปัญหาการเพิ่มประสิทธิภาพแบบไม่เชิงเส้นหลายตัว การกล่าวถึงโดยเฉพาะคืออินเตอร์เฟสกับตัวแก้ปัญหา CONOPT, SNOPT และ BARON (CONOPT และ SNOPT เป็นตัวแก้ปัญหานูน) โซลูชัน kludgey ที่ฉันเคยใช้ในอดีตคือใช้การผูกภาษา Fortran (หรือ Matlab) กับ GAMS เพื่อเขียนไฟล์ GAMS และเรียก GAMS จาก Fortran (หรือ Matlab) เพื่อคำนวณ วิธีการแก้ปัญหาการเพิ่มประสิทธิภาพ GAMS มีการเชื่อมโยงภาษา Python และทีมสนับสนุนที่ตอบสนองได้ดียินดีให้ความช่วยเหลือหากมีปัญหาใด ๆ (ข้อจำกัดความรับผิดชอบ: ฉันไม่มีส่วนเกี่ยวข้องกับ GAMS แต่ห้องปฏิบัติการของฉันมีใบอนุญาต GAMS) ผู้แก้ปัญหาเชิงพาณิชย์ไม่ควรเลวร้ายไปกว่าfmincon; ในความเป็นจริงฉันจะแปลกใจหากพวกเขาไม่ได้ดีขึ้นมาก หากปัญหาของคุณมีขนาดเล็กเพียงพอคุณอาจไม่จำเป็นต้องซื้อใบอนุญาต GAMS และใบอนุญาตในการแก้ปัญหาเนื่องจากอาจมีการดาวน์โหลดสำเนาการประเมินของ GAMS จากเว็บไซต์ของพวกเขา มิฉะนั้นคุณอาจต้องการตัดสินใจว่านักแก้ปัญหาที่จะซื้อร่วมกับใบอนุญาต GAMS เป็นที่น่าสังเกตว่า BARON ต้องการตัวแก้ปัญหาการเขียนโปรแกรมเชิงเส้นจำนวนเต็มแบบผสมและใบอนุญาตสำหรับตัวแก้ปัญหาการโปรแกรมเชิงเส้นแบบจำนวนเต็มสองตัวที่ดีที่สุด CPLEX และ GUROBI นั้นฟรีสำหรับนักวิชาการดังนั้นคุณอาจไม่ต้องซื้ออินเทอร์เฟซ GAMS มากกว่าอินเตอร์เฟสและใบอนุญาตผู้แก้ไขซึ่งสามารถประหยัดเงินได้ไม่มากนัก

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

UPDATE: หนึ่งความคิดที่ไม่เคยเกิดขึ้นกับฉันในตอนแรกก็คือคุณสามารถโทรหา Toolkit for Advanced Optimization ( TAO ) และPETScโดยใช้tao4pyและpetc4pyซึ่งจะได้รับประโยชน์เพิ่มเติมจากการขนานที่ง่ายขึ้นและใช้ประโยชน์จากความคุ้นเคยกับ PETSc และเครื่องมือACTS

ปรับปรุง # 2: ขึ้นอยู่กับข้อมูลเพิ่มเติมที่คุณพูดถึงวิธีการเขียนโปรแกรมแบบ quadratic programming (SQP) ตามลำดับจะเป็นทางออกที่ดีที่สุดของคุณ โดยทั่วไปแล้ววิธีการ SQP จะถือว่ามีประสิทธิภาพมากกว่าวิธีการจุดภายใน เนื่องจากคุณสนใจความแข็งแกร่งมากกว่าความเร็ว SQP จึงเป็นทางออกที่ดีที่สุดของคุณ ฉันไม่สามารถหาคำตอบ SQP ที่ดีออกมาเขียนใน Python ได้ (และเห็นได้ชัดว่า Sven Leyffer ที่ Argonne ไม่สามารถทำได้ในรายงานทางเทคนิคนี้) ฉันเดาว่าอัลกอริทึมที่ใช้ในแพ็คเกจเช่น SciPy และ OpenOpt มีโครงกระดูกพื้นฐานของอัลกอริทึม SQP บางตัวที่นำมาใช้ แต่ไม่มีฮิวริสติกพิเศษที่รหัสขั้นสูงใช้ในการเอาชนะปัญหาคอนเวอร์เจนซ์ คุณสามารถลองNLoptเขียนโดยสตีเวนจอห์นสันที่ MIT ฉันไม่มีความหวังสูงเพราะไม่มีชื่อเสียงที่ฉันรู้ แต่สตีเวนจอห์นสันเป็นคนที่ยอดเยี่ยมที่เขียนซอฟต์แวร์ที่ดี (หลังจากนั้นเขาก็ร่วมเขียน FFTW) มันใช้เวอร์ชันของ SQP; หากเป็นซอฟต์แวร์ที่ดีโปรดแจ้งให้เราทราบ

ฉันหวังว่า TAO จะมีบางอย่างที่เป็นตัวแก้ไขการเพิ่มประสิทธิภาพที่มีข้อ จำกัด แต่ก็ไม่เป็นเช่นนั้น คุณสามารถใช้สิ่งที่พวกเขาสร้างขึ้นมาได้อย่างแน่นอน พวกมันมีส่วนประกอบมากมาย ตามที่คุณชี้ให้เห็นว่ามันจะเป็นการทำงานที่มากขึ้นสำหรับคุณที่จะทำเช่นนั้นและหากคุณกำลังเผชิญกับปัญหาดังกล่าวคุณอาจเป็นนักพัฒนา TAO

ด้วยข้อมูลเพิ่มเติมนั้นคุณมีแนวโน้มที่จะได้ผลลัพธ์ที่ดีกว่าในการโทรหา GAMS จาก Python (หากเป็นตัวเลือกทั้งหมด) หรือพยายามที่จะแพ็คเก็ต IPOPT Python เนื่องจาก IPOPT ใช้วิธีการจุดภายในจึงไม่แข็งแรง แต่บางทีการใช้วิธีการจุดภายในของ Andreas นั้นดีกว่าการใช้ SQP ของ Matlab ในกรณีนี้คุณอาจไม่ต้องเสียสละความแข็งแกร่งเลย คุณต้องดำเนินการกรณีศึกษาบางอย่างเพื่อให้รู้แน่

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

ไม่รวมการรวม GAMS Python และอินเตอร์เฟส Python กับ IPOPT คำตอบคือไม่ยังไม่มีตัวแก้ปัญหาการเขียนโปรแกรมแบบไม่เชิงเส้นคุณภาพสูงสำหรับ Python เลย บางที @Dominique จะเปลี่ยนสิ่งนั้นด้วย NLPy

UPDATE # 3: แทงเพิ่มในการหาตัวแก้ Python ที่ให้ผลลัพธ์PyGMOซึ่งเป็นชุดของการเชื่อมโยง Python กับ PaGMO ซึ่งเป็นตัวแก้ปัญหาการเพิ่มประสิทธิภาพแบบหลายตัวเลือกทั่วโลกที่ใช้ C ++ แม้ว่ามันจะถูกสร้างขึ้นสำหรับการเพิ่มประสิทธิภาพ multiobjective แต่ก็ยังสามารถใช้ในการเขียนโปรแกรมแบบไม่เชิงเส้นวัตถุประสงค์เดียวและมีอินเทอร์เฟซ Python สำหรับ IPOPT และ SNOPT ท่ามกลางตัวแก้ไขอื่น ๆ มันได้รับการพัฒนาภายในองค์การอวกาศยุโรปดังนั้นหวังว่าจะมีชุมชนที่อยู่เบื้องหลัง มันถูกปล่อยออกมาค่อนข้างเร็ว ๆ นี้ (24 พฤศจิกายน 2011)


โปรดทราบว่า PaGMO ได้รับอนุญาตจาก GPL
denfromufa

14

APM Python

อัปเดต: ดูแพ็คเกจ GEKKOใหม่ที่เราเพิ่งเปิดตัว

APM Pythonเป็นกล่องเครื่องมือเพิ่มประสิทธิภาพฟรีที่มีส่วนต่อประสานกับ APOPT, BPOPT, IPOPT และตัวแก้ไขอื่น ๆ มันให้ข้อมูล (Jacobian) แรกและข้อมูลที่สอง (Hessian) แก่นักแก้ปัญหาและให้เว็บอินเตอร์เฟสที่เป็นตัวเลือกเพื่อดูผลลัพธ์ APM Python ไคลเอ็นต์ถูกติดตั้งด้วย pip:

 pip install APMonitor

นอกจากนี้ยังสามารถติดตั้งในสคริปต์ Python ด้วย:

try:
    from APMonitor.apm import *
except:
    # Automatically install APMonitor
    import pip
    pip.main(['install','APMonitor'])
    from APMonitor.apm import *

เราได้ทำการทดสอบเกณฑ์เปรียบเทียบสมรรถนะสองครั้งแล้วและพบว่าการรวมกันของ APOPT (วิธีการตั้งค่าที่ใช้งานอยู่) และ IPOPT (วิธีการจุดภายใน) สามารถแก้ปัญหาการวัดประสิทธิภาพได้เป็นจำนวนมาก มีปัญหาตัวอย่างจำนวนมากที่มาพร้อมกับไฟล์ zip ดาวน์โหลด สิ่งที่คุณอาจต้องการเริ่มต้นคือปัญหา Hock Schittkowski # 71 มันเป็นตัวอย่างที่ง่ายที่สุดและแสดงให้เห็นถึงวิธีการแก้ปัญหาการเพิ่มประสิทธิภาพที่มีข้อ จำกัด

มีส่วนต่อประสานของเบราว์เซอร์และ API เป็น Python / MATLAB API เป็น Python เป็นสคริปต์เดียว (apm.py) ที่สามารถดาวน์โหลดได้จากหน้าแรกของ apmonitor.com เมื่อสคริปต์โหลดลงในรหัส Python มันจะให้ความสามารถในการแก้ปัญหาของ:

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

สำหรับผู้ใช้ใหม่ซอฟต์แวร์ APM Python มีฟอรัม Google Groups ที่ผู้ใช้สามารถโพสต์คำถาม มีการสัมมนาผ่านเว็บที่แสดงปัญหาการเพิ่มประสิทธิภาพในการวิจัยการดำเนินงานและวิศวกรรม

ด้านล่างเป็นตัวอย่างของปัญหาการปรับให้เหมาะสม (hs71.apm)

Model
  Variables
    x[1] = 1, >=1, <=5
    x[2] = 5, >=1, <=5
    x[3] = 5, >=1, <=5
    x[4] = 1, >=1, <=5
  End Variables

  Equations
    x[1] * x[2] * x[3] * x[4] > 25
    x[1]^2 + x[2]^2 + x[3]^2 + x[4]^2 = 40

    minimize  x[1] * x[4] * (x[1]+x[2]+x[3]) + x[3]
  End Equations
End Model

ปัญหาการปรับให้เหมาะสมจะได้รับการแก้ไขด้วยสคริปต์ Python ต่อไปนี้:

from APMonitor.apm import *
server = 'http://byu.apmonitor.com'

# Application name
app = 'eqn'

# Clear previous application
apm(server,app,'clear all')

# Load model file
apm_load(server,app,'hs71.apm')

# Option to select solver (1=APOPT, 2=BPOPT, 3=IPOPT)
apm_option(server,app,'nlc.solver',3)

# Solve on APM server
solver_output = apm(server,app,'solve')

# Display solver output
print(solver_output)

# Retrieve results
results = apm_sol(server,app)

# Display results
print('--- Results of the Optimization Problem ---')
print(results)

# Display Results in Web Viewer 
url = apm_var(server,app)
print("Opened Web Viewer: " + url)

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


2
จอห์นฉันเห็นว่า APM Python พร้อมใช้งานได้อย่างอิสระ แต่ฉันไม่สามารถดูได้จากแพคเกจว่ามีตัวแก้ที่ใช้ในเครื่องหรือต้องใช้การเชื่อมต่อกับเว็บไซต์ AP Monitor เพื่อทำการคำนวณ ฉันอยากรู้ว่าที่
Aron Ahmadia

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

@JohnHedengren ฉันมี precomputations บางอย่างใน MATLAB โดยใช้ห้องสมุดอื่นเพื่อสร้างปัญหาการเพิ่มประสิทธิภาพของตัวเองโดยเฉพาะข้อ จำกัด เกี่ยวข้องกับการโทรภายนอกเหล่านี้ คุณคิดว่า APM ยังคงเหมาะสมสำหรับวัตถุประสงค์นี้หรือไม่?
gpavanb

ฉันคิดว่าคำทั่วไปคือการเพิ่มประสิทธิภาพ blackbox
gpavanb

@gpavanb แพ็คเกจ APMonitor ต้องใช้สมการที่เขียนในภาษาการสร้างแบบจำลอง ตัวเลือกหนึ่งในการโหลดรหัสภายนอกคือการสร้างวัตถุที่มีสารตกค้างและอย่างน้อยก็อนุพันธ์การวิเคราะห์ครั้งแรก โดยทั่วไปเราเขียนโค้ดวัตถุเหล่านี้ใน F90 เพื่อความเร็วเช่นที่ระบุไว้ที่นี่: apmonitor.com/wiki/index.php/Main/Objects ฉันไม่คิดว่า APMonitor เป็นตัวเลือกที่ดีที่สุดสำหรับแอปพลิเคชันที่มีการเพิ่มประสิทธิภาพ blackbox
John Hedengren

7

แม้ว่าสิ่งนี้จะไม่ตอบคำถามของคุณทั้งหมด แต่ฉันได้เขียนแพ็คเกจ Python สำหรับการโปรแกรมแบบไม่เชิงเส้นชื่อ NLPy เวอร์ชันล่าสุดอาจถูกดึงจากhttps://github.com/dpo/nlpy

ฉันต้องเน้นย้ำว่า NLPy นั้นเป็นระดับการวิจัยและนักแก้ปัญหาที่รวมอยู่นั้นไม่ได้มีความแข็งแกร่งเท่ากับรหัสที่มีการปรุงรสอย่าง IPOPT ยิ่งกว่านั้นพวกเขายังต้องการให้ยาโคบมีการจัดเตรียม ที่ถูกกล่าวว่าจุดของ NLPy คือการให้เครื่องมือที่จำเป็นสำหรับนักวิจัยในการรวบรวมนักแก้ปัญหาที่กำหนดเองถ้าพวกเขาต้องการ ฉันจะสนใจฟังความคิดเห็นของคุณแบบออฟไลน์ถ้าคุณลอง คุณอาจพบแพ็คเกจที่เกี่ยวข้องhttps://github.com/dpo/pykrylovและhttps://github.com/dpo/pyorderมีประโยชน์ ปัจจุบันเอกสารของ NLPy ขาดหายไปอย่างแน่นอน อีกสองคนควรมีเหตุผล


7

pyomoเป็นสภาพแวดล้อมจำลองเหมือน GAMS / AMPL เต็มรูปแบบสำหรับการเพิ่มประสิทธิภาพในหลาม มันมีประสิทธิภาพมากมีอินเทอร์เฟซสำหรับนักแก้ปัญหาทั้งหมดที่ AMPL สนับสนุนและสร้างจาโคเบียน ฯลฯ โดยอัตโนมัติ อย่างไรก็ตามเนื่องจากมันทำงานใน 'virtual python environment' จึงอาจไม่สำคัญที่จะลิงก์ไปยังโค้ดที่มีอยู่


5

GEKKO Python

เราเพิ่งเปิดตัว (2018) แพ็คเกจ GEKKO Pythonสำหรับการเขียนโปรแกรมแบบไม่เชิงเส้นพร้อมตัวแก้ปัญหาเช่น IPOPT, APOPT, BPOPT, MINOS และ SNOPT ด้วยวิธีการตั้งค่าที่ใช้งานและจุดภายใน หนึ่งในปัญหาเกี่ยวกับการใช้งานตัวแก้ปัญหาเหล่านี้คือโดยปกติแล้วคุณจะต้องจัดเตรียมตราสารอนุพันธ์อย่างน้อยหนึ่งตัวและตราสารอนุพันธ์ทางเลือกที่สอง มีภาษาการสร้างแบบจำลองที่ดีหลายอย่างที่สามารถทำสิ่งนี้เพื่อคุณดังที่กล่าวไว้กับคำตอบอื่น ๆ GEKKO รวบรวมสมการกับโค้ดไบต์เพื่อให้เหมือนกับว่าคุณเขียนโมเดลใน Fortran หรือ C ++ ในแง่ของความเร็ว การสร้างความแตกต่างโดยอัตโนมัติมอบอนุพันธ์อันดับที่ 1 และ 2 ในรูปแบบกระจัดกระจายให้แก่นักแก้ปัญหาที่ไล่ระดับสี เราออกแบบ GEKKO สำหรับปัญหาการควบคุมที่ดีที่สุด แต่ก็สามารถแก้ปัญหาที่คล้ายกับ fmincon ได้ ด้านล่างนี้เป็นตัวอย่างด่วนของปัญหาการเขียนโปรแกรมแบบไม่เชิงเส้นที่มีข้อ จำกัด ด้านความไม่เท่าเทียมและความไม่เท่าเทียมกัน คุณคนแรก'

pip install gekko

Hock Schittkowski ปัญหา # 71ที่แสดงด้านล่างเป็นตัวอย่างของฟังก์ชันวัตถุประสงค์ข้อ จำกัด ความไม่เสมอภาคเท่าเทียมกัน จำกัด และสี่ตัวแปรที่มีขอบเขตบนและล่าง

from gekko import GEKKO
m = GEKKO() # Initialize gekko
# Initialize variables
x1 = m.Var(value=1,lb=1,ub=5)
x2 = m.Var(value=5,lb=1,ub=5)
x3 = m.Var(value=5,lb=1,ub=5)
x4 = m.Var(value=1,lb=1,ub=5)
# Equations
m.Equation(x1*x2*x3*x4>=25)
m.Equation(x1**2+x2**2+x3**2+x4**2==40)
m.Obj(x1*x4*(x1+x2+x3)+x3) # Objective
m.options.IMODE = 3 # Steady state optimization
m.solve() # Solve
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))    

GEKKO ทำงานได้กับทุกแพลตฟอร์ม (Windows, MacOS, Linux, ARM processor) และ Python 2.7 และ 3+ ตัวเลือกในพื้นที่อย่างเต็มที่สามารถใช้ได้โดยไม่ต้องเชื่อมต่ออินเทอร์เน็ตโดยการตั้งค่าตัวเลือก "remote = False" ตัวเลือกในท้องที่นั้นมีเฉพาะใน Windows และเรากำลังทำงานกับรุ่นอื่น ๆ เช่น Linux, MacOS, โปรเซสเซอร์ ARM เพื่อให้ทำงานในท้องถิ่นโดยไม่ต้องเชื่อมต่ออินเทอร์เน็ต เวอร์ชันท้องถิ่นรวมถึงนักแก้ปัญหาฟรีเท่านั้นที่ไม่ต้องการสิทธิ์ใช้งาน ตามค่าเริ่มต้นปัญหาจะถูกส่งไปยังเซิร์ฟเวอร์สาธารณะที่มีวิธีการคำนวณและส่งคืนไปยัง Python

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

ฉันสอนสองหลักสูตรเกี่ยวกับการเพิ่มประสิทธิภาพ ( การเพิ่มประสิทธิภาพการออกแบบและการเพิ่มประสิทธิภาพแบบไดนามิก ) และได้โพสต์เนื้อหาของหลักสูตรออนไลน์ หลักสูตรการปรับให้เหมาะสมแบบไดนามิกนั้นเปิดสอนในแต่ละปีเริ่มต้นในเดือนมกราคมและเราใช้แพ็คเกจ GEKKO Python (และ MATLAB) สำหรับหลักสูตรนี้ GEKKO เป็นส่วนเสริมของ APMonitor Optimization Suite แต่ได้รวมการสร้างแบบจำลองและการสร้างภาพข้อมูลโซลูชั่นโดยตรงภายใน Python การอ้างอิง APMonitor และ GEKKOให้ตัวอย่างของประเภทแอปพลิเคชันที่สามารถแก้ไขได้ด้วยแพ็คเกจนี้ GEKKO ได้รับการพัฒนาภายใต้มูลนิธิวิทยาศาสตร์แห่งชาติทุนวิจัย #


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

คริสเตียนฉันได้แก้ไขคำตอบให้เฉพาะเจาะจงกับคำถามมากขึ้น ฉันย้ายข้อมูลเพิ่มเติมเกี่ยวกับ GEKKO และหลักสูตรออนไลน์ไปยังจุดสิ้นสุด แต่สามารถลบออกได้หากจำเป็น
John Hedengren

4

1
ขอบคุณ แต่นั่นคือสิ่งที่ฉันได้ลอง (ผ่าน OpenOpt ซึ่งให้ส่วนต่อประสานเพิ่มเติมกับมัน) มันไม่เคยดีกว่า fmincon / sqp และล้มเหลวในหลาย ๆ กรณีที่ประสบความสำเร็จ
David Ketcheson

1
อัปเดต: ฉันลองตัวนี้โดยตรงจาก SciPy มันล้มเหลวแม้ในปัญหาที่ fmincon สามารถค้นหาระดับโลกที่เหมาะสมอย่างต่อเนื่องในไม่กี่วินาที
David Ketcheson

4

PyGMOมีตัวแก้ปัญหาหลายตัวซึ่งให้ส่วนต่อประสานเดียวกันกับพวกมัน IPOPT และ scipy slsqp รวมอยู่ในกรณีที่คุณรวบรวมรหัสและดาวน์โหลด / ติดตั้งรหัสบุคคลที่สามอย่างอิสระ

เป็นโบนัสการใช้ตัวแก้แบบขนานนั้นง่ายมาก (multistart) ผ่านคลาสหมู่เกาะ!


3

มีcvxmodตัวห่อหุ้มงูหลามรอบ ๆ ซอฟต์แวร์การเพิ่มประสิทธิภาพนูนของ Stephen Boyd มันเป็นส่วนหนึ่งของแพ็คเกจSage


แต่ OP กำลังถามถึงปัญหาการปรับให้เหมาะสมแบบไม่นูน
Alejandro

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

เจฟฟ์ฉันจะใช้ cvxmod กับปัญหาที่ไม่นูนได้อย่างไร
David Ketcheson

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

1
@Geoff: ใช่ฉันใช้มัลติสตาร์ต สำหรับ CVXMOD นั้นจะยอมรับเฉพาะปัญหาที่สามารถใช้ถ้อยคำในแง่ของการเขียนโปรแกรมแบบมีระเบียบวินัย ปัญหาการเขียนโปรแกรมแบบไม่เชิงเส้นทั่วไปไม่สามารถทำได้ อย่างที่คุณพูดฉันสามารถมองหาการผ่อนคลายนูนที่ต่อเนื่องซึ่งประมาณปัญหาของฉันได้ แต่เป้าหมายทั้งหมดที่นี่คือการให้ฉันทำงานน้อยลง
David Ketcheson

3

fmincon สามารถใช้งานได้จาก Python ผ่านทางกรอบงาน OpenOpt ซึ่งเป็นทางเลือกที่มีความแตกต่างอัตโนมัติแบบหนาแน่น / แบบเบาบางโดย FuncDesigner http://openopt.org/fmincon


ดูเหมือนว่าจะไม่มีอยู่อีกต่อไป
feetwet

3






ในฐานะของ Release 2014b ตอนนี้ Matlab รองรับโดยตรงแล้ว ดูmathworks.de/help/matlab/matlab-engine-for-python.html
Christian Clason

@Christian Clason ดูเหมือนว่าจะไม่ทำ numpy-to-Matlab เลย? เช่นเดียวกับ python-matlab-bridge (ฉันไม่ได้ใช้มันเลย)
denis

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

3

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


2

CMA-ES เป็นอย่างไร มันมีการผูก Python และเหมาะกับปัญหาการเพิ่มประสิทธิภาพ nonconvex, nonlinear และฉันใช้มันค่อนข้างน้อย: https://www.lri.fr/~hansen/cmaesintro.html

การติดตั้งผ่าน pip:

pip install cma

นี่คือตัวอย่างโค้ดจากเว็บไซต์:

import cma
help(cma)  # "this" help message, use cma? in ipython
help(cma.fmin)
help(cma.CMAEvolutionStrategy)
help(cma.CMAOptions)
cma.CMAOptions('tol')  # display 'tolerance' termination options
cma.CMAOptions('verb') # display verbosity options
res = cma.fmin(cma.Fcts.tablet, 15 * [1], 1)
res[0]  # best evaluated solution
res[5]  # mean solution, presumably better with noise

เครื่องมือเพิ่มประสิทธิภาพนี้อยู่ไกลจากสิ่งที่ OP ขอ ตัวอย่างเช่นไม่มีวิธีที่ชัดเจนในการจัดการข้อ จำกัด ด้านความเท่าเทียมกันหรือความไม่เท่าเทียมกับ CMA-ES
Ares

1

เนื่องจาก MATLAB มีคอมไพเลอร์ JIT ในขณะที่ CPython ยังไม่ได้ (อย่างน้อยก็จนกว่า pypy จะได้รับการสนับสนุนอย่างเต็มที่) fminconดูเหมือนว่าคุณต้องการแก้ฟรีที่มีประสิทธิภาพดีกว่าผลิตในเชิงพาณิชย์ มันไม่มากเกินไปเหรอ?

IIRC ในหมู่นักแก้ปัญหาเชิงพาณิชย์ NLP เท่านั้น snopt ได้จัดทำ Python API จนถึงขณะนี้ (แม้ว่าจะค่อนข้างน่าเกลียด)

คุณเคยลองใช้ตัวแก้ OpenOpt รุ่นใด? คุณมีตัวแปรและข้อ จำกัด จำนวนเท่าใดในงาน nonconvex ของคุณ

คุณสามารถลอง IPOPT ผ่าน OpenOpt / Funcdesigner API โดยไม่ต้องติดตั้งบนเซิร์ฟเวอร์ OpenOpt Sage (ให้ความสนใจกับรูปภาพ "เปลี่ยนจาก sage เป็น python")

10300(x-0.1)2+10-300(Y-0.2)2(x,Y)=(1,1)


2
ถ้าคุณอ่านอย่างระมัดระวังฉันแค่ขอบางสิ่งที่มีความทนทานคล้ายกับ fmincon มันไม่จำเป็นต้องดีกว่าและมันอาจช้าลงได้
David Ketcheson

1

สำหรับปัญหาระดับโลกคุณอาจสนใจhttp://openopt.org/interalgและ openopt global solvers อื่น ๆ (http://openopt.org/GLP) เพื่อการเพิ่มประสิทธิภาพท้องถิ่น openopt ยังมีตัวแก้ไขที่หลากหลาย: http://openopt.org / NLP


ใช่ฉันลองบางอย่างแล้ว แต่ไม่มีใครวัดได้ถึง fmincon
David Ketcheson

1

เป็นการดีที่จะกล่าวถึงที่นี่ว่า Google Ceres Solver เป็นเครื่องมือเพิ่มประสิทธิภาพที่ไม่ใช่เชิงเส้นที่มีประสิทธิภาพมากซึ่งใช้ในหลายโครงการ

นอกจากนี้ยังมีตัวห่องูหลามที่นี่: https://github.com/rll/cyres


Levenbeg-Marquardt ใช่ไหม ซึ่งในขณะที่ดีอยู่ไกลจากสิ่งที่ OP ต้องการ
denis

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

1

KNITRO มีอินเตอร์เฟส Python และ MATLAB และอื่น ๆ คิดว่ามันเป็นสิ่งทดแทน FMINCON แต่ประสิทธิภาพดีขึ้นมากและมีราคาแพงกว่า https://www.artelys.com/en/optimization-tools/knitro#doc-tab

ฉันเป็นผู้ใช้ KNITRO แต่ไม่มีส่วนเกี่ยวข้องกับผลิตภัณฑ์

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