আর ব্যবহার করে কীভাবে "হোয়াইট হাউসের পথে" গণনা করবেন?


12

আমি এই দুর্দান্ত বিশ্লেষণটি পেরিয়ে এসেছি যা দৃষ্টি আকর্ষণীয় এবং সুন্দর উভয়ই:

http://www.nytimes.com/interactive/2012/11/02/us/politics/paths-to-the-white-house.html

আমি কৌতূহলী যে কীভাবে এই জাতীয় একটি "পাথ গাছ" তৈরি করা যায় আর এর সাহায্যে এই জাতীয় পথ গাছটি তৈরি করার জন্য কোন ডেটা এবং অ্যালগরিদম দরকার?

ধন্যবাদ।


মোটামুটিভাবে: প্রতিটি রাজ্যে বিজয়ীর সমস্ত সংমিশ্রণগুলি পরীক্ষা করে দেখুন এবং ফলাফলটি 9-ম্লান বাইনারি হাইপারটেবিলের মধ্যে রাখুন, তথ্য লাভের ভিত্তিতে একটি গাছের মধ্যে পুনরায় অর্ডার করুন, অনর্থক শাখাগুলি ছাঁটাই করুন। 29


1
আমি মনে করি তারা আসলে এটি কিছুটা ভিন্নভাবে করেছে: ইভি দ্বারা রাজ্যগুলিকে রেঙ্ক করুন, তারপরে দেখুন প্রতিটি প্রার্থী যদি জিতে গিয়ে গাছের নীচে যায় তবে কী হয়। সুতরাং, আপনার উত্পন্ন করার এবং তারপরে ছাঁটাই করার দরকার নেই। 29
পিটার ফ্লুম - মনিকা

উত্তর:


10

পুনরাবৃত্ত দ্রবণটি ব্যবহার করা স্বাভাবিক।

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

paths.compute <- function(start, options, states) {
  if (start > sum(options)) x <- list(Id="O", width=1)
  else if (start < -sum(options)) x <- list(Id="R", width=1)
  else if (length(options) == 0 && start == 0) x <- list(Id="*", width=1)
  else {
    l <- paths.compute(start+options[1], options[-1], states[-1])
    r <- paths.compute(start-options[1], options[-1], states[-1])
    x <- list(Id=states[1], L=l, R=r, width=l$width+r$width, node=TRUE)
  }
  class(x) <- "path"
  return(x)
}

states <- c("FL", "OH", "NC", "VA", "WI", "CO", "IA", "NV", "NH")
votes <- c(29, 18, 15, 13, 10, 9, 5, 6, 4)
p <- paths.compute(47, votes, states)

এটি কার্যকরভাবে প্রতিটি নোডে গাছকে ছাঁটাই করে, সমস্ত সম্ভাব্য ফলাফলগুলি অন্বেষণ করার চেয়ে খুব কম গণনার প্রয়োজন । বাকিগুলি কেবল গ্রাফিকাল বিশদ, সুতরাং আমি কার্যকরভাবে দেখার জন্য প্রয়োজনীয় অ্যালগরিদমের কেবলমাত্র সেগুলিই নিয়ে আলোচনা করব।29=512

ভাবমূর্তি

সম্পূর্ণ প্রোগ্রাম অনুসরণ করা হয়। ব্যবহারকারীকে অনেকগুলি পরামিতিগুলি সামঞ্জস্য করতে সক্ষম করার জন্য এটি একটি মাঝারিভাবে নমনীয় পদ্ধতিতে লেখা হয়েছে। গ্রাফিং অ্যালগরিদমের গুরুত্বপূর্ণ অংশটি গাছের বিন্যাস। এটি করার জন্য, প্রতিটি নোডের দুটি বংশধরের আনুপাতিকভাবে অবশিষ্ট অনুভূমিক স্থান বরাদ্দ করতে plot.pathএকটি widthক্ষেত্র ব্যবহার করে । এই ক্ষেত্রটি paths.computeপ্রতিটি নোডের নীচে পাতার মোট সংখ্যা (বংশধর) হিসাবে গণনা করা হয়। (যদি এরকম কিছু গণনা না করা হয় এবং বাইনারি গাছ প্রতিটি নোডের উপর বিভক্ত হয়, তবে নবম রাজ্যের দ্বারা প্রতিটি পাতার জন্য মোট প্রস্থের কেবল পাওয়া যায় যা খুব সংকীর্ণ। যে কেউ কাগজে একটি বাইনারি গাছ আঁকতে শুরু করেছে খুব শীঘ্রই এই সমস্যাটি পড়েছে!)1/512

নোডগুলির উল্লম্ব অবস্থানগুলি একটি জ্যামিতিক সিরিজে সাজানো হয় (সাধারণ অনুপাত সহ a) যাতে গাছের গভীর অংশগুলিতে ব্যবধান আরও কাছাকাছি যায়। পাতার চিহ্নগুলির শাখা এবং আকারগুলির পুরুত্বগুলি গভীরতার সাথেও মাপা হয়। (এটি পাতাগুলিতে বৃত্তাকার চিহ্নগুলিতে সমস্যা দেখা দেবে, কারণ তাদের দিক অনুপাত পরিবর্তনের সাথে সাথে aপরিবর্তিত হবে that আমি এগুলি ঠিক করার জন্য বিরক্ত করি না have)

paths.compute <- function(start, options, states) {
  if (start > sum(options)) x <- list(Id="O", width=1)
  else if (start < -sum(options)) x <- list(Id="R", width=1)
  else if (length(options) == 0 && start == 0) x <- list(Id="*", width=1)
  else {
    l <- paths.compute(start+options[1], options[-1], states[-1])
    r <- paths.compute(start-options[1], options[-1], states[-1])
    x <- list(Id=states[1], L=l, R=r, width=l$width+r$width, node=TRUE)
  }
  class(x) <- "path"
  return(x)
}

plot.path <- function(p, depth=0, x0=1/2, y0=1, u=0, v=1, a=.9, delta=0,
               x.offset=0.01, thickness=12, size.leaf=4, decay=0.15, ...) {
  #
  # Graphical symbols
  #
  cyan <- rgb(.25, .5, .8, .5); cyan.full <- rgb(.625, .75, .9, 1)
  magenta <- rgb(1, .7, .775, .5); magenta.full <- rgb(1, .7, .775, 1)
  gray <- rgb(.95, .9, .4, 1)
  #
  # Graphical elements: circles and connectors.
  #
  circle <- function(center, radius, n.points=60) {
    z <- (1:n.points) * 2 * pi / n.points
    t(rbind(cos(z), sin(z)) * radius + center)
  }
  connect <- function(x1, x2, veer=0.45, n=15, ...){
    x <- seq(x1[1], x1[2], length.out=5)
    y <- seq(x2[1], x2[2], length.out=5)
    y[2] = veer * y[3] + (1-veer) * y[2]
    y[4] = veer * y[3] + (1-veer) * y[4]
    s = spline(x, y, n)
    lines(s$x, s$y, ...)
  }
  #
  # Plot recursively:
  #
  scale <- exp(-decay * depth)
  if (is.null(p$node)) {
    if (p$Id=="O") {dx <- -y0; color <- cyan.full} 
    else if (p$Id=="R") {dx <- y0; color <- magenta.full}
    else {dx = 0; color <- gray}
    polygon(circle(c(x0 + dx*x.offset, y0), size.leaf*scale/100), col=color, border=NA)
    text(x0 + dx*x.offset, y0, p$Id, cex=size.leaf*scale)
  } else {  
    mid <- ((delta+p$L$width) * v + (delta+p$R$width) * u) / (p$L$width + p$R$width + 2*delta)
    connect(c(x0, (x0+u)/2), c(y0, y0 * a), lwd=thickness*scale, col=cyan, ...)
    connect(c(x0, (x0+v)/2), c(y0, y0 * a), lwd=thickness*scale, col=magenta,  ...)
    plot(p$L, depth=depth+1, x0=(x0+u)/2, y0=y0*a, u, mid, a, delta, x.offset, thickness, size.leaf, decay, ...)
    plot(p$R, depth=depth+1, x0=(x0+v)/2, y0=y0*a, mid, v, a, delta, x.offset, thickness, size.leaf, decay, ...)
  }
}

plot.grid <- function(p, y0=1, a=.9, col.text="Gray", col.line="White", ...) {
  #
  # Plot horizontal lines and identifiers.
  #
  if (!is.null(p$node)) {
    abline(h=y0, col=col.line, ...)
    text(0.025, y0*1.0125, p$Id, cex=y0, col=col.text, ...)
    plot.grid(p$L, y0=y0*a, a, col.text, col.line, ...)
    plot.grid(p$R, y0=y0*a, a, col.text, col.line, ...)
  }
}

states <- c("FL", "OH", "NC", "VA", "WI", "CO", "IA", "NV", "NH")
votes <- c(29, 18, 15, 13, 10, 9, 5, 6, 4)
p <- paths.compute(47, votes, states)

a <- 0.925
eps <- 1/26
y0 <- a^10; y1 <- 1.05

mai <- par("mai")
par(bg="White", mai=c(eps, eps, eps, eps))
plot(c(0,1), c(a^10, 1.05), type="n", xaxt="n", yaxt="n", xlab="", ylab="")
rect(-eps, y0 - eps * (y1 - y0), 1+eps, y1 + eps * (y1-y0), col="#f0f0f0", border=NA)
plot.grid(p, y0=1, a=a, col="White", col.text="#888888")
plot(p, a=a, delta=40, thickness=12, size.leaf=4, decay=0.2)
par(mai=mai)

2
এটি একটি দুর্দান্ত সমাধান। এবং গ্রাফিকগুলি চিত্তাকর্ষক। এমন একটি partitionsপ্যাকেজ রয়েছে যা সম্ভাবনাগুলি গণনার জন্য একটি কাঠামো সরবরাহ করেছিল।
ডিওয়িন

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