কীভাবে অনেক অনুমতি দিয়ে কোনও কিছুর জন্য টিডিডি করবেন?


15

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

অনেকগুলি, ফলাফলের বিভিন্ন বিভাজনকে ছাড়িয়ে যায় এমন একটি সিস্টেম তৈরি করার সময় টিডিডি ব্যবহার করার জন্য কোন পদ্ধতির উচিত?


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

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

@ এসএনআরফাস আমি এটি সবচেয়ে সাধারণ, মূল দিক থেকে বোঝার সিদ্ধান্ত গ্রহণকারী একটি মেশিন বলতে চাইছি।
নিকোল

উত্তর:


7

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

সুতরাং একটি ইউনিট পরীক্ষার স্তরে আপনাকে ইউনিটগুলি ডিজাইন করতে হবে যাতে সেগুলি পুরোপুরি ডিটারমিনিস্টিক ফ্যাশনে পরীক্ষা করা যায়। আপনি ইউনিটকে ননডেটারিস্টেমিক (যেমন একটি এলোমেলো সংখ্যা জেনারেটর) তৈরি করে এবং এটিকে বিমূর্ত করে এমন কিছু গ্রহণ করে আপনি এটি করতে পারেন। বলুন যে কোনও পদক্ষেপ ভাল কিনা সে সম্পর্কে সিদ্ধান্ত নেওয়ার জন্য আমাদের কাছে একটি নিষ্প্রভ উদাহরণ রয়েছে:

class Decider {

  public boolean decide(float input, float risk) {

      float inputRand = Math.random();
      if (inputRand > input) {
         float riskRand = Math.random();
      }
      return false;

  }

}

// The usage:
Decider d = new Decider();
d.decide(0.1337f, 0.1337f);

এই পদ্ধতিটি পরীক্ষা করা খুব কঠিন এবং আপনি ইউনিট পরীক্ষায় যা যা সত্যই যাচাই করতে পারবেন তা হ'ল তার সীমানা ... তবে এর সীমানায় যাওয়ার জন্য অনেক চেষ্টা দরকার requires সুতরাং পরিবর্তে, এর ইন্টারফেস এবং কার্যকরীতা মোড়ানো একটি কংক্রিট বর্গ তৈরি করে এলোমেলো অংশটি বাদ দিন:

public interface IRandom {

   public float random();

}

public class ConcreteRandom implements IRandom {

   public float random() {
      return Math.random();
   }

}

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

class Decider {

  IRandom irandom;

  public Decider(IRandom irandom) { // constructor injection
      this.irandom = irandom;
  }

  public boolean decide(float input, float risk) {

      float inputRand = irandom.random();
      if (inputRand > input) {
         float riskRand = irandom.random();
      }
      return false;

  }

}

// The usage:
Decider d = new Decider(new ConcreteRandom);
d.decide(0.1337f, 0.1337f);

আপনি নিজেকে জিজ্ঞাসা করতে পারেন কেন এই "কোড ব্লাট" প্রয়োজনীয়। ভাল, শুরু করার জন্য, আপনি এখন অ্যালগরিদমের এলোমেলো অংশের আচরণকে বিদ্রূপ করতে পারেন কারণ Deciderএখন IRandom"ডিগ্রি" অনুসরণ করে একটি নির্ভরতা রয়েছে । আপনি এটির জন্য একটি উপহাসের কাঠামো ব্যবহার করতে পারেন তবে এই কোডটি নিজেকে কোড করার জন্য যথেষ্ট সহজ:

class MockedRandom() implements IRandom {

    public List<Float> floats = new ArrayList<Float>();
    int pos;

   public void addFloat(float f) {
     floats.add(f);
   }

   public float random() {
      float out = floats.get(pos);
      if (pos != floats.size()) {
         pos++;
      }
      return out;
   }

}

সর্বোত্তম অংশটি হ'ল এটি সম্পূর্ণ "প্রকৃত" কংক্রিট বাস্তবায়ন প্রতিস্থাপন করতে পারে। কোডটি এই জাতীয়ভাবে পরীক্ষা করা সহজ হয়ে যায়:

@Before void setUp() {
  MockedRandom mRandom = new MockedRandom();

  Decider decider = new Decider(mRandom);
}

@Test
public void testDecisionWithLowInput_ShouldGiveFalse() {

  mRandom.addFloat(0f);

  assertFalse(decider.decide(0.1337f, 0.1337f));
}

@Test
public void testDecisionWithHighInputRandButLowRiskRand_ShouldGiveFalse() {

  mRandom.addFloat(1f);
  mRandom.addFloat(0f);

  assertFalse(decider.decide(0.1337f, 0.1337f));
}

@Test
public void testDecisionWithHighInputRandAndHighRiskRand_ShouldGiveTrue() {

  mRandom.addFloat(1f);
  mRandom.addFloat(1f);

  assertTrue(decider.decide(0.1337f, 0.1337f));
}

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


3

কড়া টিডিডি আরও জটিল সিস্টেমগুলির জন্য কিছুটা ভাঙ্গতে ঝোঁক করে, তবে এটি ব্যবহারিক দিক থেকে খুব বেশি গুরুত্ব দেয় না - একবার আপনি ব্যক্তিগত ইনপুটগুলি বিচ্ছিন্ন করতে সক্ষম হয়ে যাওয়ার পরে কেবল কিছু টেস্ট কেস যুক্ত করুন যা যুক্তিসঙ্গত কভারেজ সরবরাহ করে এবং সেগুলি ব্যবহার করে।

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


2

টিডিডি পরীক্ষার বিষয়ে নয়, এটি নকশা সম্পর্কে।

জটিলতার সাথে বিচ্ছিন্ন হওয়ার থেকে দূরে, এই পরিস্থিতিতে এটি ছাড়িয়ে যায়। এটি আপনাকে বৃহত্তর সমস্যাটিকে ছোট ছোট টুকরো বিবেচনা করতে পরিচালিত করবে, যা আরও ভাল ডিজাইনের দিকে পরিচালিত করবে।

আপনার অ্যালগরিদমের প্রতিটি ক্রমশক্তি পরীক্ষা করার চেষ্টা শুরু করবেন না। পরীক্ষার পরে কেবল পরীক্ষা তৈরি করুন, পরীক্ষার কাজ করার জন্য সবচেয়ে সহজ কোডটি লিখুন, যতক্ষণ না আপনি আপনার বেসগুলি coveredেকে রাখেন। সমস্যাটি ভেঙে ফেলার বিষয়ে আমি কী বোঝাতে চাইছি তা আপনাকে দেখতে হবে কারণ অন্য অংশগুলির পরীক্ষা করার সময় সমস্যার অংশগুলি নকল করতে আপনাকে উত্সাহিত করা হবে, 10 বিলিয়ন অনুমানের জন্য 10 বিলিয়ন পরীক্ষা লেখার জন্য নিজেকে বাঁচাতে।

সম্পাদনা: আমি একটি উদাহরণ যুক্ত করতে চেয়েছিলাম, তবে এর আগে সময় ছিল না।

আসুন একটি স্থান-সাজানোর অ্যালগরিদম বিবেচনা করা যাক। আমরা এগিয়ে যেতে এবং অ্যারে শীর্ষ প্রান্ত, অ্যারের নীচের প্রান্ত এবং মাঝখানে সব ধরণের অদ্ভুত সংমিশ্রণ পরীক্ষা করে লিখতে পারে। প্রত্যেকের জন্য, আমাদের কিছু ধরণের অবজেক্টের একটি সম্পূর্ণ অ্যারে তৈরি করতে হবে। এটি সময় নিতে হবে।

বা আমরা চারটি অংশে সমস্যাটি মোকাবেলা করতে পারি:

  1. অ্যারে অতিক্রম করুন।
  2. নির্বাচিত আইটেম তুলনা করুন।
  3. আইটেম স্যুইচ করুন।
  4. উপরোক্ত তিনটিকে সমন্বয় করুন।

প্রথমটি সমস্যাটির একমাত্র জটিল অংশ তবে বাকী অংশ থেকে বিমূর্ত হয়ে আপনি এটিকে অনেক বেশি সরল করে তুলেছেন।

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

তৃতীয়টি পরীক্ষা করা অবিশ্বাস্যরকম সহজ।

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

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

এটি, আপনি দেখতে পাবেন, ইউনিট টেস্টিং এবং টিডিডির মধ্যে পার্থক্য। ইউনিট পরীক্ষক বলবেন এটি আপনার পরীক্ষাগুলিকে ভঙ্গুর করে তুলেছে, আপনি যদি সাধারণ ইনপুট এবং আউটপুট পরীক্ষা করে থাকেন তবে আপনাকে এখন নতুন কার্যকারিতার জন্য আরও পরীক্ষা লিখতে হবে না। টিডিডার বলবেন যে আমি উদ্বেগগুলি যথাযথভাবে পৃথক করেছি যাতে আমার প্রতিটি ক্লাস একটি জিনিস এবং একটি জিনিস ভালভাবে করে।


1

বহু ভেরিয়েবলের সাথে একটি গণনার প্রতিটি ক্রম পরীক্ষা করা সম্ভব নয় not তবে এটি নতুন কিছু নয়, খেলনা জটিলতার aboveর্ধ্বে যে কোনও প্রোগ্রামের ক্ষেত্রে এটি সর্বদা সত্য। পরীক্ষার বিষয় হ'ল গণনার সম্পত্তি যাচাই করা । উদাহরণস্বরূপ, 1000 সংখ্যা সহ একটি তালিকা বাছাই করতে কিছু প্রচেষ্টা লাগে, তবে কোনও স্বতন্ত্র সমাধান খুব সহজেই যাচাই করা যায়। এখন, যদিও 1000 আছে! সম্ভাব্য (শ্রেণীর) ইনপুটগুলি এই প্রগমের জন্য এবং আপনি সেগুলি সব পরীক্ষা করতে পারবেন না, কেবল এলোমেলোভাবে 1000 ইনপুট উত্পন্ন করতে এবং আউটপুটটি সত্যভাবে সাজানো হয়েছে তা যাচাই করার পক্ষে এটি যথেষ্ট। কেন? এটি একটি প্রোগ্রাম যা নির্ভরযোগ্যভাবে 1000 এলোমেলোভাবে জেনারেট ভেক্টর বাছাই করে লিখতে প্রায় অসম্ভব ছাড়া এছাড়াও সাধারণভাবে সঠিক হচ্ছে (যদি না আপনি ইচ্ছাকৃতভাবে তামাশা এটি নির্দিষ্ট যাদু ইনপুট নিপূণভাবে ...)

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


আপনি এলোমেলোভাবে 1000 ইনপুট উত্পন্ন করার পরে আপনি কীভাবে ফলাফলগুলি পরীক্ষা করবেন? অবশ্যই এই জাতীয় পরীক্ষা কিছু যুক্তি জড়িত, যা নিজেই পরীক্ষা করা হয় না। তাহলে আপনি পরীক্ষা পরীক্ষা? কিভাবে? পয়েন্টটি হ'ল, রাষ্ট্রীয় ট্রানজিশনগুলি ব্যবহার করে আপনার যুক্তি পরীক্ষা করা উচিত - প্রদত্ত এক্সপুট এক্স আউটপুটটি ওয়াই হওয়া উচিত A যৌক্তিক ভাষায়, অন্য যুক্তি দ্বারা যুক্তি ন্যায়সঙ্গত করা আপনাকে সংশয়বাদী রিগ্রাসের পথে ফেলে দেয় - আপনাকে অবশ্যই কিছুটা দৃser় বক্তব্য রাখতে হবে। এই দাবিগুলি আপনার পরীক্ষা।
ইজাকি

0

প্রান্তের কেসগুলি এবং কিছু এলোমেলো ইনপুট নিন।

বাছাইয়ের উদাহরণটি ধরতে:

  • কয়েকটি এলোমেলো তালিকা বাছাই করুন
  • ইতিমধ্যে বাছাই করা একটি তালিকা নিন
  • বিপরীতে ক্রমযুক্ত একটি তালিকা নিন
  • প্রায় বাছাই করা একটি তালিকা নিন

এটি যদি এগুলির জন্য দ্রুত কাজ করে তবে আপনি নিশ্চিত হতে পারেন যে এটি সমস্ত ইনপুটটির জন্য কাজ করবে।

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