سؤال

أنا استخدم بيثون 2.5.

أنا أتخلى عن الحدود الأمثل Cobyla:

import numpy 
from numpy import asarray

Initial = numpy.asarray [2, 4, 5, 3]       # Initial values to start with

#bounding limits (lower,upper) - for visualizing

#bounds = [(1, 5000), (1, 6000), (2, 100000), (1, 50000)] 

# actual passed bounds

b1 = lambda  x: 5000 - x[0]      # lambda x: bounds[0][1] - Initial[0]

b2 = lambda  x: x[0] - 2.0       # lambda x: Initial[0] - bounds[0][0]

b3 = lambda  x: 6000 - x[1]      # same as above

b4 = lambda  x: x[1] - 4.0

b5 = lambda  x: 100000 - x[2]

b6 = lambda  x: x[2] - 5.0

b7 = lambda  x: 50000 - x[3]

b8 = lambda  x: x[3] - 3.0

b9 = lambda  x: x[2] >  x[3]  # very important condition for my problem!


opt= optimize.fmin_cobyla(func,Initial,cons=[b1,b2,b3,b4,b5,b6,b7,b8,b9,b10],maxfun=1500000)

بناء على القيم الأولية Initial وعلى أساس / داخل الحدود b1 ل b10 يتم تمرير القيم إلى opt(). وبعد لكن القيم تنحرف، خاصة مع b9. وبعد هذا هو حالة حبل مهمة للغاية لمشكلتي!

"قيمة ال x[2] مرت إلى وظيفتي opt() في كل تخصير يجب أن يكون دائما أكبر من x[3]"- كيف يمكن تحقيق ذلك؟

هل هناك أي شيء خاطئ في حدودي (b1 ل b9) تعريف ؟

أم أن هناك طريقة أفضل لتحديد حدودي؟

الرجاء مساعدتي.

هل كانت مفيدة؟

المحلول

fmin_cobyla() ليست طريقة نقطة الداخلية. وهذا هو، وسوف تمر النقاط خارج الحدود ("نقاط غير قابلة للتنفيذ") إلى الوظيفة أثناء تشغيل البلاط.

على شيء ستحتاج إلى إصلاحه هو ذلك b9 و b10 ليست في شكل ذلك fmin_cobyla() تتوقع. تحتاج الوظائف المرتبطة إلى إرجاع رقم إيجابي إذا كانت ضمن الحد الأقصى، 0.0 إذا كانت بالضبط في المقيد، وردود سالبة إذا كانت خارج الحدود. من الناحية المثالية، يجب أن تكون هذه الوظائف سلسة. fmin_cobyla() سيحاول اتخاذ مشتقات رقمية لهذه المهام من أجل إعلام كيفية العودة إلى المنطقة الممكنة.

b9 = lambda x: x[2] - x[3]

لست متأكدا من كيفية التنفيذ b10 بطريقه تكون fmin_cobyla() سوف تكون قادرة على استخدام، رغم ذلك.

نصائح أخرى

بالنسبة ل B10، يمكن أن يكون الخيار المحتمل:

b10 = lambda x: min(abs(i-j)-d for i,j in itertools.combinations(x,2))

أين د هي دلتا أكبر من الحد الأدنى للفرق الذي تريده بين المتغيرات الخاصة بك (على سبيل المثال 0.001)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top