এটি একটি গ্রাফ রঙিন সমস্যা ।
মনে রাখবেন যে কোনও গ্রাফের বর্ণমালা কোনও গ্রাফের শীর্ষে এমন একটি রঙের असाइनমেন্ট হয় যাতে কোনও প্রান্ত ভাগ করে নেওয়ার কোনও দুটি উল্লম্বের রঙও একই রকম থাকে না। বিশেষত, গ্রাফের (বিমূর্ত) অনুভূমিকাগুলি বহুভুজ। যখনই দুটি ছেদ করা হয় তখন একটি (পুনর্নির্দেশিত) প্রান্তের সাথে সংযুক্ত থাকে (বহুভুজ হিসাবে)। যদি আমরা সমস্যার কোনও সমাধান গ্রহণ করি - যা বহুভুজগুলির সংগ্রহকে বিচ্ছিন্ন করে (বলুন কে ) একটি ক্রম - এবং ক্রমটিতে প্রতিটি সংকলনের জন্য একটি অনন্য রঙ নির্ধারণ করে, তবে আমরা গ্রাফের একটি কে- কালারিং পেয়েছি । এটি একটি ছোট কে পাওয়া বাঞ্চনীয় ।
এই সমস্যাটি বেশ শক্ত এবং যথেচ্ছ গ্রাফগুলির জন্য অমীমাংসিত থেকে যায়। কোডের পক্ষে সহজ এমন একটি আনুমানিক সমাধান বিবেচনা করুন। একটি ক্রমিক অ্যালগরিদম করা উচিত। ওয়েলশ-পাওয়েল অ্যালগরিদম হল একটি লোভী সমাধান যা ডিগ্রি দ্বারা শীর্ষে অবস্থিত ক্রমের উপর ভিত্তি করে। মূল বহুভুজগুলির ভাষায় অনুবাদিত, বহুভুজগুলি প্রথমে ওভারল্যাপ করা অন্যান্য বহুভুজের সংখ্যার ক্রমবর্ধমান ক্রমে বাছাই করুন। ক্রমে কাজ করে, প্রথম বহুভুজটিকে প্রাথমিক রঙ দিন। একটি রং যে পছন্দ করে, হয় যে: প্রত্যেক ক্রমানুযায়ী পদক্ষেপে, একটি বিদ্যমান রঙ দিয়ে পরবর্তী বহুভুজ রঙ চেষ্টা নাইতিমধ্যে যে বহুভুজ প্রতিবেশী যে কোনও দ্বারা ব্যবহৃত। (উপলভ্য রঙগুলির মধ্যে বেছে নেওয়ার অনেকগুলি উপায় রয়েছে; যা সর্বনিম্ন ব্যবহৃত হয়েছে এমনটি চেষ্টা করুন বা অন্যথায় এলোমেলোভাবে বেছে নিন)) পরবর্তী বহুভুজটি যদি বিদ্যমান রঙের সাথে রঙিন না হতে পারে তবে একটি নতুন রঙ তৈরি করুন এবং এটির সাথে এটি রঙ করুন।
একবার আপনি অল্প সংখ্যক রঙের সাথে রঙিনতা অর্জন করার পরে, রঙ অনুসারে জোনালস্ট্যাটগুলি রঙ করুন: নির্মানের মাধ্যমে, আপনি গ্যারান্টিযুক্ত যে প্রদত্ত রঙের ওভারল্যাপের কোনও দুটি বহুভুজ নয়।
এখানে নমুনা কোড ইন R
। (পাইথন কোডটি খুব বেশি আলাদা হবে না)) প্রথমে, আমরা দেখানো সাতটি বহুভুজগুলির মধ্যে ওভারল্যাপগুলি বর্ণনা করি।
edges <- matrix(c(1,2, 2,3, 3,4, 4,5, 5,1, 2,6, 4,6, 4,7, 5,7, 1,7), ncol=2, byrow=TRUE)
অর্থাৎ বহুভুজ 1 এবং 2 ওভারল্যাপ করে এবং তাই বহুভুজ 2 এবং 3, 3 এবং 4, ..., 1 এবং 7 করে।
অবতরণ ডিগ্রি দ্বারা শীর্ষে বাছাই করুন:
vertices <- unique(as.vector(edges))
neighbors <- function(i) union(edges[edges[, 1]==i,2], edges[edges[, 2]==i,1])
nbrhoods <- sapply(vertices, neighbors)
degrees <- sapply(nbrhoods, length)
v <- vertices[rev(order(degrees))]
এ (ক্রুড) সিক্যুয়াল কালারিং অ্যালগরিদম প্রাথমিকতম উপলভ্য রঙ ব্যবহার করে যা ইতিমধ্যে কোনও ওভারল্যাপিং বহুভুজ দ্বারা ব্যবহৃত হয়নি:
color <- function(i) {
n <- neighbors(i)
candidate <- min(setdiff(1:color.next, colors[n]))
if (candidate==color.next) color.next <<- color.next+1
colors[i] <<- candidate
}
ডেটা স্ট্রাকচার ( colors
এবং color.next
) আরম্ভ করুন এবং অ্যালগরিদম প্রয়োগ করুন:
colors <- rep(0, length(vertices))
color.next <- 1
temp <- sapply(v, color)
বহুভুজগুলি রঙ অনুসারে গ্রুপগুলিতে বিভক্ত করুন:
split(vertices, colors)
এই উদাহরণে আউটপুট চারটি রঙ ব্যবহার করে:
$`1`
[1] 2 4
$`2`
[1] 3 6 7
$`3`
[1] 5
$`4`
[1] 1
এটি বহুভুজকে চারটি নন-ওভারল্যাপিং গ্রুপে বিভক্ত করেছে। এক্ষেত্রে সমাধানটি সর্বোত্তম নয় (graph 6 3,6,5 {, {2,4}, 7 1,7} graph এই গ্রাফের জন্য একটি তিনটি রঙিন)। সাধারণভাবে সমাধানটি খুব খারাপ হওয়া উচিত নয়, যদিও।