🐍 Π›ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° Python

Рассмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ максимизации ΠΏΡ€ΠΈΠ±Ρ‹Π»ΠΈ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹Π΅ особСнности Π·Π°Π΄Π°Ρ‡ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования. Π’ качСствС высокоуровнСвых инструмСнтов – Python, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ SciPy ΠΈ PuLP.

Данная публикация прСдставляСт собой сокращСнный ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ руководства ΠœΠΈΡ€ΠΊΠΎ Π‘Ρ‚ΠΎΠΆΠΈΠ»ΠΊΠΎΠ²ΠΈΡ‡Π° Hands-On Linear Programming: Optimization With Python. Для удобства Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ тСкст ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Ρ‚Π°ΠΊΠΆΠ΅ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π² Π²ΠΈΠ΄Π΅ Jupyter-Π±Π»ΠΎΠΊΠ½ΠΎΡ‚Π°.

***

Π›ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ – это Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² матСматичСском ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… матСматичСской ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. Π­Ρ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ систСм Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Ρ… ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ ΠΈ нСравСнств, ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ стоит Ρ†Π΅Π»ΡŒ максимизации ΠΈΠ»ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π›ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π½Π°ΡƒΡ‡Π½Ρ‹Ρ… вычислСниях, экономикС, тСхничСских Π½Π°ΡƒΠΊΠ°Ρ…, производствС, транспортС, Π²ΠΎΠ΅Π½Π½ΠΎΠΌ Π΄Π΅Π»Π΅, логистикС, энСргСтикС ΠΈ Ρ‚. Π΄.

ЭкосистСма Python Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ нСсколько ΠΌΠΎΡ‰Π½Ρ‹Ρ… инструмСнтов Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования. Из этого руководства Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅:

  • Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π² Ρ‡Π΅ΠΌ Π΅Π³ΠΎ польза;
  • ΠΊΠ°ΠΊΠΈΠ΅ инструмСнты Python подходят для Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования;
  • ΠΊΠ°ΠΊ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ модСль ΠΈ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования Π½Π° Python.

Π§Ρ‚ΠΎ собой прСдставляСт Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

БистСмы Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Ρ… ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ ΠΈ нСравСнств часто ΠΈΠΌΠ΅ΡŽΡ‚ мноТСство Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ.

Π›ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ – это Π½Π°Π±ΠΎΡ€ матСматичСских ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… инструмСнтов, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… Π½Π°ΠΉΡ‚ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ систСмы, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ соотвСтствуСт максимуму ΠΈΠ»ΠΈ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π›ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ – это Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, дСсятилСтиями примСняСмый Π² областях, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… большого объСма матСматичСских вычислСний. Π­Ρ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ‚ΠΎΡ‡Π½Ρ‹, ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ быстры ΠΈ подходят для мноТСства практичСских ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

БмСшанно-цСлочислСнноС Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ – это Π²ΠΈΠ΄ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ фокусируСтся Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π·Π°Π΄Π°Ρ‡, Π³Π΄Π΅ хотя Π±Ρ‹ ΠΎΠ΄Π½Π° пСрСмСнная ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ дискрСтныС Ρ†Π΅Π»Ρ‹Π΅, Π° Π½Π΅ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎ ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ значСния.

ЦСлочислСнныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²Π°ΠΆΠ½Ρ‹ для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ прСдставлСния количСств, СстСствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Ρ… Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ число Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… самолСтов ΠΈΠ»ΠΈ количСство обслуТСнных ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².

ОсобСнно Π²Π°ΠΆΠ½Ρ‹ΠΌ Π²ΠΈΠ΄ΠΎΠΌ цСлочислСнных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ лишь значСния 0 ΠΈΠ»ΠΈ 1, ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΈ принятии Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π²ΠΈΠ΄Π° Β«Π΄Π°Β»/Β«Π½Π΅Ρ‚Β». НапримСр, слСдуСт Π»ΠΈ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π·Π°Π²ΠΎΠ΄, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠ°ΡˆΠΈΠ½Ρƒ. Π’Π°ΠΊΠΆΠ΅ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ логичСских ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ.

БмСшанно-цСлочислСнноС Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ позволяСт ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ограничСния Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования. МоТно Π°ΠΏΠΏΡ€ΠΎΠΊΡΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ кусочно-Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΠ½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, логичСскиС ограничСния ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π­Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊ рСсурсам инструмСнт, Π½ΠΎ достиТСния Π² области ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠ³ΠΎ оборудования ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния сдСлали Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ доступным.

Π›ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования называСтся симплСкс-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, Π΄Ρ€ΡƒΠ³ΠΎΠΉ популярный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ – ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ. Π—Π°Π΄Π°Ρ‡ΠΈ смСшанного цСлочислСнного Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΎΠ»Π΅Π΅ слоТных ΠΈ рСсурсоСмких ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Π΅Ρ‚Π²Π΅ΠΉ ΠΈ Π³Ρ€Π°Π½ΠΈΡ†.

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ всС ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования ΠΈ смСшанно-цСлочислСнного Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования написаны Π½Π° языках Fortran, C ΠΈΠ»ΠΈ C++, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ интСнсивной Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ, часто ΠΎΡ‡Π΅Π½ΡŒ большими. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ инструмСнты Python – это просто ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ интСрфСйсы для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ – солвСрами.

Π’ этом руководствС для опрСдСлСния ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Python-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ SciPy ΠΈ PuLP.

1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π·Π°Π΄Π°Ρ‡ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования

1.1. НСбольшой ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ максимизации:

Нам Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ x ΠΈ y, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ «красноС», «синСС» ΠΈ Β«ΠΆΠ΅Π»Ρ‚ΠΎΠ΅Β» нСравСнства, Π° Ρ‚Π°ΠΊΠΆΠ΅ ограничСния x β‰₯ 0 ΠΈ y β‰₯ 0. ΠŸΡ€ΠΈ этом Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ z.

НСзависимыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ (x ΠΈ y) Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ (decision variables). Ѐункция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (z), – это цСлСвая функция (objective function), функция стоимости (cost function) ΠΈΠ»ΠΈ просто Ρ†Π΅Π»ΡŒ (goal). НСравСнства (ΠΈΠ»ΠΈ уравнСния), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡ‚ΡŒ, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ограничСниями (inequality constraints ΠΈΠ»ΠΈ equality constraints для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ).

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

ΠšΡ€Π°ΡΠ½Π°Ρ линия прСдставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ2x + y = 20, Π° красная ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π½Π°Π΄ Π½Π΅ΠΉ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Π³Π΄Π΅ красноС нСравСнство Π½Π΅ выполняСтся. Аналогично синяя линия – это βˆ’4x + 5y = 10, ТСлтая линия – ΡΡ‚ΠΎβˆ’x + 2y = βˆ’2, ΠΎΠΊΡ€Π°ΡˆΠ΅Π½Π½Ρ‹Π΅ области – Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ плоскости, Π³Π΄Π΅ нСравСнство Π½Π΅ выполняСтся.

КаТдая Ρ‚ΠΎΡ‡ΠΊΠ° сСрой области удовлСтворяСт всСм ограничСниям ΠΈ являСтся ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°Ρ‡ΠΈ. Π­Ρ‚Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ называСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ допустимых Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ (feasible region), Π° Π΅Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ – допустимыми Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ (feasible solutions).

ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ z. РСшСниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ z, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ функция z Π»ΠΈΠ½Π΅ΠΉΠ½Π°. ΠžΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π²Π΅Ρ€ΡˆΠΈΠ½ области допустимых Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ. Иногда вСсь ΠΊΡ€Π°ΠΉ допустимой области ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ вся ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ z.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² Π·Π°Π΄Π°Ρ‡Ρƒ Π²Π²Π΅Π΄Π΅Π½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π² Π²ΠΈΠ΄Π΅ равСнства, ΠΎΠΊΡ€Π°ΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ Π·Π΅Π»Π΅Π½Ρ‹ΠΌ:

Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π·Π΅Π»Π΅Π½ΡƒΡŽ ΠΏΡ€ΡΠΌΡƒΡŽ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ допустимых Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π½Π΅ соотвСтствуСт всСй сСрой Π·ΠΎΠ½Π΅. Π­Ρ‚ΠΎ лишь Ρ‡Π°ΡΡ‚ΡŒ Π·Π΅Π»Π΅Π½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ, проходящСй Ρ‡Π΅Ρ€Π΅Π· ΡΠ΅Ρ€ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ пСрСсСчСния с синСй Π»ΠΈΠ½ΠΈΠ΅ΠΉ Π΄ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ пСрСсСчСния с красной.

Если Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ всС значСния x Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π·Π°Π΄Π°Ρ‡Ρƒ смСшанно-цСлочислСнного Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования, ΠΈ Π½Π°Π±ΠΎΡ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ снова измСнится:

Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π½Π΅Ρ‚ Π·Π΅Π»Π΅Π½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ – Ρ‚ΠΎΠ»ΡŒΠΊΠΎ дискрСтныС Ρ‚ΠΎΡ‡ΠΊΠΈ, Π³Π΄Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x являСтся Ρ†Π΅Π»Ρ‹ΠΌ числом. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ – это Π·Π΅Π»Π΅Π½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π° сСром Ρ„ΠΎΠ½Π΅.

Π­Ρ‚ΠΈ Ρ‚Ρ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования – ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ допустимыС области Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Когда Π½ΠΈ ΠΎΠ΄Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ всС ограничСния сразу, Π·Π°Π΄Π°Ρ‡Π° Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования Π½Π΅Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌΠ°.

1.2. Π—Π°Π΄Π°Ρ‡Π° ΠΎ распрСдСлСнии рСсурсов

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… ΠΌΡ‹ рассмотрСли Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ‚Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования, Π½Π΅ ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ с ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ ΠΎ Π±ΠΎΠ»Π΅Π΅ практичСской Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, связанной с распрСдСлСниСм рСсурсов Π½Π° производствС.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ„Π°Π±Ρ€ΠΈΠΊΠ° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎΠ΅ количСство ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° составляСт x_1, Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° – x_2 ΠΈ Ρ‚. Π΄. ЦСль – ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎΠ³ΠΎ объСма производства для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… условий:

  1. ΠŸΡ€ΠΈΠ±Ρ‹Π»ΡŒ (profit) Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° составляСт 20, 12, 40 ΠΈ 25 Π΄ΠΎΠ»Π»Π°Ρ€ΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² соотвСтствСнно.
  2. Из-Π·Π° Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ силы (manpower) ΠΎΠ±Ρ‰Π΅Π΅ количСство Π΅Π΄ΠΈΠ½ΠΈΡ†, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π² дСнь, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ 50.
  3. На ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ 1-Π³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° расходуСтся 3 Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ ΡΡ‹Ρ€ΡŒΡ A. КаТдая Π΅Π΄ΠΈΠ½ΠΈΡ†Π° 2-Π³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ 2 Π΅Π΄ΠΈΠ½ΠΈΡ† ΡΡ‹Ρ€ΡŒΡ A ΠΈ 1 Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ ΡΡ‹Ρ€ΡŒΡ B. КаТдой Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ 3-Π³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° трСбуСтся 1 Π΅Π΄ΠΈΠ½ΠΈΡ†Π° A ΠΈ 2 Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ B. НаконСц, каТдая Π΅Π΄ΠΈΠ½ΠΈΡ†Π° 4-Π³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‚Ρ€Π΅Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ†. B.
  4. Из-Π·Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ транспортировкС ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΡŽ Ρ„Π°Π±Ρ€ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ Π΄ΠΎ 100 Π΅Π΄ΠΈΠ½ΠΈΡ† ΡΡ‹Ρ€ΡŒΡ A ΠΈ 90 Π΅Π΄ΠΈΠ½ΠΈΡ† B Π² дСнь.

ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ модСль ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

ЦСлСвая функция (ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ) опрСдСляСтся Π² условии 1. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ силы слСдуСт ΠΈΠ· условия 2. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ Π½Π° ΡΡ‹Ρ€ΡŒΠ΅ A ΠΈ B ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ ΠΈΠ· условий 3 ΠΈ 4 ΠΏΡƒΡ‚Π΅ΠΌ суммирования потрСбностСй Π² ΡΡ‹Ρ€ΡŒΠ΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°. НаконСц, количСство ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, эту Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Однако ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅.

2. Π›ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠ°Ρ рСализация

Π’ этом руководствС ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ описанной Π²Ρ‹ΡˆΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования Π΄Π²Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π° Python :

  1. SciPy – ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ для Π½Π°ΡƒΡ‡Π½Ρ‹Ρ… вычислСний с Python. Π•Π³ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ scipy.optimize ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ для Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ, Ρ‚Π°ΠΊ ΠΈ для Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.
  2. PuLP – API Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования Python для опрСдСлСния Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° солвСров. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² качСствС солвСра ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ COIN-OR Branch and Cut Solver (CBC). Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ солвСр с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ – GNU Linear Programming Kit (GLPK).

2.1. Установка SciPy ΠΈ PuLP

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ этому руководству, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ SciPy ΠΈ PuLP.

python -m pip install -U scipy pulp

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ потрСбуСтся Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ pulptest ΠΈΠ»ΠΈ sudo pulptest, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ солвСры PuLP, особСнно Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Linux ΠΈΠ»ΠΈ Mac:

pulptest
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°
ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС солвСра GLPK. Π­Ρ‚ΠΎ бСсплатный солвСр с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Windows, MacOS ΠΈ Linux. О Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ с Π½ΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² PuLP рассказано Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Π’ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ ΠΌΡ‹ ограничимся доступным ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ солвСром CBC.

2.2. ИспользованиС SciPy

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ SciPy ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ поиску ΠΊΠΎΡ€Π½Π΅ΠΉ для Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования. Начнём с ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° scipy.optimize.linprog():

from scipy.optimize import linprog

2.3. РСшСниС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° c ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SciPy

Начнём с Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ (Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠ³ΠΎ) ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

linprog() Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ (Π½Π΅ максимизации) ΠΈ Π½Π΅ допускаСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ-нСравСнств со Π·Π½Π°ΠΊΠΎΠΌ большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ (β‰₯). Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ описаниС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ запуском ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ:

  • ВмСсто максимизации z = x + 2y ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (βˆ’z = βˆ’x βˆ’ 2y).
  • ВмСсто Π·Π½Π°ΠΊΠ° β‰₯ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Β«ΠΆΠ΅Π»Ρ‚ΠΎΠ΅Β» нСравСнство Π½Π° -1 ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ (ограничСния ΠΏΠΎ осям рассмотрим Π΄Π°Π»Π΅Π΅).

На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ шагС опрСдСляСм Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ значСния:

obj = [-1, -2]
#      ─┬  ─┬
#       β”‚   └─ ΠšΠΎΡΡ„Ρ„ΠΈΡ†ΠΈΠ΅Π½Ρ‚ для y
#       └───── ΠšΠΎΡΡ„Ρ„ΠΈΡ†ΠΈΠ΅Π½Ρ‚ для x

lhs_ineq = [[ 2,  1],  # лСвая сторона красного нСравСнства
            [-4,  5],  # лСвая сторона синСго нСравСнства
            [ 1, -2]]  # лСвая сторона ΠΆΠ΅Π»Ρ‚ΠΎΠ³ΠΎ нСравСнства

rhs_ineq = [20,  # правая сторона красного нСравСнства
            10,  # правая сторона синСго нСравСнства
             2]  # правая сторона ΠΆΠ΅Π»Ρ‚ΠΎΠ³ΠΎ нСравСнства

lhs_eq = [[-1, 5]]  # лСвая сторона Π·Π΅Π»Π΅Π½ΠΎΠ³ΠΎ равСнства
rhs_eq = [15]       # правая сторона Π·Π΅Π»Π΅Π½ΠΎΠ³ΠΎ равСнства

ΠœΡ‹ помСстили значСния ΠΈΠ· систСмы Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ списки:

  • obj содСрТит коэффициСнты Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ,
  • lhs_ineq ΠΈ rhs_ineq содСрТат коэффициСнты ΠΈΠ· ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ-нСравСнств,
  • lhs_eq ΠΈ rhs_eq содСрТат коэффициСнты ΠΈΠ· ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ уравнСния.
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
Π‘ΡƒΠ΄ΡŒΡ‚Π΅ остороТны с порядком строк ΠΈ столбцов! ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ строк для Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ сторон ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ. КаТдая строка прСдставляСт ΠΎΠ΄Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ коэффициСнтов Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π»Π΅Π²Ρ‹Ρ… частСй ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ столбСц соотвСтствуСт ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом являСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Ρ€Π°Π½ΠΈΡ† ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΎΠ½ΠΈ находятся ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΡƒΠ»Π΅ΠΌ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ:

bnd = [(0, float("inf")),  # Π“Ρ€Π°Π½ΠΈΡ†Ρ‹ x
       (0, float("inf"))]  # Π“Ρ€Π°Π½ΠΈΡ†Ρ‹ y

Однако эти Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с установлСнными ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² linprog().

НаконСц, ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΡƒΡŽ нас ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ:

opt = linprog(c=obj, A_ub=lhs_ineq, b_ub=rhs_ineq,
              A_eq=lhs_eq, b_eq=rhs_eq, bounds=bnd,
              method="revised simplex")

opt
     con: array([0.])
     fun: -16.818181818181817
 message: 'Optimization terminated successfully.'
     nit: 3
   slack: array([ 0.        , 18.18181818,  3.36363636])
  status: 0
 success: True
       x: array([7.72727273, 4.54545455])

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ c относится ΠΊ коэффициСнтам ΠΈΠ· Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. A_ub ΠΈ b_ub соотвСтствСнно связаны с коэффициСнтами ΠΈΠ· Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ частСй ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ-нСравСнств. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ A_eq ΠΈ b_eq относятся ΠΊ ограничСниям ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ bounds слуТит для указания Π½ΠΈΠΆΠ½Π΅ΠΉ ΠΈ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ† ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ method опрСдСляСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования. Доступны Ρ‚Ρ€ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°:

  • ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ: method = "inner-point",
  • ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ Π΄Π²ΡƒΡ…Ρ„Π°Π·Π½Ρ‹ΠΉ симплСкс-ΠΌΠ΅Ρ‚ΠΎΠ΄ method="revised simplex",
  • симплСкс-ΠΌΠ΅Ρ‚ΠΎΠ΄ method="simplex"

linprog() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ структуру Π΄Π°Π½Π½Ρ‹Ρ… со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ:

  • .con – остатки ограничСния-равСнства;
  • .fun – ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Ссли Π½Π°ΠΉΠ΄Π΅Π½ΠΎ);
  • .message – словСсный статус Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ;
  • .nit – количСство ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ расчСта;
  • .slack – значСния Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… – Ρ€Π°Π·Π½ΠΈΡ† ΠΌΠ΅ΠΆΠ΄Ρƒ значСниями Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ сторонами ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ;
  • .status – Ρ†Π΅Π»ΠΎΠ΅ число ΠΎΡ‚ 0 Π΄ΠΎ 4, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 0, ΠΊΠΎΠ³Π΄Π° Π±Ρ‹Π»ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅;
  • .success – логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅, Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π»ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅;
  • .x – массив NumPy, содСрТащий ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Доступ ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:

>>> opt.fun
-16.818181818181817
>>> opt.success
True
>>> opt.x
array([7.72727273, 4.54545455])

ГрафичСски Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Π’Π½Π°Ρ‡Π°Π»Π΅ наша Π·Π°Π΄Π°Ρ‡Π° ΠΎΡ€Π³Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π»Π°ΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСравСнствами. Если ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π·Π΅Π»Π΅Π½ΠΎΠ³ΠΎ уравнСния A_eq ΠΈ b_eq ΠΈΠ· Π²Ρ‹Π·ΠΎΠ²Π° linprog(), ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

opt = linprog(c=obj, A_ub=lhs_ineq, b_ub=rhs_ineq, bounds=bnd,
              method="revised simplex")

opt
     con: array([], dtype=float64)
     fun: -20.714285714285715
 message: 'Optimization terminated successfully.'
     nit: 2
   slack: array([0.        , 0.        , 9.85714286])
  status: 0
 success: True
       x: array([6.42857143, 7.14285714])

2.4. РСшСниС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎ производствС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SciPy

Рассмотрим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ – ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°Ρ…, Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ силС ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌ ΡΡ‹Ρ€ΡŒΠ΅.

Как ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΈΠ· Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΡ… Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² linprog():

obj = [-20, -12, -40, -25]

lhs_ineq = [[1, 1, 1, 1],  # Рабочая сила
            [3, 2, 1, 0],  # ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» A
            [0, 1, 2, 3]]  # ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» B

rhs_ineq = [ 50,  # Рабочая сила
            100,  # ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» A
             90]  # ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» B

opt = linprog(c=obj, A_ub=lhs_ineq, b_ub=rhs_ineq,
              method="revised simplex")

opt
     con: array([], dtype=float64)
     fun: -1900.0
 message: 'Optimization terminated successfully.'
     nit: 2
   slack: array([ 0., 40.,  0.])
  status: 0
 success: True
       x: array([ 5.,  0., 45.,  0.])

Максимальная ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ составляСт 1900 ΠΈ соотвСтствуСт x_1 = 5 ΠΈ x_3 = 45. Π’ Π΄Π°Π½Π½Ρ‹Ρ… условиях ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹ Π½Π΅Π²Ρ‹Π³ΠΎΠ΄Π½ΠΎ. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ позволяСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСсколько интСрСсных Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ²:

  1. Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ приносит Π½Π°ΠΈΠ±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ.
  2. ΠŸΠ΅Ρ€Π²Π°Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ пСрСмСнная (slack) Ρ€Π°Π²Π½Π° 0. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ€Π°Π²Π½Ρ‹ значСния Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ сторон ограничСния для Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ силы. Π—Π°Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ 50 Π΅Π΄ΠΈΠ½ΠΈΡ† Π² дСнь, ΠΈ это Π΅Π³ΠΎ полная ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ.
  3. Вторая Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ пСрСмСнная Ρ€Π°Π²Π½Π° 40: Ρ„Π°Π±Ρ€ΠΈΠΊΠ° потрСбляСт 60 Π΅Π΄ΠΈΠ½ΠΈΡ† ΡΡ‹Ρ€ΡŒΡ A (15 Π΅Π΄ΠΈΠ½ΠΈΡ† для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΈ 45 для Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ) ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… 100 Π΅Π΄ΠΈΠ½ΠΈΡ†.
  4. Π’Ρ€Π΅Ρ‚ΡŒΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ пСрСмСнная Ρ€Π°Π²Π΅Π½ 0: Ρ„Π°Π±Ρ€ΠΈΠΊΠ° потрСбляСт всС 90 Π΅Π΄ΠΈΠ½ΠΈΡ† ΡΡ‹Ρ€ΡŒΡ B. ΠŸΡ€ΠΈ этом всС это количСство потрСбляСтся для производства Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ„Π°Π±Ρ€ΠΈΠΊΠ° Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ Ρ‚ΠΎΠ²Π°Ρ€ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ произвСсти Π±ΠΎΠ»Π΅Π΅ 45 Π΅Π΄ΠΈΠ½ΠΈΡ† Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Ρ‚ΠΎΠ²Π°Ρ€Π°. CΡ‹Ρ€ΡŒΡ B просто Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚.

ВозмоТности Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования SciPy ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π² основном для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π·Π°Π΄Π°Ρ‡. Для Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… ΠΈ слоТных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:

  • SciPy Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с цСлочислСнными ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.
  • SciPy Π½Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ запуск Π²Π½Π΅ΡˆΠ½ΠΈΡ… солвСров.
  • SciPy Π½Π΅ прСдоставляСт классы ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для построСния ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ массивы ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ для ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ слишком ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ.
  • Π’Π°ΠΊΠΆΠ΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ приходится ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠ°ΠΊ ΠΌΡ‹ это сдСлали Π²Ρ‹ΡˆΠ΅.

2.5. РСшСниС ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PuLP

Π˜Ρ‚Π°ΠΊ, PuLP ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ API Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ программирования, Ρ‡Π΅ΠΌ SciPy. НачнСм с ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°.

from pulp import LpMaximize, LpProblem, LpStatus, lpSum, LpVariable

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ шаг – ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ экзСмпляр LpProblem для описания ΠΌΠΎΠ΄Π΅Π»ΠΈ:

model = LpProblem(name="small-problem", sense=LpMaximize)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ sense опрСдСляСт, Ρ€Π΅ΡˆΠ°Π΅ΠΌ Π»ΠΈ ΠΌΡ‹ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ LpMinimize ΠΈΠ»ΠΈ 1, установлСн ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) ΠΈΠ»ΠΈ максимизации (LpMaximize ΠΈΠ»ΠΈ -1).

Π‘ΠΎΠ·Π΄Π°Π² модСль, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊ экзСмпляры класса LpVariable:

x = LpVariable(name="x", lowBound=0)
y = LpVariable(name="y", lowBound=0)

ЗначСния Π³Ρ€Π°Π½ΠΈΡ† ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ – ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ бСсконСчности, поэтому Π² нашСм случаС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ниТнюю Π³Ρ€Π°Π½ΠΈΡ†Ρƒ (lowBound = 0).

ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ cat опрСдСляСт ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ "Continuous".

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ x ΠΈ y Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания Π΄Ρ€ΡƒΠ³ΠΈΡ… PuLP-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ выраТСния ΠΈ ограничСния:

expression = 2 * x + 4 * y
print(type(expression))
constraint = 2 * x + 4 * y >= 8
print(type(constraint))
<class 'pulp.pulp.LpAffineExpression'>
<class 'pulp.pulp.LpConstraint'>

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΠ² Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ экзСмпляр pulp.LpAffineExpression, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. ВыраТСния ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ==, <= ΠΈ >= ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ экзСмпляры pulp.LpConstraint – Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ ограничСния вашСй ΠΌΠΎΠ΄Π΅Π»ΠΈ.

ОпишСм Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ограничСния. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ SciPy, с PuLP Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ списки ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹. ΠŸΡ€ΠΎΡΡ‚ΠΎ записываСм выраТСния Python ΠΈ добавляСм Π² модСль с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° +=:

model += (2 * x + y <= 20, "red_constraint")
model += (4 * x - 5 * y >= -10, "blue_constraint")
model += (-x + 2 * y >= -2, "yellow_constraint")
model += (-x + 5 * y == 15, "green_constraint")

LpProblem позволяСт Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ограничСния Π² модСль, опрСдСляя ΠΈΡ… ΠΊΠ°ΠΊ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° – экзСмпляр LpConstraint, Π²Ρ‚ΠΎΡ€ΠΎΠΉ – Π΅Π³ΠΎ ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠ΅ имя.

Аналогично описываСтся цСлСвая функция:

obj_func = x + 2 * y
model += obj_func

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ:

>>> model

small-problem:
MAXIMIZE
1*x + 2*y + 0
SUBJECT TO
red_constraint: 2 x + y <= 20

blue_constraint: 4 x - 5 y >= -10

yellow_constraint: - x + 2 y >= -2

green_constraint: - x + 5 y = 15

VARIABLES
x Continuous
y Continuous

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²ΠΎΠ΅ прСдставлСниС ΠΌΠΎΠ΄Π΅Π»ΠΈ содСрТит всС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅: Ρ†Π΅Π»ΡŒ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ограничСния ΠΈ ΠΈΡ… ΠΈΠΌΠ΅Π½Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ. Достаточно лишь Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ .solve() для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ.

status = model.solve()

ΠœΠ΅Ρ‚ΠΎΠ΄ .solve() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ солвСр, измСняСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ цСлочислСнный статус Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Ρ€Π°Π²Π½Ρ‹ΠΉ 1, Ссли Π½Π°ΠΉΠ΄Π΅Π½ ΠΎΠΏΡ‚ΠΈΠΌΡƒΠΌ. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹ состояний описаны Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ доступны Π² Π²ΠΈΠ΄Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΌΠΎΠ΄Π΅Π»ΠΈ:

print(f"status: {model.status}, {LpStatus[model.status]}")

print(f"objective: {model.objective.value()}")

for var in model.variables():
    print(f"{var.name}: {var.value()}")
    
for name, constraint in model.constraints.items():
    print(f"{name}: {constraint.value()}")
status: 1, Optimal
objective: 16.8181817
x: 7.7272727
y: 4.5454545
red_constraint: -9.99999993922529e-08
blue_constraint: 18.181818300000003
yellow_constraint: 3.3636362999999996
green_constraint: -2.0000000233721948e-07

model.objective содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, model.constraints – значСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ x ΠΈ y ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρƒ SciPy.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ смСшанно-цСлочислСнноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, достаточно ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ΡŒ это ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° cat:

# БоздаСм модСль
model = LpProblem(name="small-problem", sense=LpMaximize)

# Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ: x - Ρ†Π΅Π»ΠΎΠ΅ число, y мСняСтся Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎ
x = LpVariable(name="x", lowBound=0, cat="Integer")
y = LpVariable(name="y", lowBound=0)

# ДобавляСм ограничСния
model += (2 * x + y <= 20, "red_constraint")
model += (4 * x - 5 * y >= -10, "blue_constraint")
model += (-x + 2 * y >= -2, "yellow_constraint")
model += (-x + 5 * y == 15, "green_constraint")

# ДобавляСм Ρ†Π΅Π»Π΅Π²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
# Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ добавлСния Ρ‡Π΅Ρ€Π΅Π· lpSum
model += lpSum([x, 2 * y])

# РСшаСм Π·Π°Π΄Π°Ρ‡Ρƒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ
status = model.solve()
print(f"status: {model.status}, {LpStatus[model.status]}")

print(f"objective: {model.objective.value()}")

for var in model.variables():
    print(f"{var.name}: {var.value()}")
    
for name, constraint in model.constraints.items():
    print(f"{name}: {constraint.value()}")
status: 1, Optimal
objective: 15.8
x: 7.0
y: 4.4
red_constraint: -1.5999999999999996
blue_constraint: 16.0
yellow_constraint: 3.8000000000000007
green_constraint: 0.0

Π’Π΅ΠΏΠ΅Ρ€ΡŒ x – Ρ†Π΅Π»ΠΎΠ΅ число, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚ мСняСт Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. ПокаТСм это Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅:

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ являСтся крайняя правая зСлСная Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° сСром Ρ„ΠΎΠ½Π΅. Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с наибольшими значСниями ΠΊΠ°ΠΊ x, Ρ‚Π°ΠΊ ΠΈ y, Π΄Π°ΡŽΡ‰Π΅Π΅ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

2.6. РСшСниС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎ производствС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PuLP

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

# ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ модСль
model = LpProblem(name="resource-allocation", sense=LpMaximize)

# ΠžΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
x = {i: LpVariable(name=f"x{i}", lowBound=0) for i in range(1, 5)}

# ДобавляСм ограничСния
model += (lpSum(x.values()) <= 50, "manpower")
model += (3 * x[1] + 2 * x[2] + x[3] <= 100, "material_a")
model += (x[2] + 2 * x[3] + 3 * x[4] <= 90, "material_b")

# ΠžΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ Ρ†Π΅Π»ΡŒ
model += 20 * x[1] + 12 * x[2] + 40 * x[3] + 25 * x[4]

# РСшаСм Π·Π°Π΄Π°Ρ‡Ρƒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ
status = model.solve()

# Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ
print(f"status: {model.status}, {LpStatus[model.status]}")
print(f"objective: {model.objective.value()}")

for var in x.values():
    print(f"{var.name}: {var.value()}")

for name, constraint in model.constraints.items():
    print(f"{name}: {constraint.value()}")
status: 1, Optimal
objective: 1900.0
x1: 5.0
x2: 0.0
x3: 45.0
x4: 0.0
manpower: 0.0
material_a: -40.0
material_b: 0.0

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ согласуСтся с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SciPy. НаиболСС Π²Ρ‹Π³ΠΎΠ΄Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ – ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π² дСнь 5 Π΅Π΄ΠΈΠ½ΠΈΡ† ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΈ 45 Π΅Π΄ΠΈΠ½ΠΈΡ† Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм Π·Π°Π΄Π°Ρ‡Ρƒ Π±ΠΎΠ»Π΅Π΅ интСрСсной. Допустим, ΠΈΠ·-Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Ρ„Π°Π±Ρ€ΠΈΠΊΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΡŽ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. КакоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Ρ‹Π³ΠΎΠ΄Π½ΠΎ Π² этом случаС?

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ логичСскоС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅: Ссли x_1 ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΠΎ x_3 Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°Π²Π½ΡΡ‚ΡŒΡΡ Π½ΡƒΠ»ΡŽ, ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Π—Π΄Π΅ΡΡŒ пригодятся Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. Π’Π²Π΅Π΄Π΅ΠΌ Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ y_1 ΠΈ y_3, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ»ΠΈ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹:

model = LpProblem(name="resource-allocation", sense=LpMaximize)

x = {i: LpVariable(name=f"x{i}", lowBound=0) for i in range(1, 5)}
y = {i: LpVariable(name=f"y{i}", cat="Binary") for i in (1, 3)}

model += (lpSum(x.values()) <= 50, "manpower")
model += (3 * x[1] + 2 * x[2] + x[3] <= 100, "material_a")
model += (x[2] + 2 * x[3] + 3 * x[4] <= 90, "material_b")

M = 100
model += (x[1] <= y[1] * M, "x1_constraint")
model += (x[3] <= y[3] * M, "x3_constraint")
model += (y[1] + y[3] <= 1, "y_constraint")

model += 20 * x[1] + 12 * x[2] + 40 * x[3] + 25 * x[4]

status = model.solve()

print(f"status: {model.status}, {LpStatus[model.status]}")
print(f"objective: {model.objective.value()}")

for var in model.variables():
    print(f"{var.name}: {var.value()}")

for name, constraint in model.constraints.items():
    print(f"{name}: {constraint.value()}")
status: 1, Optimal
objective: 1800.0
x1: 0.0
x2: 0.0
x3: 45.0
x4: 0.0
y1: 0.0
y3: 1.0
manpower: -5.0
material_a: -55.0
material_b: 0.0
x1_constraint: 0.0
x3_constraint: -55.0
y_constraint: 0.0

ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΈΡ… условиях оказываСтся, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ – ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ вовсС ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π² ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π°Ρ… прСдставляСтС, с ΠΊΠ°ΠΊΠΈΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Python для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ – послС прохоТдСния этого руководства – Π²Ρ‹ ΡƒΠΌΠ΅Π΅Ρ‚Π΅:

  • ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ модСль, которая описываСт Π·Π°Π΄Π°Ρ‡Ρƒ Π² SciPy ΠΈ PuLP;
  • ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Python для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ;
  • Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ;
  • ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, Π²ΠΎΡ‚ нСсколько ΠΎΡ‚ΠΏΡ€Π°Π²Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ:

Π‘Π»Π΅Π΄ΠΈΡ‚Π΅ Π·Π° нашими Ρ‚Π΅Π³Π°ΠΌΠΈ Python ΠΈ ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ°!

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста». Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡƒΡ‡Π΅Π±Π½Ρ‹ΠΉ курс ΠΏΠΎ Python ΠΎΡ‚ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ программиста».

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
16 ноября 2019

DeepFake-Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»: создаСм собствСнный Π΄ΠΈΠΏΡ„Π΅ΠΉΠΊ Π² DeepFaceLab

РассказываСм ΠΎ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ DeepFake ΠΈ шаг Π·Π° шагом учимся Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΈΠΏΡ„Π΅ΠΉΠΊΠΈ Π² ...
admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
14 июля 2017

ПишСм свою Π½Π΅ΠΉΡ€ΠΎΡΠ΅Ρ‚ΡŒ: пошаговоС руководство

ΠžΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ Π³Π°ΠΉΠ΄ ΠΏΡ€ΠΎ Π½Π΅ΠΉΡ€ΠΎΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΊ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ ΠΈΠ· ΠΊΠ°ΠΊΠΈΡ… элСмС...