ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ для срСды WWW

Π Π΅Ρ„Π΅Ρ€Π°Ρ‚ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π’ ΡΠ»ΡƒΡ‡Π°Π΅, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сСрвСр Netscape Fast Track Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° NSAPI. ΠŸΠΎΡ…ΠΎΠΆΠ°Ρ тСхнология примСняСтся ΠΈ Π² ΡΠ΅Ρ€Π²Π΅Ρ€Π°Ρ… Microsoft (IIS — Internet Information Server ΠΈ ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Web-сСрвСр) — ISAPI. Бмысл ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ содСрТится Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ экзСмплярС (Π² Π²ΠΈΠ΄Π΅ динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ) Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ CGI, ΠΊΠΎΠ³Π΄Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ для срСды WWW (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Π’ Π½Π°ΡΡ‚оящСС врСмя ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π΅ возмоТности для написания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² Internet: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π° ΡΠ΅Ρ€Π²Π΅Ρ€Π΅ ΠΈΠ»ΠΈ ΠΆΠ΅ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ской машинС (часто эти Π΄Π²Π° способа ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ). Оба способа ΠΈΠΌΠ΅ΡŽΡ‚ свои достоинства ΠΈ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΠΊΠΈ. ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ нСдостатком Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ выполнСния ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎ. Π’ ΡΠ²ΡΠ·ΠΈ с ΡΡ‚ΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ обучСния ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ.

Π’ ΡΠ»ΡƒΡ‡Π°Π΅ нСобходимости ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, выполняСмыС Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ской машинС. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ эти ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ языков Java, JavaScript ΠΈΠ»ΠΈ Visual Basic (ActiveX). ПослСдняя тСхнология поддСрТиваСтся ΠΏΠΎΠΊΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠΌ Internet Explorer Ρ„ΠΈΡ€ΠΌΡ‹ Microsoft. JavaScript Π² Π²Π΅Ρ€ΡΠΈΠΈ 1.2 Π½Π° ΡΠ΅Π³ΠΎΠ΄Π½Ρ поддСрТиваСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ Communicator Ρ„ΠΈΡ€ΠΌΡ‹ Netscape (вСрсия 1.1 поддСрТиваСтся ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ), Π° Ρ‚Схнология Java 1.1 Ρ…ΠΎΡ‚ΡŒ ΠΈ ΠΏΡ€Π΅Ρ‚Π΅Π½Π΄ΡƒΠ΅Ρ‚ Π½Π° ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚, Π½ΠΎ Ρ„ΠΈΡ€ΠΌΡ‹-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ (Π² Ρ‡Π°ΡΡ‚ности, Microsoft) стрСмятся Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ возмоТности языка, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡ‚имости.

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

Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ·Π±Π°Π²Π»Π΅Π½Ρ‹ ΠΎΡ‚ Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡ‚имости. Для Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ функционирования сСрвСрных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ часто Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° всСго лишь ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ стандарта HTML v.3, Π° ΡΡ‚Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ имССтся Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈ Ρ€ΠΎΡΡΠΈΠΉΡΠΊΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ariadna).

Бпособ написания сСрвСрной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ зависит ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ сСрвСра. НапримСр, Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ… UNIX-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… Π²Ρ‹Π±ΠΎΡ€ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ CGI (Common Gateway Interface), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΈΡˆΡƒΡ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ C (ΠΈΠ»ΠΈ C++) ΠΈΠ»ΠΈ ΠΆΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹Ρ… языках Ρ‚ΠΈΠΏΠ° Perl. На ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… станциях Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ ΡΠ·Ρ‹ΠΊ Java.

Π’ ΡΠ»ΡƒΡ‡Π°Π΅, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сСрвСр Netscape Fast Track Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° NSAPI. ΠŸΠΎΡ…ΠΎΠΆΠ°Ρ тСхнология примСняСтся ΠΈ Π² ΡΠ΅Ρ€Π²Π΅Ρ€Π°Ρ… Microsoft (IIS — Internet Information Server ΠΈ ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Web-сСрвСр) — ISAPI. Бмысл ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ содСрТится Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ экзСмплярС (Π² Π²ΠΈΠ΄Π΅ динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ) Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ CGI, ΠΊΠΎΠ³Π΄Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ создаСтся новая срСда функционирования ΠΊΠΎΠΏΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ CGI ΠΏΠΈΡˆΡƒΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Π΅ прилоТСния, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ стандартного Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΠ½ΠΈ выводят содСрТимоС гипСртСкстового Ρ„Π°ΠΉΠ»Π°.

Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, выполняСмой Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ской машинС Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ прСдлагаСтся Java-Π°ΠΏΠΏΠ»Π΅Ρ‚, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΡΠ°ΠΌΠΎΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ…ΡΡ ΠΊΠ°Ρ€Ρ‚ ΠšΠΎΡ…ΠΎΠ½Π΅Π½Π°. АпплСт позволяСт ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ характСристики сСти ΠšΠΎΡ…ΠΎΠ½Π΅Π½Π° ΠΈ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π·Π° ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΠΌ автоматичСской классификации (кластСризации) ΠΎΠ±Ρ€Π°Π·ΠΎΠ². Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΡΠ΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ 3-Ρ… ΠΌΠ΅Ρ€Π½ΠΎΠ΅ Ρ†Π²Π΅Ρ‚Π½ΠΎΠ΅ RGB ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° 2-Ρ… ΠΌΠ΅Ρ€Π½ΡƒΡŽ сСтку.

На Ρ€ΠΈΡ. 1 ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΎ ΠΊΠ°ΠΊ выглядит ΠΎΠΊΠ½ΠΎ Π±Ρ€ΠΎΡƒΠ·Π΅Ρ€Π° послС Π²Ρ…ΠΎΠ΄Π° Π½Π° ΡΡ‚Ρ€Π°Π½ΠΈΡ†Ρƒ с Π°ΠΏΠΏΠ»Π΅Ρ‚ΠΎΠΌ.

АпплСт, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΡΠ°ΠΌΠΎΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ…ΡΡ ΠΊΠ°Ρ€Ρ‚ ΠšΠΎΡ…ΠΎΠ½Π΅Π½Π°.
Рис. 1. АпплСт, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΡΠ°ΠΌΠΎΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ…ΡΡ ΠΊΠ°Ρ€Ρ‚ ΠšΠΎΡ…ΠΎΠ½Π΅Π½Π°.

Рис. 1. АпплСт, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΡΠ°ΠΌΠΎΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ…ΡΡ ΠΊΠ°Ρ€Ρ‚ ΠšΠΎΡ…ΠΎΠ½Π΅Π½Π°.

Π—Π΄Π΅ΡΡŒ каТдая ячСйка сСтки ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ элСмСнт (Π½Π΅ΠΉΡ€ΠΎΠ½) Π½Π΅ΠΉΡ€ΠΎΠ½Π½ΠΎΠΉ сСти. ΠšΡ€ΡƒΠ³ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ Π½Π΅ΠΉΡ€ΠΎΠ½Ρ‹-" ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΠΈ". Π¦Π²Π΅Ρ‚ (состоящий ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠΎΠ²: красный, Π·Π΅Π»Π΅Π½Ρ‹ΠΉ, синий) прСдставляСтся Π² ΡΠ΅Ρ‚ΠΈ Π² Π²ΠΈΠ΄Π΅ числового Π²Π΅ΠΊΡ‚ΠΎΡ€Π°. ΠŸΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСти Ρ†Π²Π΅Ρ‚ ячССк выбираСтся случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ — эти значСния ΠΈ ΡΠ²Π»ΡΡŽΡ‚ся Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ сСти. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠΈΠ³ΠΌΠΎΠΈΠ΄Π°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΡΠ΅Ρ‚ΡŒ ΠšΠΎΡ…ΠΎΠ½Π΅Π½Π° располагаСт ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ элСмСнты рядом ΠΈ ΠΏΠΎΠ΄ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅Ρ‚ вСса. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π°ΠΏΠΏΠ»Π΅Ρ‚ дСмострируСт Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ топологичСской ΠΊΠ°Ρ€Ρ‚Ρ‹.

Алгоритм Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°ΠΏΠΏΠ»Π΅Ρ‚Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ ΠšΠΎΡ…ΠΎΠ½Π΅Π½Π°.

НаТатиС Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Start запускаСт процСсс настройки ΠΊΠ°Ρ€Ρ‚. ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ сСти ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ Stop. Кнопка Reset ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для сброса всСх характСристик сСти ΠΈ Π·Π°Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° ΠΎΠ±Ρ€Π°Π·ΠΎΠ² для Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСти (рис. 1).

АпплСт позволяСт ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ характСристики сСти ΠΈ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ происходящиС измСнСния. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Radius Π·Π°Π΄Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ окрСстности сосСдства ΠΈ ΠΏΡ€Π°ΠΊΡ‚ичСски ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚: сколько сосСдних элСмСнтов-ΠΊΠ»Π΅Ρ‚ΠΎΠΊ Π²ΠΎΠΊΡ€ΡƒΠ³ Π½Π΅ΠΉΡ€ΠΎΠ½Π°-" побСдитСля" Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ (Ρ‚. Π΅. подстроСны ΠΈΡ… Π²Π΅ΡΠ°). ИзмСнСниС Ρ†Π²Π΅Ρ‚Π° ячССк сСтки ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ значСния «Π²Π΅ΡΠΎΠ²» элСмСнта. МоТно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠΊΡ€Π΅ΡΡ‚Π½ΠΎΡΡ‚ΡŒ сосСдства, Π²Ρ‹Π±Ρ€Π°Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ радиус Π² ΠΎΠΊΠ½Π΅ Radius, Ρ‡Π΅ΠΌ ΠΎΠ½ Π±ΠΎΠ»ΡŒΡˆΠ΅ Ρ‚Π΅ΠΌ большС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ. Π’Π°ΠΊΠΆΠ΅ прСдоставляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСти, ΠΏΡ€ΠΈ Π½ΠΈΠ·ΠΊΠΎΠΉ скорости Slow ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ элСмСнты ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ, ΠΏΡ€ΠΈ высокой скорости Fast ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ сСти ΠΈ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ кластСров происходит Π±ΠΎΠ»Π΅Π΅ наглядно. ВсС эти настройки ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π²ΠΎ Π²Ρ€Π΅ΠΌΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСти, Π½Π΅ ΡΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ значСния подстроСнных вСсов. Для этого Π½Π°Π΄ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ сСти, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π΅ Ρ…арактСристики ΠΈ ΡΠ½ΠΎΠ²Π° Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Start.

На Ρ€ΠΈΡ. 2 Π²ΠΈΠ΄Π½ΠΎ ΠΊΠ°ΠΊ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ кластСры ΠΏΡ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… значСниях радиуса окрСстности.

Π‘Π΅Ρ‚ΠΈ ΠšΠΎΡ…ΠΎΠ½Π΅Π½Π° с сформированными кластСрами.
Рис. 2. Π‘Π΅Ρ‚ΠΈ ΠšΠΎΡ…ΠΎΠ½Π΅Π½Π° с сформированными кластСрами.

Рис. 2. Π‘Π΅Ρ‚ΠΈ ΠšΠΎΡ…ΠΎΠ½Π΅Π½Π° с ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ кластСрами.

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Π°ΠΏΠΏΠ»Π΅Ρ‚Π°.

Листинг Π°ΠΏΠΏΠ»Π΅Ρ‚Π° sofm.java.

import java.awt.*;

import java.applet.*;

import java.util.*;

class synapse {.

// this class models a weighted connection to a cell.

double weight;

static double sharpness = 2.0; // higher values give sharper cutoff.

cell c;

public static double sigmoid (double x) {.

return 1.0 / (1.0 + Math. exp (-x));

}.

public synapse (cell c, double dist) {.

weight = 0.2 * sigmoid ((sofm.limit — sharpness*dist)/sharpness);

// weight = 0.2 / (1.0 + dist); // use simple function.

this.c = c;

}.

public void update (double[] v, Graphics g) {.

c.update (v, map. rate*weight, g);

}.

}.

class cell {.

// has three basic properties: a grid position (gridv).

// an input space position (ipv).

// and a set of neighbours.

double[] gridv;

double[] ipv;

int d;

static int neighboursEstimate = 30; // a rough estimate of number of neighbours — will grow automatically if needed to.

Vector neighbours;

public cell (int d, int x, int y) {.

// construct a cell with a d-dimensional randomly initialised vector at.

// point x, y on the grid.

ipv = new double[d];

gridv = new double[2];

gridv[0] = (double) x;

gridv[1] = (double) y;

this.d = d;

randCell ();

neighbours = new Vector (neighboursEstimate);

}.

public void randCell () {.

for (int i=0; i.

ipv[i] = Math. random ();

}.

public void addNeighbour (cell c) {.

neighbours.addElement (new synapse (c, dist (gridv, c. gridv)));

}.

public void removeNeighbours () {.

neighbours.removeAllElements ();

}.

public void updateNeighbours (double[] v, Graphics g) {.

// iterate over set of neighbours updating them.

// in proportion to the connection weight.

// now clearly identify the winner i.e. this cell.

g.setColor (map.v2c (v));

g.fillOval ((int)gridv[0]*map.size, (int)gridv[1]*map.size, map. size, map. size);

g.setColor (Color.black);

g.drawOval (1+(int)gridv[0]*map.size, 1+(int)gridv[1]*map.size, map. size-2, map. size-2);

try {Thread.sleep (100); }.

catch (Exception e) {}.

for (Enumeration e = neighbours. elements (); e. hasMoreElements ();).

((synapse) e. nextElement ()).update (v, g);

}.

public void update (double[] v, double w, Graphics g) {.

// updates the vector of this cell using a weighted average.

// of the current cell vector (ipv) and v.

for (int i=0; i.

ipv[i] = (1.0 — w) * ipv[i] + w * v[i];

g.setColor (map.v2c (ipv));

g.fillRect ((int)gridv[0]*map.size, (int)gridv[1]*map.size, map. size, map. size);

}.

}.

public static double sqr (double x) {.

return x * x;

}.

public static double dist (double[] x, double[] y) {.

double dis = 0.0;

for (int i=0; i.

dis += sqr (x[i] - y[i]);

return Math. sqrt (dis);

}.

public double dist (double[] v) {.

return dist (ipv, v);

}.

}.

class map {.

// this class is to model the 2-d map with the underlying vectors.

// can be set up to be a grid, each with a random neuron.

// then each time, update it according to the chosen input vector.

// this follows the cycle of pick winner, update neighbours.

// (each cell includes itself in its set of neighbours).

int d; // the number of dimensions in input.

int n; // the number of points on the grid.

// cell[][] points;

static int size = 40; // number of pixels to use for each cell when drawing it.

static double rate;

static double decayFac = 0.99; // no weight decay at present.

Vector cells;

public map (int d, int n) {.

this.n = n;

this.d = d;

cells = new Vector (n*n);

rate = 1.0;

makeMap ();

setNeighbours ();

}.

public void makeMap () {.

for (int i=0; i.

for (int j=0; j.

cells.addElement (new cell (d, i, j));

}.

public void reset () {.

rate = 1.0;

for (Enumeration e = cells. elements (); e. hasMoreElements ();).

((cell) e. nextElement ()).randCell ();

}.

public void setNeighbours () {.

for (Enumeration e = cells. elements (); e. hasMoreElements ();).

cellNeighbours ((cell) e. nextElement ());

}.

public void cellNeighbours (cell c) {.

c.removeNeighbours ();

for (Enumeration e = cells. elements (); e. hasMoreElements ();) {.

cell cand = (cell) e. nextElement (); // cand is current candidate.

if (cell.dist (c.gridv, cand. gridv) < sofm. limit).

c.addNeighbour (cand);

}.

}.

public cell getWinner (double[] v) {.

double minDist = 100 000.0; // choose this to be much bigger than a feasible distance.

cell choice = null;

for (Enumeration e = cells. elements (); e. hasMoreElements ();) {.

cell cand = (cell) e. nextElement (); // cand is current candidate.

double curDist = cand. dist (v);

if (curDist < minDist) {.

choice = cand;

minDist = curDist;

}.

}.

return choice;

}.

public void updateMap (Color c, Graphics g) {.

update (c2v©, g); // convert the colour to a vector.

}.

public void update (double[] v, Graphics g) {.

cell winner = getWinner (v);

winner.updateNeighbours (v, g); // query this.

rate *= decayFac;

}.

public static double[] c2v (Color c) {.

double[] v = new double[3];

v[0] = (double) c. getRed () / 255.0;

v[1] = (double) c. getGreen () / 255.0;

v[2] = (double) c. getBlue () / 255.0;

return v;

}.

public static Color v2c (double[] v) {.

return new Color ((float) v[0], (float) v[1], (float) v[2]);

}.

public void paint (Graphics g) {.

for (Enumeration e = cells. elements (); e. hasMoreElements ();) {.

cell c = (cell) e. nextElement ();

g.setColor (v2c (c.ipv));

g.fillRect ((int)c.gridv[0]*size, (int)c.gridv[1]*size, size, size);

}.

}.

}.

public class sofm extends Applet implements Runnable {.

map sorg;

Thread animator;

int nCols = 8;

Color[] cols = new Color[8];

static double limit=5.0;

int sleepTime = 10;

Button start, stop, reset;

Choice neighbourhood, decay, speed; // decay not used.

Panel buttons;

public void init () {.

setControlPanel ();

initColors ();

sorg = new map (3,10);

animator = new Thread (this);

animator.start ();

}.

public void setControlPanel () {.

setLayout (new BorderLayout ());

buttons = new Panel ();

start = new Button («start»);

stop = new Button («stop»);

reset = new Button («reset»);

neighbourhood = new Choice ();

neighbourhood.addItem («1.0»);

neighbourhood.addItem («2.0»);

neighbourhood.addItem («3.0»);

neighbourhood.addItem («5.0»);

neighbourhood.addItem («7.0»);

neighbourhood.addItem («10.0»);

neighbourhood.select («5.0»);

speed = new Choice ();

speed.addItem («fast»);

speed.addItem («slow»);

speed.select («fast»);

buttons.add (new Label («Radius»));

buttons.add (neighbourhood);

buttons.add (start);

buttons.add (stop);

buttons.add (reset);

buttons.add (speed);

add («South», buttons);

}.

public void initColors () {.

cols[0] = Color. red;

cols[1] = Color. blue;

cols[2] = Color. green;

cols[3] = Color. white;

cols[4] = Color. black;

cols[5] = Color. magenta;

cols[6] = Color. pink;

cols[7] = Color. yellow;

}.

public static int randInt (int range) {.

return (int) (Math.random () * (double) range);

}.

public void paint (Graphics g) {.

validate ();

sorg.paint (g);

}.

public boolean handleEvent (Event event) {.

// use 1.0 event model for maxmimum browser compatibilty.

if (event.id == Event. ACTION_EVENT) {.

if (event.target == start) {.

// System.out.println («start»);

animator.resume ();

return true;

}.

if (event.target == stop) {.

animator.suspend ();

return true;

}.

if (event.target == reset) {.

sorg.reset ();

repaint ();

return true;

}.

if (event.target == speed) {.

String s = speed. getSelectedItem ();

if (s.equals («slow»)).

sleepTime = 1000;

else.

sleepTime = 10;

return true;

}.

if (event.target == neighbourhood) {.

limit = new Double (neighbourhood.getSelectedItem ()).doubleValue ();

// System.out.println (limit);

sorg.setNeighbours ();

return true;

}.

}.

return super. handleEvent (event);

}.

public void run () {.

sorg.paint (getGraphics ());

while (true) {.

Color current = cols[randInt (nCols)];

Graphics g = getGraphics ();

g.setColor (current);

g.fillRect (180, 410, 40, 30);

sorg.updateMap (current, g);

try { Thread. sleep (sleepTime); }.

catch (Exception e) {.

System.out.println (e);

}.

}.

}.

}.

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ для провСдСния контроля Π·Π½Π°Π½ΠΈΠΉ примСняСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° CGI созданная Π² ΡΡ€Π΅Π΄Π΅ Delphi, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ ΠΎΠ±ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ Π½Π΅ΠΉΡ€ΠΎΠ½Π½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ для принятия Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ.

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ описания ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈ ΠΊΠΎΡ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ курсов ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ интСрфСйс ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π΅Π΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.

ΠžΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ Π°Π΄Ρ€Π΅ΡΡƒ http:158.250.47.76index.html.

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π‘Ρ…Π΅ΠΌΠ° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Рис. 3. Π‘Ρ…Π΅ΠΌΠ° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ