hotzの備忘録。

ソフトウェア開発と趣味のスポーツについて投稿します。

ドローンの配送アルゴリズム(進捗1)

f:id:horiuchi07:20181011193233p:plain
プログレスバーの実装に手間取ってしまった。一旦進捗。実行ボタンを押すと下記の画面になる。

f:id:horiuchi07:20181011193501p:plain
訪問数はとりあえず10にした。今後の改修で訪問数を自由に指定できるようにしたい。

今表示している距離は厳密解なので、最短距離となっている。今より計算時間を短くしたい場合は、厳密に最短距離を求めることを放棄する必要がある。現在、各アルゴリズムを比較して、計算時間を比較できるようにしている。

ドローンの配送アルゴリズム

f:id:horiuchi07:20180921200202p:plain
まだ画面だけ。WindowsWPFで開発している。WPFの素のコントロールはあまりクールではないので、デザインライブラリを導入することを検討中。(良さげなデザインライブラリ知ってたら教えてください)

このアプリの肝は、巡回セールスマン問題(※)の最適解をアルゴリズム毎に表示できることだ。
※巡回セールスマン問題(Travelling Salesman Problem)とは、地図上の都市とそれぞれの都市の間の移動時間が与えられた時、全ての都市をちょうど一度ずつ巡って出発点に戻る最短経路を見つける問題のこと。
総当たりで最適解を算出するので、O(n!)の複雑度が生じる。nの数が増えると、最新のコンピュータを用いても最適解を求めるのは不可能になるという特徴がある。

アルファベットA~Pを一度ずつ巡って出発点(左下のGoogleのロゴがある辺り)に戻る最短経路を総当たり法で求める場合、N = 16: (N-1)! = 1307674368000(1兆3076億)パターンをごり押しで計算することになる。今はこの処理を実装している。

現状、このアプリは道路を認識することはできない。つまりマーカー上を直線でつなげることしかできない。技術的に実現の目途が立ったら、道路を認識して最適な道筋を求めるアプリを開発したい。

ちなみに、地図画像は「google static maps api」 経由で取得したものを使っている
Overview  |  Maps Static API  |  Google Developers

今後はアプリを開発する過程も公開していきたい。(備忘録的な意味で)

今つくっているもの

「ウーバープール」というサービスがある。
https://www.uber.com/ja-JP/ride/uberpool/

これは、同じエリアから同じ方向に向かう乗客同士が相乗りするサービスのこと。
同じ車で移動するので、料金が割安になるメリットがある。

このサービスを実現する上で重要なのは、相乗りタクシーの最適な経路を高速で算出すること、つまり配車アルゴリズムだ。配車アルゴリズムの設計を誤ると色々問題がある。

  • 運転手とのマッチングに時間がかかる

  • いつまで経ってもタクシーがこない

  • 乗車時間が長い

ぼくがは今、この手の探索技術に使われるアルゴリズムを開発している。 人・モノの移動をより効率的なものにすることは今の時代に必要なことだし、何より効率的なアルゴリズムの手法を知っているのはクールだと思う。 将来的に、世の中の問題を解決するサービスをぼく自身の手で作り上げることができたら最高だ。

次回は今つくってるものの詳細をお伝えする。

3年ぶりの更新。

ふと思いたってブログを再開することにしました。 あれから転職したり、名古屋に転勤になったり、フルマラソンに出場したり色々ありました。 仕事やプライベートで学んだことを書き連ねたいと思います。

SEに必要なコミュニケーション力とは

現職場の上司が定義するコミュニケーション力とは、相手が求めていることを察することであるそうです。
それでは、SEに必要なコミュニケーション力を身につけるにはどうすればいいのでしょうか。
上司に聞いたところ、普段から以下のことを心掛けることで改善できると仰っていました。

相手の話を理解する
こちらの話をいかに伝えるのかを考える
コミュニケーションにおけるすれ違いを認識する

「やる」と「やらない」では、数年後に大きな差がつきます。道のりは長いですが、焦らずに取り組みます。

SEになる上で勉強したほうがいいこと

「SEになるためには何を勉強すればいいのでしょうか?」
就職活動の時期に、この質問を多くのエンジニアに問いかけました。
返ってきた答えは「コミュニケーション」でした。
当時は、技術に高い関心を持っていたので、この答えにがっかりしていました。
そんなわけあるかと、技術本やドットインストールを活用してプログラミング技術の向上に明け暮れていました。

IT業界で働いて二年目を迎えます。仮に「SEになるためには何を勉強すればいいのでしょうか?」と後輩に聞かれたら、迷うことなく「コミュニケーション」と答えます。物凄く大切なことです。その理由を、今の職場を例にあげて説明します。

現部署には「リーダー」、「プロフェッショナル」、「ビギナー」というグループがあります。 役割は下記の通りです。

「リーダー」プロフェッショナルとビギナーのタスク管理、仕様書の作成
「プロフェッショナル」仕様書に基づき実装、仕様書の作成(複雑な仕様を除く)、工数見積もり表の作成、作業報告書の作成
「ビギナー」仕様書に基づき実装、作業報告書の作成

ちなみに私は「プロフェッショナル」に属しています。入社2年目の若造と30代、40代のプログラミング技術に精通している上司が同列です。なぜこのような構造なのか「リーダー」に属している上司に聞いてみました。
返ってきた答えは、コミュニケーション力が不足しているから、とのことでした。

次回は上司が定義する「リーダー」に必要なコミュニケーション力について言及します。

なぜブログを書くのかを自問自答してみる

ブログを長く続けるためにも、なぜブログを始めようとしたのかについて考えてみます。

なぜブログを始めるのか?

仕事を通じて感じたこと、考えたことをメモ書きしたいから。

なぜメモ書きしたいのか?メモ書きが手段ではなくて目的になってしまう恐れはないのか?

頭の中で考えたことを文章という形で表現することで、その考えを咀嚼することができるから。

なぜ考えを咀嚼する行為を行うのか?

仕事をやらされているものと捉えたくないから。自宅と仕事場の往復ではなくて、自己成長のために仕事をしたいから。

なぜ自己成長のために仕事をするのか?仕事をお金を稼ぐための手段と割り切ることはできないのか?

人生の大半は仕事をしている時間。この時間を充実したものにしたいという欲求があるから。

ブログは、人生を豊かにするためのツールなんです。