ادامه شبکه آپولون

مثالها [ ویرایش ]

گرافهای کامل در سه و چهار راس، 3 و 4 ، هر دو شبکه آپولونی است. 3 است که با شروع با یک مثلث و از انجام هر گونه تقسیم بندی، در حالی که نه تشکیل 4 است با ساخت یک بخش فرعی تک قبل از توقف تشکیل شده است.

نمودار گلدنر - هاری یک شبکه آپولونی است که کوچکترین نمودار مسطح غیر همیلتون را تشکیل می دهد . [1] یکی دیگر از شبکه های آپولونی پیچیده تر توسط Nishizeki (1980) مورد استفاده قرار گرفت تا نمونه ای از نمودار حداکثر مسطح غیر همیلتون 1-سخت را ارائه دهد .

خصوصیات نمودار-نظری [ ویرایش ]

علاوه بر این که با تقسیم بازگشتی مثلث ها تعریف می شود ، شبکه های آپولونی دارای چندین توصیف ریاضی معادل دیگر هستند. آنها وتری حداکثر مسطح گرافها، وتری نمودار چند وجهی ، و مسطح 3-درختان . آنها نمودارهای مسطح منحصر به فرد 4 رنگی هستند و نمودارهای مسطح با تجزیه چوب منحصر به فرد اشنایدر در سه درخت. آنها نمودارهای مسطح حداکثر با سه ضلع سه هستند ، یک کلاس از نمودارهایی که می توان با افراد خردسال ممنوعه آنها یا از نظر قابلیت کاهش آنها در تبدیل Y-Δ مشخص کرد . آنها نمودارهای حداکثر مسطح با انحطاط هستندسه. آنها همچنین نمودارهای مسطح روی تعداد معینی از راسها هستند که بیشترین تعداد مثلث را در خود دارند ، بیشترین تعداد ممکن از زیرگراف های چهار گوشه ، بیشترین تعداد ممکن کلیشه و بیشترین تعداد ممکن قطعات بعد از تجزیه با جدا کردن مثلث ها وجود دارد.

وردی [ ویرایش ]

شبکه های آپولون نمونه ای از نمودارهای مسطح حداکثر هستند ، نمودارهایی که هیچ لبه اضافی را بدون از بین بردن مسطح بودن نمی توان اضافه کرد ، یا نمودارهایی معادل مساوی که می توان در هواپیما ترسیم کرد به گونه ای که هر صورت (از جمله چهره بیرونی) مثلث است. آنها همچنین نمودارهای وتر هستند ، نمودارهایی که در آنها هر چرخه از چهار یا چند راس دارای یک لبه مورب است که دو راس چرخه غیر متوالی را به هم متصل می کند ، و ترتیب ترتیب اضافه شدن مهره ها در فرایند تقسیم بندی که یک شبکه آپولونیایی را تشکیل می دهد یک دستور حذف است. نمودار وتر. این یک توصیف جایگزین از شبکه های آپولون را تشکیل می دهد: آنها دقیقا نمودارهای مسطح حداکثر وتر یا معادل نمودارهای چند کلیسایی وتر هستند . [2]

در یک شبکه آپولون ، هر کلیشه حداکثر یک نمودار کامل در چهار راس است که با انتخاب هر راس و سه همسایه قبلی آن تشکیل شده است. هر جداکننده حداقل کلیکی (کلیپی که نمودار را به دو زیرگراف جدا شده تقسیم می کند) یکی از مثلث های تقسیم شده است. نمودار وتر که در آن تمام کلیشه های حداکثر و کلیه جداکننده های کلیکی با اندازه یکسان هستند ، k -tree است و شبکه های آپولوونی نمونه هایی از 3 درخت هستند. هر 3 درخت مسطح نیست ، اما 3 درخت مسطح دقیقاً شبکه های آپولون هستند.

رنگ آمیزی بی نظیر [ ویرایش ]

هر شبکه آپولون نیز گرافیکی منحصر به فرد 4 رنگ است . از آنجا که این یک نمودار مسطح است ، قضیه چهار رنگ دلالت بر این دارد که دارای یک نمودار گرافیکی با تنها چهار رنگ است ، اما پس از انتخاب سه رنگ مثلث اولیه ، تنها یک انتخاب ممکن برای رنگ هر راس پی در پی وجود دارد ، بنابراین دقیقاً تا حد مجاز مجموعه رنگها دقیقاً یک رنگ 4 رنگ دارد. اثبات این مسئله دشوارتر است ، اما همچنین صحیح است که هر نمودار منحصر به فرد مسطح 4 رنگ یک شبکه آپولون است. بنابراین ، شبکه های آپولونی نیز ممکن است به عنوان نمودارهای مسطح منحصر به فرد 4 رنگی مشخص شوند. [3] شبکه های آپولوونی همچنین نمونه هایی از نمودارهای مسطح را در اختیار دارند که دارای کمترین رنگ K هستندk > 4 . [4]

شبکه های آپولوونی نیز دقیقاً نمودارهای مسطح حداکثر هستند که (پس از آنکه یک چهره بیرونی ثابت شود) دارای یک چوب منحصر به فرد Schnyder است ، یک پارتیشن از لبه های نمودار به سه درخت لایه ای که ریشه در سه راس چهره خارجی دارد. [5]

Treewidth [ ویرایش ]

شبکه های آپولون خانواده ای از نمودارها را که تحت بهره برداری از خردسالان گراف بسته شده اند تشکیل نمی دهند ، زیرا از بین بردن لبه ها اما نه مهره ها از یک شبکه آپولونی گرافیکی تولید می کند که یک شبکه آپولونیایی نیست. با این حال ، سه درخت مسطح جزئی ، زیرگراف شبکه های آپولوونی ، جزئی از بسته نیست. بنابراین ، با توجه به قضیه رابرتسون-سیمور ، می توان آنها را با تعداد محدودی از خردسالان ممنوع توصیف کرد . حداقل خردسالان ممنوع برای درختان جزئی جزئی مسطح ، چهار نمودار حداقل در بین افراد ممنوع برای نمودارهای مسطح و 3 درختان جزئی است: نمودار کامل 5 ، نمودار کامل دو طرفه Kنمودار 3،3 ، نمودار هشت ضلعی و نمودار منشور پنج ضلعی . نمودارهای آپولوونی حداکثر نمودارهایی هستند که هیچکدام از این چهار نمودار به عنوان جزئی ندارند. [6]

Y-Δ تبدیل ، یک عملیات است که جایگزین یک درجه و سه رئوس یک گراف توسط یک مثلث اتصال همسایگان خود، کافی است (همراه با حذف لبه های موازی) است که به کاهش هر شبکه آپولونی به یک مثلث واحد، و به طور کلی نمودارهای مسطح که با تبدیل Y-Δ به یک لبه واحد کاهش می یابد ، برداشتن لبه های موازی ، از بین بردن مهره درجه یک و فشرده سازی مهره های درجه دو دقیقاً 3 طبقه درخت مسطح هستند. نمودارهای دوتایی سه طبقه مسطح مسطح ، یک خانواده گراف کوچک بسته دیگر را تشکیل می دهند و دقیقاً نمودارهای مسطح هستند که با تبدیل Δ-Y ، برداشتن لبه های موازی ، از بین بردن مهره های درجه یک و یک ، می توان آنها را به یک لبه واحد کاهش داد. فشرده سازی vertices درجه دو. [7]

دژنراسیون [ ویرایش ]

در هر زیرگرافی از یک شبکه آپولوونی ، اخیراً به حداکثر سطح اضافه شده دارای حداکثر سه درجه است ، بنابراین شبکه های آپولون دارای سه انحطاط هستند . نظمی که در آن رئوس ها برای ایجاد شبکه اضافه می شوند از این رو یک دستور تخریب است و شبکه های آپولونی با نمودارهای مسطح حداکثر 3 انحطاطی همزمان می شوند.

افراط [ ویرایش ]

یکی دیگر از خصوصیات شبکه های آپولوونی شامل اتصال آنها است . هر نمودار حداکثر مسطح ممکن است با تقسیم آن در مثلثهای جداکننده آن به زیرگرافهای مسطح حداکثر 4 رأس تجزیه شود (مثلثهایی که صورت آن نمودار نیست): با توجه به هر مثلث غیر صورت: با توجه به هر مثلث غیر صورت: می توانید دو نمودار مسطح حداکثر کوچکتر را تشکیل دهید. یکی از قسمتهای داخل مثلث و بخشی دیگر از قسمت مثلث تشکیل شده است. نمودارهای حداکثر مسطح بدون مثلث جداکننده که ممکن است با شکافهای مکرر از این نوع تشکیل شوند ، بعضا بلوک نامیده می شوند ، اگرچه از این نام برای اجزای دوطرفه گرافی که خود به هم متصل نیستند نیز استفاده شده است. یک شبکه آپولونی نمودار حداکثر مسطح است که در آن همه بلوک ها قرار دارندایزومورف به نمودار کامل  4 .

در تئوری نمودارهای افراطی ، شبکه های آپولوونی نیز دقیقاً نمودارهای مسطح n -vertex هستند که در آن تعداد بلوکها به حداکثر خود ، n - 3 و نمودارهای مسطح که در آن تعداد مثلثها به حداکثر خود می رسد ، 3 ن - 8 می رسد . از آنجا که هر 4 گراف یک گراف مسطح باید یک بلوک می شود، این نیز نمودار مسطح که در آن تعداد هستند 4 زیرگرافهای رسیدن به حداکثر آن، N - 3 و نمودار که در آن تعداد از دار و دسته از هر نوع دستیابی آن حداکثر ، 8 ن - 16 . [8]

منبع

https://en.wikipedia.org/wiki/Apollonian_network

شبکه آپولون

 
از ویکیپدیا، دانشنامه آزاد

 

یک شبکه آپولون

نمودار گلدنر - هاری ، یک شبکه آپولونیایی غیر همیلتون

در ریاضیات ترکیبیاتی ، یک شبکه آپولونی یک IS گراف بدون جهت تشکیل شده توسط یک فرایند به صورت بازگشتی تقسیم یک مثلث را به سه مثلث کوچک تر. شبکه های آپولونی ممکن است معادل به عنوان تعریف شود مسطح 3-درختان ، حداکثر مسطح وتری گرافها، منحصر به فرد 4-رنگپذیر نمودار مسطح، و نمودار های polytopes انباشته . آنها به نام آپولونیوس از پرگا ، که یک ساخت و ساز مربوط به بسته بندی دایره ای را مطالعه کرده است ، نامگذاری شده اند .

 

فهرست

تعریف [ ویرایش ]

ممکن است یک شبکه آپولونی شکل بگیرد ، از یک مثلث منفرد که در هواپیمای اقلیدسی تعبیه شده است ، شروع می شود ، با انتخاب مکرر صورت مثلثی جاسازی ، اضافه کردن یک راس جدید در داخل صورت ، و اتصال راس جدید به هر راس صورت که حاوی آن است. به این ترتیب ، مثلث حاوی راس جدید به سه مثلث کوچکتر تقسیم می شود که به نوبه خود ممکن است به همین ترتیب تقسیم شوند.

منبع

https://en.wikipedia.org/wiki/Apollonian_network

وعده زنجیر زدن

 

بیایید به مسئله ذکر شده در فصل مقدمه: تماس های برگشتی : ما یک توالی از کارهای ناهمزمان داریم که یکی پس از دیگری انجام می شوند - به عنوان مثال بارگذاری اسکریپت ها. چگونه می توانیم آن را به خوبی کدگذاری کنیم؟

وعده ها برای انجام این کار چند دستور العمل ارائه می دهند.

در این فصل ما زنجیره وعده را پوشش می دهیم.

به نظر می رسد مانند این:

new Promise(function(resolve, reject) {

  setTimeout(() => resolve(1), 1000); // (*)

}).then(function(result) { // (**)

  alert(result); // 1
  return result * 2;

}).then(function(result) { // (***)

  alert(result); // 2
  return result * 2;

}).then(function(result) {

  alert(result); // 4
  return result * 2;

});

ایده این است که نتیجه از طریق زنجیره .thenدستیاران منتقل می شود.

در اینجا جریان است:

  1. قول اولیه در 1 ثانیه برطرف می شود (*)،
  2. سپس .thenدستگیرنده نامیده می شود (**).
  3. مقدار بازگشتی آن به .thenدسترنج بعدی منتقل می شود(***)
  4. ... و غیره

در نتیجه در امتداد زنجیره ای از گرداننده گذشت، ما می توانیم یک دنباله از دیدن alertتماس: 1→ 2→ 4.

همه چیز کار می کند ، زیرا یک تماس برای promise.thenبازگشت یک وعده ، به طوری که ما می توانیم مورد بعدی را .thenبر روی آن بنامیم.

هنگامی که یک دستگیره مقدار را برمی گرداند ، نتیجه آن قول می شود ، بنابراین مورد بعدی .thenبا آن فراخوانی می شود.

یک خطای کلاسیک Newbie: از لحاظ فنی نیز می توان بسیاری را .thenبه یک قول واحد اضافه کرد. این زنجیر نیست.

مثلا:

let promise = new Promise(function(resolve, reject) {
  setTimeout(() => resolve(1), 1000);
});

promise.then(function(result) {
  alert(result); // 1
  return result * 2;
});

promise.then(function(result) {
  alert(result); // 1
  return result * 2;
});

promise.then(function(result) {
  alert(result); // 1
  return result * 2;
});

کاری که ما در اینجا انجام دادیم فقط چند انتقال دهنده به یک وعده است. آنها نتیجه را به یکدیگر منتقل نمی کنند. در عوض آنها به طور مستقل پردازش می کنند.

در اینجا تصویر (آن را با زنجیر بالا مقایسه کنید):

نتیجه همه .thenوعده ها - نتیجه همان وعده است. بنابراین در کد بالا همه alertیکسان را نشان می دهد 1:.

در عمل ، ما به ندرت برای یک وعده به چندین دستکار نیاز داریم. زنجیر زدن بیشتر اوقات استفاده می شود.

بازگشت وعده ها

یک کنترل کننده ، که در آن استفاده می شود ، .then(handler)ممکن است یک وعده را ایجاد کند و برگرداند

در این حالت ، دست اندرکاران دیگر صبر می کنند تا زمان حل و فصل آن ، نتیجه خود را بدست آورند.

برای مثال:




new Promise(function(resolve, reject) {

  setTimeout(() => resolve(1), 1000);

}).then(function(result) {

  alert(result); // 1

  return new Promise((resolve, reject) => { // (*)
    setTimeout(() => resolve(result * 2), 1000);
  });

}).then(function(result) { // (**)

  alert(result); // 2

  return new Promise((resolve, reject) => {
    setTimeout(() => resolve(result * 2), 1000);
  });

}).then(function(result) {

  alert(result); // 4

});

در اینجا اولین .thenنمایش ها 1و بازگشت new Promise(…)در خط (*). پس از یک ثانیه حل می شود ، و نتیجه (استدلال resolve، در اینجا آن است result * 2) به کنترل کننده دوم منتقل می شود .then. آن هندلر در خط است (**)، همین کار را نشان می دهد 2و انجام می دهد.

بنابراین خروجی همانند مثال قبلی است: 1 → 2 4 اما اکنون با 1 ثانیه تأخیر بین alertتماسها.

بازگشت وعده ها به ما امکان می دهد زنجیره ای از اقدامات ناهمزمان ایجاد کنیم.

مثال: loadScript

بیایید از این ویژگی با قول مصور loadScriptتعریف شده در فصل قبل استفاده کنیم تا اسکریپت ها را یک به یک بار بارگیری کنیم ، به ترتیب:

loadScript("/article/promise-chaining/one.js")
  .then(function(script) {
    return loadScript("/article/promise-chaining/two.js");
  })
  .then(function(script) {
    return loadScript("/article/promise-chaining/three.js");
  })
  .then(function(script) {
    // use functions declared in scripts
    // to show that they indeed loaded
    one();
    two();
    three();
  });

این کد را می توان با عملکردهای فلش کمی کوتاه تر کرد:

loadScript("/article/promise-chaining/one.js")
  .then(script => loadScript("/article/promise-chaining/two.js"))
  .then(script => loadScript("/article/promise-chaining/three.js"))
  .then(script => {
    // scripts are loaded, we can use functions declared there
    one();
    two();
    three();
  });

در اینجا هر loadScriptتماس یک وعده را برمی گرداند و .thenوقتی حل می شود بعدی اجرا می شود. سپس بارگذاری فیلمنامه بعدی را آغاز می کند. بنابراین اسکریپت ها یکی پس از دیگری بارگیری می شوند.

ما می توانیم اقدامات ناهمزمان بیشتری را به زنجیره اضافه کنیم. لطفاً توجه داشته باشید که کد هنوز "صاف" است - نه به سمت راست ، رشد می کند. هیچ نشانه ای از "هرم عذاب" وجود ندارد.

از نظر فنی می توانیم .thenمستقیماً به هریک اضافه کنیم loadScript، مانند این:

loadScript("/article/promise-chaining/one.js").then(script1 => {
  loadScript("/article/promise-chaining/two.js").then(script2 => {
    loadScript("/article/promise-chaining/three.js").then(script3 => {
      // this function has access to variables script1, script2 and script3
      one();
      two();
      three();
    });
  });
});

این کد همین کار را انجام می دهد: 3 اسکریپت را به ترتیب دنبال می کند. اما "به راست" رشد می کند. بنابراین ما همان مشکلی را که در رابطه با تماس با ما وجود دارد ، داریم.

افرادی که شروع به استفاده از وعده ها می کنند ، گاهی اوقات از زنجیر زدن اطلاع ندارند ، بنابراین آنها را به این روش می نویسند. به طور کلی زنجیر ترجیح داده می شود.

بعضی اوقات نوشتن .thenمستقیم اشکالی ندارد ، زیرا تابع تو در تو به فضای بیرونی دسترسی دارد. در مثال بالا ترین پاسخ به تماس های تو در تو دسترسی به تمام متغیرهای دارد script1، script2، script3. اما این یک استثناء است نه یک قاعده.

موارد قابل استفاده

به طور دقیق ، ممکن است یک کنترل کننده دقیقاً قول داده نشود ، بلکه یک شیء به اصطلاح "قابل جابجایی" باشد - یک شیء دلخواه که دارای روشی است .then. با همان وعده رفتار خواهد شد.

ایده این است که کتابخانه های شخص ثالث ممکن است اشیاء "سازگار با وعده" را به کار گیرند. آنها می توانند مجموعه گسترده ای از روش ها را داشته باشند ، اما همچنین با وعده های بومی سازگار باشند ، زیرا آنها عملی می شوند .then.

در اینجا نمونه ای از یک شی قابل استفاده وجود دارد:



class Thenable {
  constructor(num) {
    this.num = num;
  }
  then(resolve, reject) {
    alert(resolve); // function() { native code }
    // resolve with this.num*2 after the 1 second
    setTimeout(() => resolve(this.num * 2), 1000); // (**)
  }
}

new Promise(resolve => resolve(1))
  .then(result => {
    return new Thenable(result); // (*)
  })
  .then(alert); // shows 2 after 1000ms

جاوا اسکریپت شیء برگشت داده شده توسط .thenدستگیره را بررسی می کند (*): اگر روشی فراخوانی شده به نام خود داشته باشد then، آنگاه آن متد را برای ارائه توابع بومی resolve، rejectبه عنوان آرگومان (شبیه به مجری) می نامد و منتظر می ماند تا یکی از آنها فراخوانی شود. در مثال بالا resolve(2)بعد از 1 ثانیه گفته می شود (**). سپس نتیجه به پایین زنجیره منتقل می شود.

این ویژگی به ما امکان می دهد بدون نیاز به ارث بردن ، اشیاء سفارشی را با زنجیره های وعده ادغام کنیم Promise.

مثال بزرگتر: واکشی

در برنامه های مقدماتی وعده های برنامه نویسی اغلب برای درخواست های شبکه استفاده می شود. بنابراین بیایید یک مثال گسترده از آن را ببینیم.

ما از روش واکشی برای بارگیری اطلاعات مربوط به کاربر از سرور از راه دور استفاده خواهیم کرد. دارای بسیاری از پارامترهای اختیاری است که در فصل های جداگانه پوشانده شده است ، اما نحو اساسی بسیار ساده است:

let promise = fetch(url);

این باعث می شود یک درخواست شبکه به urlوعده داده شود. responseوقتی سرور از راه دور با هدر پاسخ می دهد ، وعده با یک شیء حل می شود ، اما قبل از بارگیری کامل پاسخ .

برای خواندن پاسخ کامل ، باید از این روش استفاده کنیم response.text(): این نوید را برمی گرداند که هنگام بارگیری متن کامل از سرور از راه دور ، با نتیجه آن متن برطرف می شود.

کد زیر درخواستی را وارد کرده user.jsonو متن آن را از سرور بارگیری می کند:

fetch('/article/promise-chaining/user.json')
  // .then below runs when the remote server responds
  .then(function(response) {
    // response.text() returns a new promise that resolves with the full response text
    // when it loads
    return response.text();
  })
  .then(function(text) {
    // ...and here's the content of the remote file
    alert(text); // {"name": "iliakan", "isAdmin": true}
  });

responseشئ بازگشتی fetchهمچنین شامل روش response.json()است که می خواند داده از راه دور و آن را تجزیه به صورت JSON. در مورد ما که این حتی راحت تر است ، بنابراین اجازه دهید به آن تغییر دهید.

ما همچنین برای توابع کوتاه از توابع فلش استفاده خواهیم کرد:

// same as above, but response.json() parses the remote content as JSON
fetch('/article/promise-chaining/user.json')
  .then(response => response.json())
  .then(user => alert(user.name)); // iliakan, got user name

حالا بیایید با کاربر لود شده کاری انجام دهیم.

به عنوان مثال ، می توانیم یک درخواست دیگر به GitHub ارسال کنیم ، نمایه کاربر را بارگذاری کنیم و نماد را نشان دهیم:

// Make a request for user.json
fetch('/article/promise-chaining/user.json')
  // Load it as json
  .then(response => response.json())
  // Make a request to GitHub
  .then(user => fetch(`https://api.github.com/users/${user.name}`))
  // Load the response as json
  .then(response => response.json())
  // Show the avatar image (githubUser.avatar_url) for 3 seconds (maybe animate it)
  .then(githubUser => {
    let img = document.createElement('img');
    img.src = githubUser.avatar_url;
    img.className = "promise-avatar-example";
    document.body.append(img);

    setTimeout(() => img.remove(), 3000); // (*)
  });

کد کار می کند؛ مشاهده نظرات در مورد جزئیات. با این حال ، یک مشکل احتمالی در آن وجود دارد ، یک خطای معمولی برای کسانی که شروع به استفاده از وعده ها می کنند.

به خط نگاه کنید (*): چگونه می توانیم کاری کنیم که بعد از اتمام نمایش و حذف شدن نماد ، کاری انجام دهیم ؟ به عنوان مثال ، ما می خواهیم یک فرم برای ویرایش آن کاربر یا چیز دیگری نشان دهیم. در حال حاضر ، هیچ راهی وجود ندارد.

برای گسترش زنجیره ، باید قولی را برگردانیم که با پایان یافتن نماد ، حل شود.

مثل این:



fetch('/article/promise-chaining/user.json')
  .then(response => response.json())
  .then(user => fetch(`https://api.github.com/users/${user.name}`))
  .then(response => response.json())
  .then(githubUser => new Promise(function(resolve, reject) { // (*)
    let img = document.createElement('img');
    img.src = githubUser.avatar_url;
    img.className = "promise-avatar-example";
    document.body.append(img);

    setTimeout(() => {
      img.remove();
      resolve(githubUser); // (**)
    }, 3000);
  }))
  // triggers after 3 seconds
  .then(githubUser => alert(`Finished showing ${githubUser.name}`));

این است که، .thenکنترل در خط (*)در حال حاضر بازده new Promise، که می شود تنها پس از تماس از حل و فصل resolve(githubUser)در setTimeout (**). مورد بعدی .thenدر زنجیره منتظر آن است.

به عنوان یک عمل خوب ، یک عمل ناهمزمان همیشه باید یک وعده را برگرداند. این باعث می شود برنامه ریزی اقدامات پس از آن انجام شود. حتی اگر اکنون قصد نداریم زنجیره را گسترش دهیم ، ممکن است بعداً به آن احتیاج پیدا کنیم.

در آخر ، ما می توانیم کد را به توابع قابل استفاده مجدد تقسیم کنیم:

function loadJson(url) {
  return fetch(url)
    .then(response => response.json());
}

function loadGithubUser(name) {
  return fetch(`https://api.github.com/users/${name}`)
    .then(response => response.json());
}

function showAvatar(githubUser) {
  return new Promise(function(resolve, reject) {
    let img = document.createElement('img');
    img.src = githubUser.avatar_url;
    img.className = "promise-avatar-example";
    document.body.append(img);

    setTimeout(() => {
      img.remove();
      resolve(githubUser);
    }, 3000);
  });
}

// Use them:
loadJson('/article/promise-chaining/user.json')
  .then(user => loadGithubUser(user.name))
  .then(showAvatar)
  .then(githubUser => alert(`Finished showing ${githubUser.name}`));
  // ...

خلاصه

اگر یک دستگیرنده .then(یا catch/finallyمهم نیست) یک قول را برمی گرداند ، بقیه زنجیره تا زمان حل و فصل منتظر می ماند. وقتی این کار را انجام داد ، نتیجه (یا خطای) آن منتقل می شود.

در اینجا یک تصویر کامل وجود دارد:

وظایف

قول: سپس در مقابل گرفتن

آیا این قطعات کد برابر هستند؟ به عبارت دیگر ، آیا آنها در هر شرایطی ، برای هر کارکرد کنترل کننده رفتار می کنند؟

promise.then(f1).catch(f2);

در مقابل:

promise.then(f1, f2);

راه حل

منبع

https://javascript.info/promise-chaining

شبکه هاپفیلد

شبکه هاپفیلد

 

شبکه هاپفیلد یک شکل از است عود شبکه عصبی مصنوعی توسط محبوبیت جان هاپفیلد در سال 1982، اما قبل از آن توسط کوچک در سال 1974. توصیف [1] [2] شبکه هاپفیلدبه عنوان خدمت محتوای-آدرس ( "انجمنی") حافظه سیستم با باینری آستانه گره . آنها به همگرا به تضمین حداقل محلی و، بنابراین، ممکن است به یک الگوی نادرست (حداقل محلی اشتباه) به جای الگوی ذخیره شده (انتظار می رود حداقل محلی) همگرا [ نیازمند منبع ] . شبکه های هاپفیلدهمچنین مدلی را برای درک حافظه انسان ارائه می دهند [3] [4].

 

فهرست

ساختار ویرایش ]

یک هاپفیلد با چهار واحد.

واحدهای موجود در شبکه هاپفیلد واحدهای آستانه باینری هستند ، یعنی واحدها فقط دو مقدار متفاوت را برای حالتهای خود در نظر می گیرند و مقدار با تعیین اینکه ورودی واحدها از آستانه آنها فراتر رفته یا نه تعیین می شود. شبکه های هاپفیلدبه طور معمول دارای واحدهایی هستند که مقادیر 1 یا -1 را در بر می گیرند و در این مقاله از این کنوانسیون استفاده می شود. با این وجود ، سایر ادبیات ممکن است از واحدهایی استفاده کنند که مقادیر 0 و 1 را در بر می گیرند.

هر جفت واحدی i و j در یک شبکه هاپفیلد یک اتصال دارند که با وزن اتصال توصیف می شودw _ {{ij}. به این معنا ، شبکه هافیلد را می توان رسماً به عنوان یک نمودار کاملاً غیرمستقیم توصیف کردG = \ langle V، f \ rangle ، جایی که Vمجموعه ای از نورونهای McCulloch-Pitts و{\ displaystyle f: V ^ {2} \ rightarrow \ mathbb {R} تابعی است که جفت واحدها را به یک مقدار واقعی یعنی وزن اتصال پیوند می دهد.

اتصالات موجود در یک هاپفیلد به طور معمول دارای محدودیت های زیر هستند:

  • w _ {{ii}} = 0 ، \ forall i (هیچ واحدی با خودش ارتباط ندارد)

  • w _ {{ij}} = w _ {{ji}}، \ forall i، j (اتصالات متقارن هستند)

این محدودیت که وزنها متقارن هستند تضمین می کند که عملکرد انرژی در حالی که پیروی از قوانین فعال سازی می شود به صورت یکنواخت کاهش می یابد. [5] شبکه ای با وزنهای نامتقارن ممکن است رفتارهای دورهمی یا آشفتگی را نشان دهد. با این حال ، هاففیلد دریافت که این رفتار محدود به قسمتهای نسبتاً کوچکی از فضای فاز است و توانایی شبکه در عملکرد به عنوان یک سیستم حافظه انجمنی با آدرس محتوا را مختل نمی کند.

به روزرسانی ویرایش ]

به روز کردن یک واحد (گره در نمودار شبیه سازی نورون مصنوعی) در شبکه هاپفیلد با استفاده از قانون زیر انجام می شود:

s_ {i} \ leftarrow \ left \ {{\ fill {array} {ll} +1 & {\ mbox {if}} \ sum _ {{j}} {w _ {{ij}} s_ {j}} \ geq \ theta _ {i} ، \\ - 1 & {\ mbox {در غیر این صورت.}} \ end {array}} \ درست.

جایی که:

  • w_ {ij استحکام وزن اتصال از واحد j به واحد i (وزن اتصال) است.

  • s_ {من وضعیت واحد من است

  • \ تتا _ {من آستانه واحد من است.

به روزرسانی ها در شبکه هاپفیلد به دو روش مختلف قابل انجام است:

  • ناهمزمان : فقط یک واحد در یک زمان به روز می شود. این واحد را می توان به طور تصادفی انتخاب کرد ، یا می توان سفارش از پیش تعریف شده را از همان ابتدا تحمیل کرد.

  • همگام سازی : همه واحدها به طور هم زمان به روز می شوند. به منظور حفظ هماهنگی ، به یک ساعت مرکزی به سیستم احتیاج دارد. این روش با توجه به عدم وجود ساعت جهانی مشاهده شده در سیستم های بیولوژیکی یا جسمی مورد علاقه ، به همان اندازه کمتر واقع بینانه مشاهده می شود.

نورونها "همدیگر را جذب یا دفع می کنند" در فضای حالت ویرایش ]

وزن بین دو واحد تأثیر بسیار خوبی بر روی مقادیر نورونها دارد. وزن اتصال را در نظر بگیریدw_ {ijبین دو نورون من و ج. اگرw _ {{ij}}> 0، قانون به روزرسانی دلالت دارد که:

  • چه زمانی s _ {{j}} = 1، سهم j در جمع وزنی مثبت است. بدین ترتیب،s _ {{من} توسط j به سمت مقدار خود کشیده می شود \ displaystyle s_ {i} = 1

  • چه زمانیs _ {{j}} = - 1، سهم j در مبلغ وزنی منفی است. بعد دوبارهs _ {{من} توسط j به سمت ارزش خود سوق می یابد\ displaystyle s_ {i} = - 1}

بنابراین ، اگر وزن بین آنها مثبت باشد ، مقادیر نورون های i و j به همگرایی خواهند رسید. به همین ترتیب ، اگر وزن منفی باشد ، از هم فاصله می گیرند.

انرژی ویرایش ]

منظره انرژی یک شبکه هاففیلد ، برجسته کردن وضعیت فعلی شبکه (از بالای تپه) ، یک حالت جذب کننده که در نهایت به همگرایی می رسد ، حداقل سطح انرژی و یک حوضه جاذبه به رنگ سبز ساییده می شود. توجه داشته باشید که همیشه به روزرسانی شبکه هاپفیلددر انرژی کم می شود.

شبکه های هاپفیلد دارای مقیاس مقیاس همراه با هر حالت از شبکه هستند که به آن "انرژی" ، E ، شبکه گفته می شود ، جایی که:

E = - {\ frac 12 \ sum _ {{i، j}} {w _ {{ij}} {s_ {i}} {s_ {j}} + \ sum _ {i} {\tata _ من}} {s_ {من}}

این مقدار "انرژی" نامیده می شود زیرا با به روزرسانی واحدهای شبکه همان کاهش می یابد یا همان باقی می ماند. علاوه بر این ، با به روزرسانی مکرر شبکه سرانجام به وضعیتی که حداقل محلی در عملکرد انرژی [ استناد مورد نیاز ] است (که تابعی از لیاپونف محسوب می شود ) تبدیل می شود. بنابراین ، اگر یک کشور حداقل محلی در عملکرد انرژی باشد ، یک وضعیت پایدار برای شبکه است. توجه داشته باشید که این عملکرد انرژی متعلق به یک کلاس کلی از مدل های فیزیک تحت عنوان مدل های ایسینگ است . این به نوبه خود یک مورد خاص از شبکه های مارکوف است ، از آنجا که اندازه گیری احتمال مرتبط ،اندازه گیری گیبس ، خاصیت مارکوف را دارد .

شروع و اجرا ویرایش ]

اولیه سازی شبکه هاپفیلد با تنظیم مقادیر واحدها در الگوی شروع مطلوب انجام می شود. به روز رسانی های مکرر سپس انجام می شود تا اینکه شبکه به یک الگوی جذب تبدیل شود. همگرایی به طور کلی اطمینان دارد ، زیرا هاپفیلد ثابت کرد که جذب این سیستم دینامیکی غیرخطی ثابت است ، نه دوره ای و یا هرج و مرج مانند برخی از سیستم های دیگر [ نیاز به استناد ] . بنابراین ، در زمینه شبکه های هافیلد ، الگوی جذب یک وضعیت پایدار نهایی است ، الگویی که با به روزرسانی [ استناد مورد نیاز ] نمی تواند هیچ ارزشی را در درون خود تغییر دهد .

آموزش ویرایش ]

آموزش یک شبکه هاپفیلد شامل پایین آمدن انرژی حالت هایی است که شبکه باید "بخاطر بسپارد". این امر به شبکه اجازه می دهد تا به عنوان یک سیستم حافظه با قابلیت آدرس محتوا عمل کند ، یعنی اگر فقط بخشی از حالت به آن داده شود ، شبکه به حالت "یادآوری" تبدیل می شود. از شبکه می توان برای بازیابی از ورودی تحریف شده به حالت آموزش دیده که بیشتر شبیه به آن ورودی است استفاده کرد. به این حافظه انجمنی گفته می شود زیرا بر اساس شباهت ، خاطرات را بازیابی می کند. به عنوان مثال ، اگر ما یک شبکه هاپفیلدرا با پنج واحد آموزش دهیم به طوری که حالت (1 ، -1 ، 1 ، -1 ، 1) حداقل انرژی باشد و حالت را به شبکه (1 ، -1 ، -1 ، -1 ، 1) به (1 ، -1 ، 1 ، -1 ، 1) تبدیل می شود. بنابراین ، شبکه به درستی آموزش داده می شود وقتی انرژی حالت هایی که شبکه باید از آن یاد کند حداقل های محلی است. توجه داشته باشید که ، آموزش ، آستانه های نورون ها هرگز به روز نمی شوند.

قوانین یادگیری ویرایش ]

قوانین مختلف یادگیری مختلفی وجود دارد که می تواند برای ذخیره اطلاعات در حافظه شبکه هاپفیلداستفاده شود. برای یک قانون یادگیری مطلوب است که هر دو ویژگی زیر را داشته باشد:

  • محلی : یک قانون یادگیری محلی است اگر هر وزن با استفاده از اطلاعات موجود برای سلولهای عصبی در هر طرف از اتصال که با آن وزن خاص همراه است ، به روز شود.

  • افزایشی : الگوهای جدید را می توان بدون استفاده از اطلاعات از الگوهای قدیمی که برای آموزش نیز استفاده شده است آموخت. یعنی وقتی الگوی جدیدی برای آموزش استفاده می شود ، مقادیر جدید وزن فقط به مقادیر قدیمی و الگوی جدید بستگی دارد. [6]

این خصوصیات مطلوب است ، زیرا یک قانون یادگیری راضی کننده آنها از نظر زیست شناختی قابل قبول تر است. به عنوان مثال ، از آنجا که مغز انسان همیشه در حال یادگیری مفاهیم جدید است ، می توان دلیل آن را یاد گرفت که انسان افزایشی است. یک سیستم یادگیری که افزایشی نبوده است ، به طور کلی تنها با یک بار آموزش داده می شود ، با یک مجموعه عظیم از داده های آموزشی.

قانون یادگیری هبیان برای شبکه های هاپفیلد ویرایش ]

نظریه Hebbian توسط دونالد Hebb در سال 1949، به منظور توضیح "یادگیری انجمنی"، که در آن همزمان با فعال نمودن سلول نورون منجر به افزایش تلفظ در قدرت سیناپسی بین این سلول ها معرفی شد. [7] غالباً با عنوان "نورون هایی که با هم آتش می گیرند ، خلاصه می شوند. نورون هایی که از همگام سازی خارج می شوند ، پیوند ندارند."

قانون هبیان هم محلی و هم افزایشی است. برای شبکه های هاپفیلد، هنگام یادگیری به روش زیر پیاده سازی می شودن الگوهای باینری:

w _ {j ij}} = {\ frac {1} {n}} \ sum _ {{\ mu = 1}} ^ {{n}} \ epsilon _ {{i}} ^ {\ mu} \ اپسیلون _ {j}} ^ {\ مو}

جایی که \ epsilon _ {i} ^ {\ mu نمایانگر بیت من از الگوی است \ مو .

اگر بیت های مربوط به نورون های i و j از نظر الگوی مساوی باشند \ مو ، پس از آن محصول \ epsilon _ {{i}} ^ {\ mu} \ epsilon _ {{j}} ^ {\ muمثبت خواهد بود این به نوبه خود ، تأثیر مثبتی بر وزن خواهد داشتw_ {ij و مقادیر i و j تمایل به یکسان شدن دارند. اگر بیت های مربوط به نورون های i و j متفاوت باشند برعکس اتفاق می افتد.

قانون یادگیری استورکی ویرایش ]

این قانون توسط Amos Storkey در سال 1997 معرفی شده و هم محلی و هم افزایشی است. استورکی همچنین نشان داد که یک شبکه هاففیلد که با استفاده از این قانون آموزش دیده است ظرفیت بیشتری نسبت به یک شبکه مربوطه دارد که با استفاده از قانون هبیان آموزش دیده است. [8] گفته می شود که ماتریس وزن یک شبکه عصبی جذب کننده ( روشن شدن مورد نیاز ) در صورت اطاعت از قانون یادگیری استورکی پیروی می کند:

w _ {j ij}} ^ {{\ nu}} = w _ {{ij}} ^ {{\ nu -1}} + {\ frac {1} {n}} \ epsilon _ {{i}} ^ { {\ nu}} \ epsilon _ {{j}} ^ {{\ nu}} - {\ frac {1} {n}} \ epsilon _ {{i}} ^ {{\ nu}} h _ {{ji } ^ {n \ nu}} - {\ frac {1} {n}} \ epsilon _ {{j}} ^ {{\ nu}} h _ {{ij}} ^ {{\ nu}}

\ displaystyle h_ {ij} ^ {\ nu} = \ sum _ {k = 1 ~: ~ i \ neq k \ neq j} ^ {n} w_ {ik} ^ {\ nu -1} \ epsilon _ k} ^ {\ nu}نوعی از میدان محلی [6] در نورون i است.

این قانون یادگیری محلی است ، زیرا سیناپسها فقط نورونهای طرف آنها را در نظر می گیرند. این قانون به دلیل تأثیر میدان محلی ، از اطلاعات بیشتر در مورد الگوهای و وزنها نسبت به قاعده عمومی هبیان استفاده می کند.

الگوهای فریبنده ویرایش ]

الگویی که شبکه از آن برای آموزش استفاده می کند (موسوم به حالت های بازیابی ) جذب کننده سیستم می شوند. به روزرسانی های مکرر در نهایت منجر به همگرایی یکی از حالت های بازیابی می شود. با این حال ، گاهی اوقات شبکه به الگوهای فریبنده (متفاوت از الگوهای آموزشی) همگرا می شود. [9] انرژی موجود در این الگوهای شگرف نیز حداقل محلی است. برای هر الگوی ذخیره شده x ، negation -x نیز الگویی جالب است.

حالت فریبنده همچنین می تواند ترکیبی خطی از تعداد عجیب حالتهای بازیابی باشد. به عنوان مثال ، هنگام استفاده از 3 الگوی\ mu _ {1} ، \ mu _ {2} ، \ mu _ {3می توانید حالت فریبنده زیر را بدست آورید:

\ displaystyle \ epsilon _ {i} ^ {\ rm {mix}} = \ pm \ operatorname {sgn} (\ pm \ epsilon _ {i} ^ {\ mu _ {1}} \ pm \ epsilon _ {i } ^ {\ mu _ {2}} \ pm \ epsilon _ {i} ^ {\ mu _ {3}})

الگوهای توهمی که تعداد یکنواخت حالت دارند ، نمی توانند وجود داشته باشند ، زیرا ممکن است تا صفر برسد [9]

ظرفیت ویرایش ]

ظرفیت شبکه مدل شبکه هاپفیلد با مقادیر نورون و اتصالات درون یک شبکه معین تعیین می شود. بنابراین ، تعداد حافظه هایی که قادر به ذخیره هستند بستگی به سلولهای عصبی و اتصالات دارد. علاوه بر این ، نشان داده شد که دقت فراخوانی بین بردارها و گرهها 0.138 بود (تقریباً 138 بردار را می توان برای ذخیره سازی برای هر 1000 گره فراخوانی کرد) (هرتز و همکاران ، 1991). بنابراین ، بدیهی است که اگر کسی بخواهد تعداد زیادی از بردارها را ذخیره کند ، بسیاری از اشتباهات رخ خواهد داد. وقتی مدل هاپفیلد الگوی صحیح را به یاد نمی آورد ، ممکن است یک رخنه رخ داده باشد ، زیرا موارد مرتبط با معنایی تمایل به سردرگمی فرد دارند و یادآوری الگوی اشتباه رخ می دهد. بنابراین ، مدل شبکه هافیلد نشان داده شده است که هنگام بازیابی ، یک مورد ذخیره شده را با موارد دیگر اشتباه می گیرد. فراخوانی کامل و ظرفیت بالا ،> 0.14> ، می تواند در شبکه با روش یادگیری Storkey بارگیری شود. ETAM[10] [11] ، آزمایش های ETAM نیز در [12] . بعداً مدلهای جلوی الهام گرفته شده از شبکه هافیلد برای بالا بردن حد ذخیره و کاهش میزان خطای بازیابی ساخته شدند که برخی از آنها قادر به یادگیری یک شات هستند . [13]

حافظه انسانی ویرایش ]

مدل هافیلد حافظه انجمنی را تشکیل می دهداز طریق ترکیب بردارهای حافظه. بردارهای حافظه اندکی قابل استفاده هستند و این باعث می شود بازیابی شبیه ترین بردار در شبکه ایجاد شود. با این حال ، خواهیم فهمید که به دلیل این روند ، نفوذی رخ می دهد. در حافظه انجمنی برای شبکه هاپفیلد ، دو نوع عملیات وجود دارد: انجمن خودکار و هترو انجمن. حالت اول وقتی یک بردار با خود همراه است و دومی وقتی است که دو بردار مختلف در انبار قرار دارند. علاوه بر این ، هر دو نوع عملیات برای ذخیره در یک ماتریس حافظه واحد امکان پذیر است ، اما تنها درصورتی که ماتریس نمایندگی داده شده یکی یا دیگری از این عملیات ها نباشد ، بلکه ترکیب (خودکار پیوستگی و ناهمگن) از این دو است. لازم به ذکر است که مدل شبکه هاپفیلد از همان قاعده یادگیری استفاده می کندقانون یادگیری هب (1949) ، که اساساً سعی کرده است نشان دهد که یادگیری در نتیجه تقویت وزنه ها هنگام وقوع فعالیت رخ می دهد.

Rizzuto و Kahana (2001) توانستند با استفاده از یک الگوریتم یادگیری احتمالی ، نشان دهند که مدل شبکه عصبی می تواند تکرار دقت فراخوان را به حساب آورد. در طی فرآیند بازیابی ، هیچ یادگیری رخ نمی دهد. در نتیجه ، وزن شبکه ثابت باقی می ماند و نشان می دهد که این مدل قادر است از یک مرحله یادگیری به مرحله فراخوان تبدیل شود. آنها با افزودن پیمایش متنی توانستند فراموشی سریع را که در یک مدل هاپفیلد در طی یک کار پس انداز فراخوان رخ می دهد ، نشان دهند. کل شبکه به تغییر در فعال سازی هر گره منفرد کمک می کند.

قانون دینامیکی مک کالوچ و پیتز (1943) ، که رفتار نورون ها را توصیف می کند ، به روشی انجام می شود که نشان می دهد چگونه فعالیت های چندین نورون بر روی فعال شدن سرعت شلیک نورون جدید و چگونگی تقویت وزن نورون ها انجام می شود. اتصالات سیناپسی بین نورون فعال جدید (و آنهایی که آن را فعال می کنند). هاپفیلد از قاعده دینامیکی مک کالوچ-پیتز برای نشان دادن چگونگی امکان بازیابی در شبکه هاپفیلد استفاده می کند. با این حال ، توجه به این نکته مهم است که هاپفیلد این کار را با روشی تکراری انجام می داد. هافیلد به جای استفاده از یک تابع خطی ، از یک تابع فعال سازی غیرخطی استفاده می کند. بنابراین ، این امر باعث ایجاد قانون دینامیکی هاپفیلد می شود و با این کار ، هاپفیلد توانست نشان دهد که با عملکرد فعال سازی غیرخطی ،

منبع

https://en.wikipedia.org/wiki/Hopfield_network

دستگاه هلمولتز

 

هلمهولتز دستگاه نوعی از شبکه عصبی مصنوعی است که می تواند برای ساخت پنهان مجموعه ای از داده های آموزش دیده برای ایجاد یک حساب مدل مولد از مجموعه اصلی از داده ها. [1] امید این است که با یادگیری بازنمایی های اقتصادی از داده ها ، ساختار اساسی مدل تولیدی باید به طور منطقی ساختار پنهان مجموعه داده را تقریب دهد. یک دستگاه Helmholtz شامل دو شبکه ، یک شبکه شناسایی از پایین به بالا است که داده ها را به عنوان ورودی می گیرد و توزیعی را روی متغیرهای پنهان تولید می کند ، و یک شبکه "مولد" از بالا به پایین که مقادیر متغیرهای پنهان و خود داده را تولید می کند.

ماشین های هلمولتز معمولاً با استفاده از الگوریتم یادگیری بدون نظارت ، مانند الگوریتم خواب بیدار ، آموزش می گیرند . [2] . آنها یک پیش ماده برای تغییرات هستند خودرمزگذار ، که به جای استفاده از آموزش دیده پس انتشار . ماشینهای هلمهولتز همچنین ممکن است در برنامه های کاربردی که نیاز به الگوریتم یادگیری نظارت داشته باشند (به عنوان مثال شناخت شخصیت ، یا شناخت موقعیت ثابت از یک شیء در یک زمینه) استفاده شود.

منبع

https://en.wikipedia.org/wiki/Helmholtz_machine