একটি মার্কভ প্রক্রিয়া রূপান্তর


10

চ্যালেঞ্জ

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

পরীক্ষার কেস

[[7/10, 4/10], [3/10, 6/10]] -> [[4/7, 4/7], [3/7, 3/7]]
[[2/5, 4/5], [3/5, 1/5]] -> [[4/7, 4/7], [3/7, 3/7]]
[[1/2, 1/2], [1/2, 1/2]] -> [[1/2, 1/2], [1/2, 1/2]]
[[1/3, 2/3], [2/3, 1/3]] -> [[1/2, 1/2], [1/2, 1/2]]
[[1/10, 2/10, 3/10], [4/10, 5/10, 6/10], [5/10, 3/10, 1/10]] -> [[27/130, 27/130, 27/130], [66/130, 66/130, 66/130], [37/130, 37/130, 37/130]]
[[1/7, 2/7, 4/7], [2/7, 4/7, 1/7], [4/7, 1/7, 2/7]] -> [[1/3, 1/3, 1/3], [1/3, 1/3, 1/3], [1/3, 1/3, 1/3]]

বিধি

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

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

@ নাথানিয়েল এটি একেবারেই সত্য নয়, যেন চেইনটি হ্রাসযোগ্য হয় তবে আপনি একটি ফলাফল পেতে পারেন (আইডেন্টিটি ম্যাট্রিক্সের মতো) যা আপনি যা বলেছেন তা পূরণ করে তবে এটি যে শৃঙ্খলে বর্ণনা করেছে তা অযোগ্য নয় এবং তাই ইনপুটটির গ্যারান্টি দেওয়া হবে না যুক্তিযুক্ত হোন (যেহেতু এটি ইতিবাচক পুনরাবৃত্তি হবে না)। ওপি যা চায় তার তত্পরতার গ্যারান্টি দেওয়া এবং আমি মনে করি যে তারা এখন আছে, সমস্ত সারি মান একইরকম হওয়ার অতিরিক্ত সীমাবদ্ধতার জন্য ধন্যবাদ। আপনি যদি মার্কোভ চেইনের ব্যাখ্যা না লাগিয়ে ইনপুটটি সীমাবদ্ধ করার আরও ভাল উপায় জানেন তবে আমি নিশ্চিত হাইপারনিউটারিনো এটির প্রশংসা করবে! :)
FryAmTheEggman

1
@ ফ্রাইআমডিজম্যান আহ, আপনি ঠিক বলেছেন, দুঃখিত। আমি পাওয়ারকে ম্যাট্রিক্স বাড়ানোর চেয়ে পাওয়ার পুনরাবৃত্তির কথা ভাবছিলাম। (সুতরাং "অনন্য সমাধান" দ্বারা আমার বোঝানো হয়েছে "এটি একটি যা পুনরাবৃত্তি প্রক্রিয়াটির প্রারম্ভিক বিন্দু থেকে পৃথক", তবে এটি এখানে প্রাসঙ্গিক নয়)) আমি সম্মত হই যে 'সমস্ত সারি অভিন্ন' শর্তটি কাজ করে। আমি অনুমান করি যে ওপি কেবল "মার্কোভ চেইনটি ইরগোডিক হওয়ার গ্যারান্টিযুক্ত" বলতে পারত যা আমাদের মতো লোকদের সন্তুষ্ট করবে যারা এই সম্পর্কে উদ্বিগ্ন হওয়ার সম্ভাবনা রয়েছে!
নাথানিয়েল

আসলে, বি যদি BA = B এর সমাধান হয় , তবে কোনও স্কেলারের ধ্রুবক সি এর জন্য সিবি । সুতরাং কোনও শূন্যহীন সমাধান কঠোরভাবে অনন্য হতে পারে না , যদি না আপনি কোনওভাবে স্কেলটি ঠিক করেন। (প্রয়োগ বি এটা করতে হবে সম্ভাব্যতার সূত্রাবলি যাবে।) এ ছাড়া, সম্ভবত, কিনা তার সারি বা কলাম বি যে সমান উপর নির্ভর করবে কিনা হয় একটি ছেড়ে দেওয়া হয় বা ডান সম্ভাব্যতার সূত্রাবলি।
ইলমারি করোনেন

2
: অন্য কেউ যারা কখনো উচ্চ বিদ্যালয় এবং কিভাবে তাদের গুন করার জন্য ম্যাথ ক্লাসের সময় ম্যাট্রিক্স সম্পর্কে শিখেছি জন্য mathsisfun.com/algebra/matrix-multiplying.html । আমাকে কী জিজ্ঞাসা করা হয়েছিল তা বোঝার জন্য এটি সন্ধান করতে হবে .. সম্ভবত এটি পৃথিবীর অন্য কোথাও সাধারণ জ্ঞান ..: এস
কেভিন ক্রুইজসেন

উত্তর:


7

আর ,  44  43 বাইট

function(m){X=m
while(any(X-(X=X%*%m)))0
X}

এটি অনলাইন চেষ্টা করুন!

এটি স্থির ম্যাট্রিক্স না পাওয়া পর্যন্ত কেবল গুণতে থাকে। স্পষ্টতই X!=(X=X%*%m)তুলনাটি করে, তারপরে পুনরায় নিয়োগ দেয় X, তাই পরিষ্কার ne

বাইট বন্ধ করে দেওয়ার জন্য @ ভ্যালোকে ধন্যবাদ; যদিও পেরিয়ে গেছে 44 এখনও নিয়মিত 44।


1
ভাবছি কেন function(m){ while(any(m!=(m=m%*%m)))0 m}কাজ হয় না। সংখ্যার ভুলত্রুটি সমাপ্তির শর্তটিকে ট্রিগার করা থেকে বিরত করছে?
কোডসইনচওস

@ কোডসআইএনচাউস সম্ভবত এটি নির্ভুলতার অভাব রয়েছে। একটি স্বেচ্ছাসেবী যথাযথ লাইব্রেরিতে স্যুইচ করা কোনওভাবেই সহায়তা করে না - হয় সেগুলি একইভাবে টাইম আউট (Rmpfr) বা ব্যর্থ (জিএমপি), যদিও আমি সম্ভবত কিছু ভুল করছি।
জিউসেপ

@ জিউজেপ্পে আমার ধারণা, প্রস্তাবিত পদ্ধতির কোনও পরিবর্তন না হওয়া পর্যন্ত পুনরায় স্কোয়ারিং করা হয়? (আমি আর পড়তে পারি না)
ব্যবহারকারী 202729

@ ব্যবহারকারী 202729 হ্যাঁ এটি। আর 64৪-বিট ফ্লোটিং পয়েন্ট নম্বর ব্যবহার করে এবং আমি জানি ত্রুটিগুলি খুব দ্রুত প্রচার করা।
জিউসেপ

আমি মনে করি যে অ্যালগরিদম অস্থির। জেলিরও একই সমস্যা। (এটি প্রমাণ করুন এবং বিকল্পটি সন্ধান করুন)
ব্যবহারকারী 202729

5

অষ্টাভ ,45 42 35 বাইট

@(A)([v,~]=eigs(A,1))/sum(v)*any(A)

এটি অনলাইন চেষ্টা করুন!

জিউসেপের 3 টি বাইট সংরক্ষণ করা, এবং লুইস মেন্ডোকে আরও 7 টি ধন্যবাদ!

এটি ব্যবহার করে যে ইগেনভেক্টরটি ইগেনভ্যালু 1 (এছাড়াও সর্বোচ্চ ইগেনালুও) এর সাথে সম্পর্কিত হ'ল কলাম ভেক্টর যা সীমিত ম্যাট্রিক্সের প্রতিটি মানের জন্য পুনরাবৃত্তি হয়। ভেক্টরটিকে স্টোকাস্টিক হওয়ার জন্য যোগফল 1 দিতে আমাদের স্বাভাবিক করতে হবে, তারপরে আমরা ম্যাট্রিক্স পূরণ করতে কেবল এটির পুনরাবৃত্তি করি। আমি অলতাবকে গল্ফ করতে খুব পারদর্শী নই, তবে আমি বারবার গুণিত করার কার্যকরী উপায় খুঁজে পাইনি এবং একটি সম্পূর্ণ প্রোগ্রাম মনে হচ্ছে এটি এর চেয়ে দীর্ঘতর হবে always

আমরা any(A)জানি যে বিধিনিষেধগুলি থেকে আমরা জানি যে ম্যাট্রিক্সকে অবশ্যই একটি অপ্রতিয়োগযোগ্য মার্কভ চেইন বর্ণনা করতে হবে, এবং তাই প্রতিটি রাজ্য অবশ্যই অন্য রাজ্যগুলির থেকে পৌঁছনীয়। সুতরাং প্রতিটি কলামে কমপক্ষে একটি মান অবশ্যই শূন্য নয়।


কীভাবে eigsসর্বদা সম্পর্কিত ইগেনভেেক্টরকে ফিরিয়ে দেয় 1? মার্কভ চেইনের আমার স্মৃতিটি কিছুটা অস্পষ্ট।
জিউসেপে


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

আহ ঠিক. মার্কভ চেইনগুলি আমার পরবর্তী পরীক্ষায় রয়েছে তবে যেহেতু এটি অভিনেতাদের জন্য, তাই কিছু বিবরণ পুরোপুরি অনুপস্থিত।
জিউসেপে



3

এপিএল (ডায়ালগ) , 18 6 বাইট

@ এইচ.পি.উইজকে 12 বাইট সংরক্ষণ করা হয়েছে

+.×⍨⍣≡

এটি অনলাইন চেষ্টা করুন!


+.×⍨⍣≡6 বাইট জন্য। এটি, কিছুই পরিবর্তন না হওয়া পর্যন্ত স্কোয়ার
এইচপিউইজ

@ এইচ.পি.উইজ আমি বিশ্বাস করি এটি। কেন আমি প্রথম স্থানে এটি করিনি তা আমার কোনও ধারণা নেই। ধন্যবাদ!
উরিল

3

কে / কিউ, 10 বাইট

k / q কারণ প্রোগ্রাম দুটি ভাষায় অভিন্ন। কোডটি সত্যই কেবল আইডেম্যাটিক কে / কিউ।

{$[x]/[x]}

ব্যাখ্যা

{..}xঅন্তর্নিহিত পরামিতি হিসাবে লাম্বদা সিনট্যাক্সের বাইরে

$[x] বাইনারি ম্যাট্রিক্স গুণক অপারেটর হিসাবে $ রয়েছে, কেবলমাত্র একটি পরামিতি সরবরাহ করে এমন একটি অযৌক্তিক অপারেটর তৈরি হয় যা মার্কভ ম্যাট্রিক্স দ্বারা গুণিত হয়

/[x] এক্স দিয়ে নিজেই শুরু করে একত্রীকরণ পর্যন্ত বাম গুণটি প্রয়োগ করে।


3

সি (জিসিসি) , 207 192 190 181 176 বাইট + 2 পতাকা বাইট-lm

  • সংরক্ষিত পনের সতেরো বাইশ বাইট ধন্যবাদ ceilingcat
  • নয়টি বাইট সংরক্ষণ করা; সরানোর return A;
float*f(A,l,k,j)float*A;{for(float B[l*l],S,M=0,m=1;fabs(m-M)>1e-7;wmemcpy(A,B,l*l))for(M=m,m=0,k=l*l;k--;)for(S=j=0;j<l;)m=fmax(m,fdim(A[k],B[k]=S+=A[k/l*l+j]*A[k%l+j++*l]));}

এটি অনলাইন চেষ্টা করুন!


@ এসিলিংক্যাট সংকলক পতাকা বাইটগুলি গণনা করছে, এর ফলাফল আবার 192। যাইহোক আপনার পরামর্শ অন্তর্ভুক্ত।
জোনাথন ফ্রেচ

আপনাকে ধন্যবাদ
জোনাথন ফ্রেচ 21

2

পাইথন 3 , 75 61 বাইট

f=lambda n:n if allclose(n@n,n)else f(n@n)
from numpy import*

এটি অনলাইন চেষ্টা করুন!

পরীক্ষার ক্ষেত্রে ভাসা ভ্রান্তি রয়েছে, সুতরাং মানগুলি ভগ্নাংশ থেকে কিছুটা আলাদা হতে পারে।

পুনশ্চ. numpy.allclose()ব্যবহার করা হয় কারণ numpy.array_equal()দীর্ঘতর এবং ভাসমান ভুল ব্যবহারের প্রবণতা রয়েছে।

-১৪ বাইট ধন্যবাদ হাইপার নিউট্রিনো;) ওহ হ্যাঁ আমি @ অপারেটরটি ভুলে গেছি; পি


এর dotপরিবর্তে ব্যবহার করুন matmul: ডি
হাইপারনিউট্রিনো

আসলে, নমপি অ্যারেগুলি ইনপুট হিসাবে নিন এবং করুন x=n@n: P tio.run/…
হাইপারনিউটারিনো


f=সামনের দিকে ফিরে যুক্ত করা হয়েছে কারণ এটি পুনরাবৃত্তভাবে বলা হয়;)
শিয়েরু আসাকোটো

ওহ হ্যাঁ আপনি ঠিক বলেছেন :) ভাল কল!
হাইপারনিউট্রিনো

2

জাভা 8, 356 339 বাইট

import java.math.*;m->{BigDecimal t[][],q;RoundingMode x=null;for(int l=m.length,f=1,i,k;f>0;m=t.clone()){for(t=new BigDecimal[l][l],i=l*l;i-->0;)for(f=k=0;k<l;t[i/l][i%l]=(q!=null?q:q.ZERO).add(m[i/l][k].multiply(m[k++][i%l])))q=t[i/l][i%l];for(;++i<l*l;)f=t[i/l][i%l].setScale(9,x.UP).equals(m[i/l][i%l].setScale(9,x.UP))?f:1;}return m;}

-17 বাইট @ সিলিংক্যাট ধন্যবাদ ।

অবশ্যই সঠিক ভাষা নয় .. জঘন্য ভাসমান পয়েন্ট যথার্থতা ..

ব্যাখ্যা:

এটি অনলাইনে চেষ্টা করুন।

import java.math.*;     // Required import for BigDecimal and RoundingMode
m->{                    // Method with BigDecimal-matrix as both parameter and return-type
  BigDecimal t[][],q;   //  Temp BigDecimal-matrix
  RoundingMode x=null;  //  Static RoundingMode value to reduce bytes
  for(int l=m.length,   //  The size of the input-matrix
          f=1,          //  Flag-integer, starting at 1
          i,k;          //  Index-integers
      f>0;              //  Loop as long as the flag-integer is still 1
      m=t.clone()){     //    After every iteration: replace matrix `m` with `t`
    for(t=new BigDecimal[l][l],
                        //   Reset matrix `t`
        i=l*l;i-->0;)   //   Inner loop over the rows and columns
      for(f=k=0;        //    Set the flag-integer to 0
          k<l           //    Inner loop to multiply
          ;             //      After every iteration:
           t[i/l][i%l]=(q!=null?q:q.ZERO).add(
                        //       Sum the value at the current cell in matrix `t` with:
             m[i/l][k]  //        the same row, but column `k` of matrix `m`,
             .multiply(m[k++][i%l])))
                        //        multiplied with the same column, but row `k` of matrix `m`
        q=t[i/l][i%l];  //     Set temp `q` to the value of the current cell of `t`
    for(;++i<l*l;)      //   Loop over the rows and columns again
      f=t[i/l][i%l].setScale(9,x.UP).equals(m[i/l][i%l].setScale(9,x.UP))?
                        //    If any value in matrices `t` and `m` are the same:
         f              //     Leave the flag-integer unchanged
        :               //    Else (they aren't the same):
         1;}            //     Set the flag-integer to 1 again
  return m;}            //  Return the modified input-matrix `m` as our result

মূল ফাংশনটি এত ভার্বোস কেন?
ব্যবহারকারী 202729

@ ব্যবহারকারী202729 কারণ float/ doubleসঠিক ভাসমান পয়েন্ট যথার্থতা নেই, java.math.BigDecimalপরিবর্তে ব্যবহার করা উচিত। আর পরিবর্তে কেবল +-*/, BigDecimals ব্যবহার .add(...), .subtract(...), .multiply(...), .divide(...)। তাই কিছু যেমন কেবল যেমন 7/10হয়ে new BigDecimal(7).divide(new BigDecimal(10))। উপরন্তু, ,scale,RoundingModeমধ্যে divide'অসীম' দশমিক মান (মতো মান জন্য প্রয়োজন হয় 1/3হচ্ছে 0.333...)। মূল পদ্ধতিটি অবশ্যই গল্ফ করা যেতে পারে, তবে ফ্লোটগুলি বিগডিসিমালগুলিতে রূপান্তর করতে কোনও অনুসন্ধান এবং প্রতিস্থাপন করার সময় আমি মাথা ঘামাইনি।
কেভিন ক্রুইজসেন

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