SciPy-ը (արտասանվում է sai pie) մաթեմատիկական մաթեմատիկայի փաթեթ է, որը ներառում է նաև C և Fortran գրադարանները: SciPy-ն ձեր Python-ի ինտերակտիվ նիստը վերածում է տվյալների գիտության ամբողջական միջավայրի, ինչպիսիք են MATLAB-ը, IDL-ը, Octave-ը, R-ը կամ SciLab-ը:
Այս հոդվածում մենք կդիտարկենք մաթեմատիկական ծրագրավորման հիմնական տեխնիկան՝ պայմանական օպտիմալացման խնդիրների լուծում մի քանի փոփոխականների սկալյար ֆունկցիայի համար՝ օգտագործելով scipy.optimize փաթեթը: Անսահմանափակ օպտիմալացման ալգորիթմներն արդեն քննարկվել են վերջին հոդվածը. Scipy ֆունկցիաների վերաբերյալ ավելի մանրամասն և արդի օգնություն միշտ կարելի է ստանալ՝ օգտագործելով help() հրամանը, Shift+Tab կամ պաշտոնական փաստաթղթեր.
Ներածություն
Ընդհանուր ինտերֆեյս scipy.optimize փաթեթում պայմանական և անսահմանափակ օպտիմալացման խնդիրները լուծելու համար տրամադրվում է ֆունկցիայի կողմից: minimize(). Սակայն հայտնի է, որ բոլոր խնդիրները լուծելու ունիվերսալ մեթոդ գոյություն չունի, ուստի ադեկվատ մեթոդի ընտրությունը, ինչպես միշտ, ընկնում է հետազոտողի ուսերին։
Համապատասխան օպտիմալացման ալգորիթմը նշվում է ֆունկցիայի փաստարկի միջոցով minimize(..., method="").
Մի քանի փոփոխականների ֆունկցիայի պայմանական օպտիմալացման համար հասանելի են հետևյալ մեթոդների իրականացումը.
SLSQP — հաջորդական քառակուսի ծրագրավորում սահմանափակումներով, Նյուտոնյան մեթոդ Լագրանժի համակարգի լուծման համար։ Վիքի հոդված.
TNC - Կտրված Նյուտոն Կաշկանդված, սահմանափակ թվով կրկնություններ, լավ է մեծ թվով անկախ փոփոխականներով ոչ գծային ֆունկցիաների համար: Վիքի հոդված.
L-BFGS-B — մեթոդ Բրոյդեն–Ֆլետչեր–Գոլդֆարբ–Շաննո թիմից, որն իրականացվել է հիշողության կրճատմամբ՝ Հեսսիական մատրիցից վեկտորների մասնակի բեռնման պատճառով։ Վիքի հոդված, հոդված Habré-ի մասին.
COBYLA — MARE սահմանափակված օպտիմիզացում գծային մոտավորմամբ, սահմանափակված օպտիմալացում գծային մոտավորմամբ (առանց գրադիենտի հաշվարկի): Վիքի հոդված.
Կախված ընտրված մեթոդից, խնդրի լուծման պայմաններն ու սահմանափակումները տարբեր կերպ են սահմանվում.
դասի օբյեկտ Bounds մեթոդների համար L-BFGS-B, TNC, SLSQP, trust-constr;
ցուցակը (min, max) նույն մեթոդների համար L-BFGS-B, TNC, SLSQP, trust-constr;
բառարան կամ բառարանների ցանկ {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} COBYLA, SLSQP մեթոդների համար:
Հոդվածի ուրվագիծ.
1) Դիտարկենք պայմանական օպտիմալացման ալգորիթմի օգտագործումը վստահության տարածաշրջանում (մեթոդ=”վստահություն-կոնստրուկ”)՝ որպես օբյեկտներ նշված սահմանափակումներով Bounds, LinearConstraint, NonlinearConstraint ;
2) Դիտարկենք հաջորդական ծրագրավորումը՝ օգտագործելով նվազագույն քառակուսիների մեթոդը (մեթոդ = «SLSQP») բառարանի ձևով նշված սահմանափակումներով {'type', 'fun', 'jac', 'args'};
3) Վեբ ստուդիայի օրինակով վերլուծել արտադրված արտադրանքի օպտիմալացման օրինակը:
Պայմանական օպտիմալացման մեթոդ = "trust-constr"
Մեթոդի իրականացում trust-constr հիմնված EQSQP հավասարության ձևի սահմանափակումների հետ կապված խնդիրների համար և այլն Ուղեւորություն անհավասարությունների տեսքով սահմանափակումների հետ կապված խնդիրների համար: Երկու մեթոդներն էլ իրականացվում են վստահության տարածաշրջանում տեղական նվազագույնը գտնելու ալգորիթմների միջոցով և հարմար են լայնածավալ խնդիրների համար:
Ընդհանուր ձևով նվազագույնը գտնելու խնդրի մաթեմատիկական ձևակերպում.
Հավասարության խիստ սահմանափակումների դեպքում ստորին սահմանը հավասար է վերին սահմանին .
Միակողմանի սահմանափակումների համար սահմանվում է վերին կամ ստորին սահմանը np.inf համապատասխան նշանով։
Թող անհրաժեշտ լինի գտնել երկու փոփոխականների հայտնի Ռոզենբրոկ ֆունկցիայի նվազագույնը.
Այս դեպքում դրա սահմանման տիրույթում սահմանվում են հետևյալ սահմանափակումները.
Մեր դեպքում կետում եզակի լուծում կա , որի համար գործում են միայն առաջին և չորրորդ սահմանափակումները։
Եկեք ներքևից վերև անցնենք սահմանափակումների միջով և տեսնենք, թե ինչպես կարող ենք դրանք գրառել:
Սահմանափակումները и եկեք սահմանենք այն՝ օգտագործելով Bounds օբյեկտը:
Սահմանափակումների համար Յակոբյան մատրիցը կարող է հաշվարկվել նաև վերջավոր տարբերությունների միջոցով: Այնուամենայնիվ, այս դեպքում Հեսսի մատրիցը չի կարող հաշվարկվել վերջավոր տարբերությունների միջոցով: Hessian-ը պետք է սահմանվի որպես ֆունկցիա կամ օգտագործելով HessianUpdateStrategy դասը:
Որպես այլընտրանք, օպտիմիզացված ֆունկցիայի առաջին և երկրորդ ածանցյալները կարող են մոտավոր լինել: Օրինակ, Հեսսիանը կարելի է մոտավորել՝ օգտագործելով ֆունկցիան SR1 (քվազի-նյուտոնյան մոտարկում): Գրադիենտը կարելի է մոտավորել վերջավոր տարբերություններով։
from scipy.optimize import SR1
res = minimize(rosen, x0, method='trust-constr', jac="2-point", hess=SR1(),
constraints=[linear_constraint, nonlinear_constraint],
options={'verbose': 1}, bounds=bounds)
print(res.x)
Պայմանական օպտիմալացման մեթոդ = "SLSQP"
SLSQP մեթոդը նախատեսված է գործառույթը նվազագույնի հասցնելու խնդիրները լուծելու ձևով.
Որտեղ и - հավասարությունների կամ անհավասարությունների տեսքով սահմանափակումները նկարագրող արտահայտությունների ինդեքսների մի շարք: — ֆունկցիայի սահմանման տիրույթի ստորին և վերին սահմանների հավաքածուներ:
Գծային և ոչ գծային սահմանափակումները նկարագրվում են բանալիներով բառարանների տեսքով type, fun и jac.
ineq_cons = {'type': 'ineq',
'fun': lambda x: np.array ([1 - x [0] - 2 * x [1],
1 - x [0] ** 2 - x [1],
1 - x [0] ** 2 + x [1]]),
'jac': lambda x: np.array ([[- 1.0, -2.0],
[-2 * x [0], -1.0],
[-2 * x [0], 1.0]])
}
eq_cons = {'type': 'eq',
'fun': lambda x: np.array ([2 * x [0] + x [1] - 1]),
'jac': lambda x: np.array ([2.0, 1.0])
}
Optimization terminated successfully. (Exit mode 0)
Current function value: 0.34271757499419825
Iterations: 4
Function evaluations: 5
Gradient evaluations: 4
[0.41494475 0.1701105 ]
Օպտիմալացման օրինակ
Հինգերորդ տեխնոլոգիական կառուցվածքին անցնելու հետ կապված՝ նայենք արտադրության օպտիմալացմանը՝ օգտագործելով վեբ ստուդիայի օրինակը, որը մեզ բերում է փոքր, բայց կայուն եկամուտ։ Եկեք պատկերացնենք մեզ որպես ճաշարանի տնօրեն, որն արտադրում է երեք տեսակի ապրանք.
x0 - վայրէջքի էջերի վաճառք, սկսած 10 տր.
x1 - կորպորատիվ կայքեր, սկսած 20 տր.
x2 - առցանց խանութներ, սկսած 30 տր.
Մեր ընկերական աշխատանքային թիմը ներառում է չորս կրտսեր, երկու միջին և մեկ ավագ: Նրանց ամսական աշխատանքային ժամանակի ֆոնդը.
հունիս: 4 * 150 = 600 чел * час,
միջիններ: 2 * 150 = 300 чел * час,
ավագ: 150 чел * час.
Թող առաջին հասանելի կրտսերը (0, 1, 2) ժամ ծախսի մեկ տիպի (x10, x20, x30) կայքի մշակման և տեղակայման վրա, միջին - (7, 15, 20), ավագ - (5, 10, 15): ) Ձեր կյանքի լավագույն ժամանակի ժամերը:
Ինչպես ցանկացած նորմալ տնօրեն, մենք ցանկանում ենք առավելագույնի հասցնել ամսական շահույթը: Հաջողության հասնելու առաջին քայլը օբյեկտիվ ֆունկցիան գրելն է value որպես ամսական արտադրված ապրանքներից եկամտի չափ.
Եվ վերջապես, ամենավարդագույն ենթադրությունն այն է, որ ցածր գնի և բարձր որակի պատճառով մեզ համար անընդհատ գոհ հաճախորդների հերթ է գոյանում: Մենք կարող ենք ինքներս ընտրել արտադրության ամսական ծավալները՝ հիմնվելով սահմանափակ օպտիմալացման խնդրի լուծման վրա scipy.optimize:
Եզրակացություն. որպեսզի տնօրենը ստանա իր արժանի առավելագույնը, օպտիմալ է ստեղծել ամսական 8 վայրէջք էջ, 6 միջին չափի կայք և 3 խանութ։ Այս դեպքում ավագը պետք է հերկի՝ առանց մեքենայից վեր նայելու, միջնամասերի ծանրաբեռնվածությունը կլինի մոտավորապես 2/3, կրտսերներինը՝ կեսից պակաս։
Ամփոփում
Հոդվածում ներկայացված են փաթեթի հետ աշխատելու հիմնական տեխնիկան scipy.optimize, օգտագործվում է պայմանական նվազագույնի հասցնելու խնդիրները լուծելու համար։ Անձամբ ես օգտագործում եմ scipy զուտ ակադեմիական նպատակներով, այդ իսկ պատճառով բերված օրինակը նման զավեշտական բնույթ ունի։
Շատ տեսական և վիրտուալ օրինակներ կարելի է գտնել, օրինակ, Ի.Լ. Ակուլիչի «Մաթեմատիկական ծրագրավորումը օրինակներում և խնդիրներում» գրքում: Ավելի հարդքոր հավելված scipy.optimize մի շարք պատկերներից կառուցել 3D կառուցվածք (հոդված Habré-ի մասին) կարելի է դիտել scipy-cookbook.
Տեղեկատվության հիմնական աղբյուրն է docs.scipy.orgնրանք, ովքեր ցանկանում են նպաստել այս և այլ բաժինների թարգմանությանը scipy Բարի գալուստ GitHub.
Շնորհակալություն մեֆիստոֆեներ հրապարակման պատրաստմանը մասնակցելու համար։