কেন ডিজকস্ট্রার অ্যালগোরিদম নেতিবাচক ওজন প্রান্তে কাজ করে না?


121

কেউ কি আমাকে বলতে পারেন কেন একক উত্সের সংক্ষিপ্ততম পথের জন্য ডিজকস্ট্রার অ্যালগরিদমটি ধরে নিয়েছে যে প্রান্তগুলি অবশ্যই নেতিবাচক হবে।

আমি কেবল কিনারা নেতিবাচক ওজন চক্র সম্পর্কে নয়।


3
একটি ভাল উদাহরণ সহ একটি সঠিক উত্তরের হবে: stackoverflow.com/questions/6799172/...
Amitk

উত্তর:


175

স্মরণ করুন যে ডিজকস্ট্রার অ্যালগরিদমে একবার একবার একটি শীর্ষবিন্দুটি "বদ্ধ" হিসাবে চিহ্নিত করা হয় (এবং খোলা সেট থেকে বাইরে) - অ্যালগরিদম এটির সবচেয়ে সংক্ষিপ্ত পথ খুঁজে পেয়েছিল এবং আবার কখনও এই নোডটি বিকাশ করতে হবে না - এটি ধরে নিয়েছে যে পথটি বিকশিত হয়েছে পথটি সবচেয়ে ছোট।

তবে নেতিবাচক ওজন সহ - এটি সত্য নাও হতে পারে। উদাহরণ স্বরূপ:

       A
      / \
     /   \
    /     \
   5       2
  /         \
  B--(-10)-->C

V={A,B,C} ; E = {(A,C,2), (A,B,5), (B,C,-10)}

এ থেকে ডিজকস্ট্রা প্রথমে সি বিকাশ করবে এবং পরে এটি ব্যর্থ হবে A->B->C


কিছু গভীরতর ব্যাখ্যা সম্পাদনা করুন:

মনে রাখবেন এটি গুরুত্বপূর্ণ, কারণ প্রতিটি শিথিলকরণের ধাপে, অ্যালগরিদমটি "বদ্ধ" নোডগুলির "ব্যয় "টি প্রকৃতপক্ষে ন্যূনতম বলে ধরে নেওয়া হয় এবং এইভাবে পরবর্তী নোডটিও ন্যূনতম হয়।

এটির ধারণাটি হ'ল: যদি আমাদের কাছে এমন একটি ভার্টেক্স থাকে যাতে এটির ব্যয় ন্যূনতম হয় - যে কোনও ভের্টেক্সে কোনও ধনাত্মক সংখ্যা যুক্ত করে - সংক্ষিপ্ততা কখনই পরিবর্তিত হবে না।
ধনাত্মক সংখ্যার প্রতিবন্ধকতা ছাড়াই - উপরের অনুমানটি সত্য নয়।

যেহেতু আমরা "বদ্ধ" ছিল এমন প্রতিটি প্রান্তকে "জানি" করি না কেন - আমরা "পিছনে ফিরে" ছাড়া নিরাপদে শিথিলকরণের পদক্ষেপটি করতে পারি। আমাদের যদি "ফিরে তাকাতে" দরকার হয় - বেলম্যান-ফোর্ড এটির জন্য একটি পুনরাবৃত্ত-জাতীয় (ডিপি) সমাধান সরবরাহ করে।


5
দুঃখিত তবে আমি কোনও ত্রুটি পাচ্ছি না। প্রথম A->B5 এবং A->Cকরবে 2 তারপর B->Cহবে -5। সুতরাং মানটি বেলম্যান-ফোর্ডের সমান Cহবে -5। কীভাবে এটি সঠিক উত্তর দিচ্ছে না?
অনির্বাণ নাগ 'tintinmj'

5
@ টিন্টিনমজ প্রথমে, ডিজকસ્ત્રা A0 মানের সাথে নোডটি "বন্ধ" করবে, তারপরে এটি ন্যূনতম মূল্যবান নোডের দিকে নজর দেবে, Bএটি 5 এবং C2 হ'ল ন্যূনতম C, সুতরাং এটি Cমান 2 সহ বন্ধ হবে এবং কখনই পিছনে ফিরে তাকাবে না পরে Bবন্ধ হয়ে গেছে, এটি এর মানটি পরিবর্তন করতে পারে না C, কারণ এটি ইতিমধ্যে "বন্ধ" রয়েছে।
amit

4
@ এমিত কীভাবে ডিজকস্ট্রার অ্যালগরিদম পথ খুঁজে পাবে না A -> B -> C? এটি প্রথমে C2 এর দূরত্ব এবং পরে 5 এর দূরত্ব আপডেট করবে BAss আপনার গ্রাফটিতে কোনও বহির্গমন প্রান্ত নেই বলে ধরে Cনিই, তবে পরিদর্শন করার সময় আমরা কিছুই করি না C(এবং এর দূরত্ব এখনও 2)। তারপরে আমরা Dসংলগ্ন নোডগুলি ঘুরে দেখি এবং কেবল সংলগ্ন নোড হয় C, যার নতুন দূরত্ব -5। দ্রষ্টব্য যে ডিজকস্ট্রার অ্যালগরিদমে আমরা যে পিতামাতার কাছ থেকে নোডে পৌঁছাচ্ছি (এবং আপডেট করি) তাও আমরা রেখেছি এবং এখান থেকে Cআপনি পিতামাতাকে পাবেন Bএবং তারপরে Aএকটি সঠিক ফলাফলের ফলস্বরূপ। আমি কী মিস করছি?
এনবিরো

12
@ এমিট আপনার যুক্তি নিয়ে সমস্যা (আমার মনে হয়), এবং আমি অন্যান্য লোককে এটি দেখতে পেয়েছি (আশ্চর্যরকম) আপনি কি মনে করেন যে অ্যালগরিদম নোডগুলির পুনর্বিবেচনা করবে না যার সংক্ষিপ্ত দূরত্বটি ইতিমধ্যে নির্ধারিত হয়েছে (এবং আমাদের সাথে এটি করা হয়েছে), তবে এটি সঠিক নয় এবং সে কারণেই আমাদের কাছে "শিথিলকরণ" পদক্ষেপ রয়েছে ... আমরা গ্রাফের সমস্ত নোড দিয়ে পুনরাবৃত্তি করি এবং তাদের প্রত্যেকের জন্য আমরা সংলগ্ন নোডগুলি দিয়ে পুনরাবৃত্তি করি, এমনকি যদি সংলগ্ন নোডের কোনওটিও হতে পারে উদাহরণস্বরূপ, আমাদের ন্যূনতম-অগ্রাধিকারের সারিটি ইতিমধ্যে সরানো হয়েছে।
nbro

10
: @amit একটি অনুরূপ প্রশ্ন, যেখানে উদাহরণস্বরূপ আসলে জ্ঞান করে তোলে এই উত্তর চেক stackoverflow.com/a/6799344/3924118
nbro

37

উত্সটির সাথে নীচে উল্লিখিত গ্রাফটি ভার্টেক্স এ হিসাবে বিবেচনা করুন First প্রথমে ডিজকস্ট্রার অ্যালগরিদম নিজেই চালানোর চেষ্টা করুন।

এখানে চিত্র বর্ণনা লিখুন

আমি যখন আমার ব্যাখ্যায় ডিজকস্ট্রার অ্যালগরিদমকে উল্লেখ করি আমি নীচে প্রয়োগকৃত হিসাবে ডিজকস্ট্রার অ্যালগরিদম সম্পর্কে কথা বলব,

ডিজকস্ট্রার অ্যালগরিদম

সুতরাং প্রথমটি প্রতিটি ভার্টেক্সকে নির্ধারিত মানগুলি ( উত্স থেকে শীর্ষবিন্দুর দূরত্ব ) শুরু করা হয়,

আরম্ভ

আমরা প্রথমে Q = [A, B, C] এর শীর্ষবিন্দুটি বের করি যার স্বল্পতম মান হয়, অর্থাৎ A, এর পরে Q = [B, C] । দ্রষ্টব্য এ এর ​​বি এবং সি এর দিকনির্দেশিত প্রান্ত রয়েছে, উভয়ই Q তে রয়েছে, সুতরাং আমরা সেই দুটি মানই আপডেট করি,

প্রথম পুনরাবৃত্তি

এখন আমরা সি হিসাবে বের করি (2 <5), এখন Q = [B] । লক্ষ্য করুন যে সি কোনও কিছুর সাথে সংযুক্ত নেই, তাই line16লুপটি চলবে না।

দ্বিতীয় পুনরাবৃত্তি

অবশেষে আমরা নিষ্কর্ষ বি, যার পরে প্রশ্ন হল ফি। দ্রষ্টব্য বি এর সি এর দিকনির্দেশিত প্রান্ত রয়েছে তবে সিটিতে Q উপস্থিত নেই তাই আমরা আবার লুপ ইন করতে প্রবেশ করি না line16,

3 য়?

সুতরাং আমরা হিসাবে দূরত্ব শেষ

না পরিবর্তন ছেলেরা

নোট কিভাবে এই ভুল যেমন সি A থেকে সবচেয়ে কম দূরত্ব 5 + + -10 = -5 হয়, যখন তুমি যাও a to b to c

সুতরাং এই গ্রাফের জন্য ডিজকস্ট্রার অ্যালগরিদম ভুলভাবে এ থেকে সি এর দূরত্বের গণনা করে

এটি ঘটেছিল কারণ ডিজকস্ট্রার অ্যালগরিদম ইতিমধ্যে Q থেকে নিষ্কাশিত উল্লম্বগুলির একটি আরও ছোট পথ সন্ধান করার চেষ্টা করে না ।

কি line16লুপ করছে প্রান্তবিন্দু গ্রহণ হয় তোমার দর্শন লগ করা এবং বলার অপেক্ষা রাখে না "আরে দেখে মনে হচ্ছে আমরা ফিরে যেতে পারেন বনাম মাধ্যমে উৎস থেকে তোমার দর্শন লগ করা , যে (Alt বা বিকল্প) দূরত্ব কোনো বর্তমান বেশী ভালো Dist [V] আমরা পেয়েছিলাম? তাই আপডেট করতে দেয় তাহলে ডিস্ট [ভি] "

নোট যে line16তারা সব প্রতিবেশীদের পরীক্ষা বনাম (অর্থাত একটি নির্দেশ প্রান্ত থেকে বিদ্যমান U V থেকে ), এর U যা প্রশ্ন এখনও । ইন line14তারা প্র: সুতরাং থেকে পরিদর্শন নোট অপসারণ যদি এক্স একটি পরিদর্শন প্রতিবেশী তোমার দর্শন লগ করা পথ আপনি এক্স থেকে উত্সহয় এমনকি বিবেচনা করা উৎস থেকে একটি সম্ভাব্য খাটো উপায় হিসেবে বনাম

আমাদের উপরের উদাহরণে, সি বি এর একজন পরিদর্শন প্রতিবেশী ছিল, সুতরাং A থেকে B to Cবর্তমানের সংক্ষিপ্ততম পথটি এ টু সিঅপরিবর্তিত রেখে পথটি বিবেচনা করা হয়নি ।

এটি আসলে কার্যকর যদি প্রান্তের ওজনগুলি সব ধনাত্মক সংখ্যা হয় , তবে তারপরে আমরা যে পথগুলি সংক্ষিপ্ত হতে পারি না সেগুলি বিবেচনা করে আমাদের সময় নষ্ট করব না

তাই আমি বলি যে এই অ্যালগরিদম চলমান যদি এক্স সামনে প্রশ্ন থেকে আহরণ করা হয় Y একটি পাথ খুঁজে, তারপর তার সম্ভাব্য না - সম্ভব নাযা খাটো। আমি এটি একটি উদাহরণ দিয়ে ব্যাখ্যা করি,

যেহেতু y সবেমাত্র বের করা হয়েছিল এবং x নিজেই আগে বের করা হয়েছিল, তারপরে <[y]> dist [x] কারণ অন্যথায় x এর আগে y বের করা হত । ( সর্বনিম্ন দূরত্ব প্রথম)line 13

এবং আমরা ইতিমধ্যে ধরে নিয়েছি যে প্রান্তের ওজনগুলি ধনাত্মক, অর্থাৎ দৈর্ঘ্য (x, y)> 0 । বিকল্প দূরত্ব (Alt) মাধ্যমে তাই Y সর্বদা নিশ্চিত বেশী হতে, অর্থাত্ Dist [Y] দৈর্ঘ্য (X, Y)> Dist [X] । সুতরাং ডিস্টের [x] এর মান আপডেট করা হত না যদিও y কে x এর পথ হিসাবে বিবেচনা করা হত , সুতরাং আমরা এই সিদ্ধান্তে পৌঁছেছি যে কেবলমাত্র y এর প্রতিবেশী যারা এখনও Q- এ রয়েছেন তাদের বিবেচনা করা বুদ্ধিমান হয় (মন্তব্যটিতে মন্তব্য করুন line16)

তবে এই জিনিসটি যদি আমাদের ধনাত্মক প্রান্ত দৈর্ঘ্যের অনুমানের উপর নির্ভর করে দৈর্ঘ্য (ইউ, ভি) <0 হয় তবে সেই প্রান্তটি কতটা নেতিবাচক তার উপর নির্ভর করে আমরা তুলনার পরে ডি [এক্স] প্রতিস্থাপন করতে পারি line18

সুতরাং আমরা যে কোনও ডিস [x] গণনা করি তা ভুল হবে যদি সমস্ত শীর্ষকোষের আগে এক্স সরিয়ে ফেলা হয় v এর - যেমন x তাদের সাথে সংযোগকারী নেগেটিভ প্রান্তযুক্ত v এর প্রতিবেশী - সরানো হয়।

কারণ সেই v টির প্রতিটিই উত্স থেকে এক্স পর্যন্ত সম্ভাব্য "আরও ভাল" পথের দ্বিতীয় শেষ প্রান্ত , যা ডিজকস্ট্রার অ্যালগরিদম দ্বারা বাতিল করা হয়।

সুতরাং আমি উপরে যে উদাহরণটি দিয়েছি, ভুলটি ছিল কারণ বি সরানোর আগে সি সরানো হয়েছিল। যে সি নেতিবাচক প্রান্ত সঙ্গে বি একটি প্রতিবেশী ছিল!

কেবল পরিষ্কার করার জন্য, বি এবং সি এ এর ​​প্রতিবেশী। বি এর একক প্রতিবেশী সি এবং সি এর কোনও প্রতিবেশী নেই। দৈর্ঘ্য (ক, খ) হ'ল কোণ এবং ক এর মধ্যবর্তী দৈর্ঘ্য।


2
যেমনটি আপনি বলেছিলেন, এটির সমাধানের আরও ভাল উপায় হ'ল হ্যাপাক.হ্যাপশ পদ্ধতিটি প্রতিটি তুলনার পরে ব্যবহার করা। আমরা সারিবদ্ধভাবে আপডেট হওয়া দূরত্বটিকে পিছনে ঠেলে দিই। এই অবস্থার অধীনে, ডিজকস্ট্রগুলি নেতিবাচক ওজনে কাজ করতে পারে। আমি চেষ্টা করেছিলাম, এবং ফলাফলটি 0,5, -5 হিসাবে প্রকাশিত হয়েছে
21-29-

1
"এক্স থেকে ইউ যাওয়ার পথের উত্সটিও বিবেচনা করা হয় না"; আপনি কি আপনার x থেকে উত্স বোঝাতে চেয়েছিলেন?
slmatrix

1
@ স্ল্যাম্যাট্রিক্স এটি ধরার জন্য ধন্যবাদ, হ্যাঁ, আমি বোঝাতে চেয়েছিলাম যে উত্স থেকে আপনি এক্সে যাওয়ার পথটি, কারণ এক্স আপনার প্রতিবেশী।
আদিত্য পি

23

ডিজকস্ট্রার অ্যালগোরিদম ধরে নিয়েছে যে পাথগুলি কেবল 'ভারী' হয়ে উঠতে পারে, যাতে আপনার যদি 3 টি ওজনযুক্ত A থেকে B পর্যন্ত এবং 3 টি ওজনের এ থেকে সি পর্যন্ত কোনও পথ থাকে তবে আপনি কোনও প্রান্ত যুক্ত করতে পারবেন না এবং 3 এরও কম ওজন নিয়ে সি থেকে এ পর্যন্ত বি পান।

এই অনুমানটি alণাত্মক ওজনগুলিকে বিবেচনায় নিতে হবে এমন অ্যালগরিদমের চেয়ে অ্যালগরিদমকে দ্রুত করে তোলে।


8

ডিজকস্ট্রার অ্যালগরিদমের সঠিকতা:

অ্যালগরিদমের যেকোন ধাপে আমাদের 2 টি শীর্ষ কোণ রয়েছে। সেট এ এমন শিখাগুলি নিয়ে গঠিত যা আমরা সংক্ষিপ্ততম পথগুলি গণনা করেছি। সেট বিতে বাকি শীর্ষগুলি রয়েছে।

ইন্ডাকটিভ হাইপোথিসিস : প্রতিটি পদক্ষেপে আমরা ধরে নেব যে পূর্ববর্তী সমস্ত পুনরাবৃত্তিগুলি সঠিক।

প্ররোচনামূলক পদক্ষেপ : যখন আমরা সেট এটিতে একটি শীর্ষবিন্দু ভি যোগ করি এবং দূরত্বকে [V] হিসাবে নির্ধারণ করি তখন আমাদের অবশ্যই প্রমাণ করতে হবে যে এই দূরত্বটি সর্বোত্তম। যদি এটি সর্বোত্তম না হয় তবে অবশ্যই ভার্টেক্স ভি এর আরও কয়েকটি পথ থাকতে হবে যা সংক্ষিপ্ত দৈর্ঘ্যের।

মনে করুন এটি অন্য কোনও পথটি কিছু প্রান্তিক এক্স দিয়ে গেছে।

এখন থেকে যেহেতু ডিস্ট [ভি] <= ডিস্ট [এক্স], সুতরাং গ্রাফের নেতিবাচক প্রান্ত দৈর্ঘ্য না হলে ভি এর অন্য যে কোনও পথের ন্যূনতম দূরত্ব [ভি] দৈর্ঘ্য হবে।

সুতরাং ডিজজস্ট্রার অ্যালগরিদমটি কাজ করার জন্য, প্রান্তের ওজনগুলি অবশ্যই নেতিবাচক হবে।


6

নিম্নলিখিত গ্রাফটিতে ডিজকস্ট্রার অ্যালগরিদম ব্যবহার করে Aদেখুন, কী ঘটছে তা দেখার জন্য উত্স নোডকে ধরে নেওয়া:

চিত্রলেখ


6
দুঃখিত তবে আমি কোনও ত্রুটি পাচ্ছি না। প্রথম A->Bইচ্ছা 1এবং A->Cইচ্ছা 100। তাহলে B->Dহবে 2। তাহলে C->Dহবে -4900। সুতরাং মানটি বেলম্যান-ফোর্ডের সমান Dহবে -4900। কীভাবে এটি সঠিক উত্তর দিচ্ছে না?
অনির্বাণ নাগ 'tintinmj'

9
@ টিনটিনমজ যদি ডি থেকে বহির্গমন প্রান্ত থাকে তবে ডি এর দূরত্ব হ্রাস হওয়ার আগে এটি পরিদর্শন করা হবে এবং তাই এটি হওয়ার পরে আপডেট হয় না। এরপরে এটি নিশ্চিতভাবে ত্রুটি ঘটবে। বহির্গামী প্রান্তগুলি স্ক্যান করার পরে আপনি যদি ডি এর ২ কে ইতিমধ্যে চূড়ান্ত দূরত্ব হিসাবে বিবেচনা করেন তবে এই গ্রাফের কোনও ত্রুটির ফলস্বরূপ।
খ্রিস্টান শ্নর

@ টিবি- এত দিন জিজ্ঞাসা করার জন্য দুঃখিত তবে, আমি কি এখানে সঠিক পথে রয়েছি? প্রথম A->Bহবে 1এবং A->Cহবে 100। তারপরে Bঅন্বেষণ করা হয় এবং সেট করা B->Dহয় 2। তারপরে ডি অনুসন্ধান করা হয় কারণ বর্তমানে এটি উত্সটিতে সবচেয়ে সংক্ষিপ্ততম পথ রয়েছে? আমি এই বলে যে তাহলে সঠিক হবে B->Dছিল 100, Cপ্রথমে হয়ত লাগত অন্বেষণ করে থাকেন? আমি আপনার বাদে অন্য সমস্ত উদাহরণ মানুষ দেয়।
পেজমান পোহ

@ পেজম্যানপো আমার বোধ থেকে, যদি বি-> ডি 100 হয়, যেহেতু হ- স্ট্রাকচারটিতে A-> C উচ্চতর হবে যা ব্যবহার করা হবে, এক্সট্রাক্ট মিনিট এ-> সি ফিরে আসবে যার অর্থ পরবর্তী প্রাপ্ত সংক্ষিপ্ততম পথ হবে সি-তে, এর পরে সি-> ডি থেকে ওজন -৫০০০ এর পথটি সুস্পষ্ট পছন্দ হবে, আমাদের এই সিদ্ধান্তে নিয়ে যায় যে সবচেয়ে সংক্ষিপ্ত পথটি এ-> সি-> ডি থেকে হবে এবং আমি নিশ্চিত যে এটি হবে স্বাভাবিক আচরণ হতে হবে। তাই কখনও কখনও যখন আমাদের নেতিবাচক চক্র থাকে আমরা তখনও সংক্ষিপ্ততম পথের সঠিক মূল্য পেতে পারি, তবে অবশ্যই সর্বদা নয়, এটি এমন উদাহরণ যেখানে আমরা যাব না ..
টি.ডিমিট্রোভ

1

স্মরণ করুন যে ডিজকস্ট্রার অ্যালগরিদমে, একবার একবার একটি শীর্ষবিন্দু "বদ্ধ" হিসাবে চিহ্নিত করা হয় (এবং খোলা সেট থেকে বাইরে) - এটি ধরে নেওয়া হয় যে এটি থেকে উত্পন্ন কোনও নোড আরও বেশি দূরত্বের দিকে নিয়ে যাবে সুতরাং, অ্যালগরিদম এটির সংক্ষিপ্ততম পথটি খুঁজে পেয়েছিল এবং আর কখনও এই নোড বিকাশ করতে হবে না, তবে এটি নেতিবাচক ওজনের ক্ষেত্রে সত্য হয় না।


0

অন্যান্য উত্তর এখনও পর্যন্ত বেশ ভালভাবে দেখায় যে কেন ডিজকস্ট্রার অ্যালগরিদম পথে নেতিবাচক ওজন পরিচালনা করতে পারে না।

তবে প্রশ্নটি নিজেই হয়ত পথগুলির ওজন সম্পর্কে একটি ভুল বোঝার উপর ভিত্তি করে। যদি পাথের নেতিবাচক ওজনগুলিকে সাধারণভাবে প্যাথফাইন্ডিং অ্যালগরিদমগুলিতে অনুমতি দেওয়া হয়, তবে আপনি স্থায়ী লুপ পাবেন যা থামবে না।

এই বিবেচনা:

A  <- 5 ->  B  <- (-1) ->  C <- 5 -> D

এ এবং ডি এর মধ্যে সর্বোত্তম পথটি কী?

যে কোনও প্যাথফাইন্ডিং অ্যালগরিদমকে অবিচ্ছিন্নভাবে বি এবং সি এর মধ্যে লুপ করতে হবে কারণ এটি করলে মোট পাথের ওজন হ্রাস পায়। সুতরাং কোনও সংযোগের জন্য নেতিবাচক ওজনকে মঞ্জুরি দেওয়া যেকোন প্যাথফাইন্ডিগ অ্যালগরিদম মোটকে রেন্ডার করে, সম্ভবত আপনি যদি প্রতিটি সংযোগ কেবল একবার ব্যবহার করার জন্য সীমাবদ্ধ করেন তবে।


0

নেতিবাচক চক্র সহ নেতিবাচক প্রান্তগুলি সহ আপনি ডিজকস্ট্রার অ্যালগরিদম ব্যবহার করতে পারেন তবে আপনাকে অবশ্যই একটি শীর্ষবিন্দু একাধিকবার পরিদর্শন করতে দেওয়া উচিত এবং সেই সংস্করণটি এটি দ্রুত সময়ের জটিলতা হারাবে।

সেক্ষেত্রে ব্যবহারিকভাবে আমি দেখেছি এসপিএফএ অ্যালগরিদম ব্যবহার করা আরও ভাল যাগুলির মধ্যে সাধারণ সারি রয়েছে এবং এটি নেতিবাচক প্রান্তগুলি পরিচালনা করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.