スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

いろいろ思うところあり

はてなダイアリーを使ってみる。

http://d.hatena.ne.jp/totobook/
スポンサーサイト

[Scala]水差し問題を幅優先探索と深さ優先探索で

大学の授業で水差し問題をプログラムで解くという話が出てきたので、Scalaの勉強がてら書いてみました。
まずはメインクラス
// Main.scala
object Main {
  def main(args: Array[String]): Unit = {
    // WaterClassに、ゴールの状態と探索の種類("wide" or "deep")を引数で与えて初期化
    val water = new WaterClass((2, 0), "wide")
    // 探索開始
    water.search_start
    water.load_of_goal
    println("Goal!!")
  }
}

次に、水差し問題を解く本体のWater.scala。

// Water.scala
import scala.collection.mutable.HashMap // HashMapを使用するのに必要

class WaterClass(goal: (Int, Int), category: String)
{
  val cup_goal = goal            // ゴールの状態
  val left_max = 4               // 左側の壷に入る水の最大量
  val right_max = 3              // 右側の壷に入る水の最大量
  val search_category = category // 探索方法の種類
  val start = (0, 0)             // スタート時のコップの状態
  var goal_in = false            // ゴールしたかどうかのフラグ
  var stayList = List(start)    // コップの状態。現在左右ともに0
  var opendMap = new HashMap[(Int, Int), (Int, Int)]
  opendMap += start -> start

  // 探索開始
  def search_start(): Unit = {
    // ゴールが見つかるまで無限ループ
    while(true){
      println(stayList)
      var now = stayList.head    // コップの状態候補のリストから、先頭の要素を取り出す
      stayList = stayList.tail   // リストの中から、先頭の要素以外のものを新しいリストとする
      var left  = now._1         // Tuple形式で保存されているコップの左側の状態を入力
      var right = now._2         // Tuple形式で保存されているコップの右側の状態を入力
      r1(left, right)            // 手順R1へ、コップの状態を渡し判定
      r2(left, right)            // 手順R2へ、(以下略)
      r3(left, right)
      r4(left, right)
      r5(left, right)
      r6(left, right)
      r7(left, right)
      r8(left, right)
      if(goal_in){
        println("ゴールを発見しました")
        return
      }
    }
  }

  // 探索が幅優先か深さ優先かにより、リストの結合順を切り替える関数
  def setting_cup(set: (Int, Int)): Unit = {
    if(search_category == "wide") stayList = stayList:::List(set)
    if(search_category == "deep") stayList = List(set):::stayList
    if(set == cup_goal)
      goal_in = true
  }

  // カップの状態が、過去になったことがあるかどうかをチェックする関数
  def cheak_opened(set: (Int, Int)): Boolean = {
    for(key <- opendMap.keySet){
      if(key == set)
        return true
    }
    return false
  }

  // R1:左の水差しが満杯(4リットル)ではないなら、それを満杯にする
  def r1(left: Int, right: Int): Unit ={
    if(left < left_max){
      val set = (left_max, right)
      if(cheak_opened(set))
        return
      opendMap += set -> (left, right)
      setting_cup(set)
    }
  }

  // R2:右の水差しが満杯(3リットル)ではないなら、それを満杯にする
  def r2(left: Int, right: Int): Unit ={
    if(right < right_max){
      val set = (left, right_max)
      if(cheak_opened(set))
        return
      opendMap += set -> (left, right)
      setting_cup(set)
    }
  }

  // R3:左の水差しに少しでも水が入っているならそれを空にする
  def r3(left: Int, right: Int): Unit ={
    if(left > 0){
      val set = (0, right)
      if(cheak_opened(set))
        return
      opendMap += set -> (left, right)
      setting_cup(set)
    }
  }

  // R4:右の水差しに少しでも水が入っているならそれを空にする
  def r4(left: Int, right: Int): Unit ={
    if(right > 0){
      val set = (left, 0)
      if(cheak_opened(set))
        return
      opendMap += set -> (left, right)
      setting_cup(set)
    }
  }

  // R5:左右の水の合計が左の水差しの上限以上、かつ左の水差しが満杯でないとき、
  //    右の水差しの水を左の水差しに入れて満杯にする。
  def r5(left: Int, right: Int): Unit ={
    if((left + right) >= left_max && left < left_max){
      val set = (left_max, left + right - left_max)
      if(cheak_opened(set))
        return
      opendMap += set -> (left, right)
      setting_cup(set)
    }
  }

  // R6:左右の水の合計が右の水差しの上限以上、かつ右の水差しが満杯でないとき、
  //    左の水差しの水を右の水差しに入れて満杯にする
  def r6(left: Int, right: Int): Unit ={
    if((left + right) >= right_max && right < right_max){
      val set = (left + right - right_max, right_max)
      if(cheak_opened(set))
        return
      opendMap += set -> (left, right)
      setting_cup(set)
    }
  }

  // R7:左右の水の合計が左の水差しの上限以下、かつ右の水差しが空でないとき、
  //    右の水差しの水をすべて左の水差しに入れる
  def r7(left: Int, right: Int): Unit ={
    if((left + right) <= left_max && right > 0){
      val set = (left + right, 0)
      if(cheak_opened(set))
        return
      opendMap += set -> (left, right)
      setting_cup(set)
    }
  }

  // R8:左右の水の合計が右の水差しの上限以下、かつ左の水差しが空でないとき、
  //    左の水差しの水をすべて右の水差しに入れる
  def r8(left: Int, right: Int): Unit ={
    if((left + right) <= right_max && left > 0){
      val set = (0, left + right)
      if(cheak_opened(set))
        return
      opendMap += set -> (left, right)
      setting_cup(set)
    }
  }

  // ゴールから逆算して、ゴールまでの過程を表示する
  def load_of_goal(): Unit = {
    var gList = List(cup_goal)
    while(true){
      gList = List(opendMap(gList.head)):::gList
      if(gList.head == start){
        for(stay <- gList)
          println(stay + "\n ↓ ")
        return
      }
    }
  }
}

うーん、なんか汚いソースですね。修行せねば。

テーマ : プログラミング - ジャンル : コンピュータ

[研究室活動記録]サーバーをruby色に染める

研究室に配属され、サーバの管理人になってからはや一ヶ月。
ハードの不具合でまともに管理人らしい事を出来るようになってから、いじくれる時間を見つけては触り続けていますが、まだまだ理想の環境には程遠く。

これから何をするのか、どこまでやったのかをメモするようにします。一応研究ノートはつけてますが、混ざる。

選択したサーバはCeotOS5.4。理由は、触ってみたかったから。

現在は研究室内のネットワークにせつぞくしていないと接続できないが、今後は鍵方式のみのログインを許可する事にして、外からの接続を可能にしたい。夜中に急に思い立った作業ができないって、不便。

研究室内のコミュニケーション用にデュラララ風チャットを設置したが、議論には向かなそうなのでIRCにチャンネルを用意。これとMLが、これからの主な連絡方法になる予感。

サーバーは最小限の活用にして、無料で少し広告がつく程度で利用出来るサービスがあるなら積極的にそちらを使う事とする。引継ぎや管理コストを考えて。
今のところ、ML、IRC、wikiは無料のwebサービスでいいんじゃないかと考え中。

研究室のホームページは徳島県のCMSを使う予定。何故なら使ってみたいから。
現在インストール作業中。今のところ大きなトラブルはなし。

大学内のネットワークが完全にブラックボックスなところが、目下のところ不安要素ではある。が、対処法は知っていそうな教授に話を聞く位か。GWがあけたら聞いてみよう。

テーマ : Linux - ジャンル : コンピュータ

[WindowsServer2008R2]WindowsSever立ち上げのための情報まとめ

ひょんな機会でWindowsServerを立ち上げて勉強することになったので、そのときに調べた情報のまとめ。
いやー、Linux系列のサーバ情報と比べると少ないし結構苦労しました。

ASCII.jp:Windows Serverで学ぶサーバOS入門
まずは、歴史と存在理由を知る。

Download Comodo Internet Security
WindowsServer2008R2で動くフリーのウイルスソフト。2008で動作するソフトも2008R2では動作しないことがあるので注意。Firewallの設定にも注意。

すぐに使える インターネット・サーバー構築術---目次 - すぐに使える インターネット・サーバー構築術:ITpro
次に基本的な設定。

Windows Web Server 2008の概要 - @IT
さらに、PHPを動かせるように。

テーマ : 自宅サーバー - ジャンル : コンピュータ

ドロップボックス、使ってみませんか? ver.2

私はDropboxというオンラインストレージ(インターネット上のHDDのようなもの)を利用しているのですが、そのDropboxが今回、ユーザーを紹介したら保存容量増やしてやるぜへっへっへと悪魔のささやきをしてきたので、即答でハンコを押すことにしました。

詳しくはこちら

今ドロップボックスと契約すると、2GBの容量+250MBの容量がくっついてくるそうです。
深夜の通販番組もびっくりのお得商品ですよ、奥様。しかも無料。

詳しい使い方は以下を見れば大体わかります。
Dropbox徹底解剖 - 一度使ったら手放せなくなる! オンラインストレージサービスの本命 | Web担当者Forum

まだ使ってない人は、一度試してみることをおすすめしますよ!2台以上PCを持っている人は、作業効率が倍増すること請け合いです。MacとWindows、LinuxとWindows間でのファイルのやり取りも信じられないくらい簡単になるので、ぜひ一度お試しください。

テーマ : Webサービス - ジャンル : コンピュータ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。