การแก้ปัญหากำลังสองน้อยที่สุดด้วยข้อ จำกัด เชิงเส้นใน Python


12

ฉันต้องการแก้ไข

minxAxb22,s.t.ixi=1,xi0,i.

ฉันคิดว่ามันเป็นปัญหากำลังสองซึ่งควรแก้ไขด้วยCVXOPTแต่ฉันไม่สามารถหาวิธีได้


ฉันหวังว่าคำถามนี้จะไม่เฉพาะเจาะจงสำหรับ compsci
จนถึง

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

Btw การแก้ไขอื่น ๆ ดีมาก!
จนถึง

คุณสามารถแก้ปัญหานี้โดยใช้รหัสของคุณเองอย่างมีประสิทธิภาพ ไม่จำเป็นต้องใช้ CVXOPT
Royi

คำตอบ:


11

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

 p = program(minimize(norm2(A*x-b)),[equals(sum(x),1),geq(x,0)])

คำตอบเก่าของฉันทำมันยากขึ้นด้วย CVXOPT:

ทำตามข้อเสนอแนะของเจฟฟ์เพื่อจัดตารางการทำงานตามวัตถุประสงค์ของคุณให้

Axb22=xTATbT,Axb=xTATAxbTAxxTAbbTb

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

xTATAxbT(A+AT)x

4

แทนที่จะแก้ปัญหาที่คุณแก้ไขให้แก้

minxAxb22,s.t.ixi=1,xi0,i.

ปัญหานี้เป็นปัญหาการหาค่าเหมาะที่สุดที่แตกต่าง, นูน, ไม่เชิงเส้นซึ่งสามารถแก้ไขได้ใน CVXOPT, IPOPT หรือตัวแก้ปัญหาการเพิ่มประสิทธิภาพนูนอื่น ๆ

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