机を配置しようぜ☆(^~^)?<その1>

読了目安:24分

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 更新回数に上限があるのかも知らん☆ 再投稿で回避だぜ☆!」

前の

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 机の配置なら 任せろ☆!」

event-placement-ai

KIFUWARABE_80x100x8_01_Futu.gif
「 話が見えない☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ボランティアで 机の配置をするのよ」

KIFUWARABE_80x100x8_01_Futu.gif
「 だから 机の配置 とは何なのか☆?」

20190714math40a1.png

例。
第29回世界コンピュータ将棋選手権
川崎市産業振興会館 4F

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 部屋が こんな感じであるとするだろ☆」

20190714math40a1b1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 2列で並んでるのが 島☆」

20190714math40a1b2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 壁際に並んでるのが 壁 だぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 じゃあ 並べろだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 待て☆!」

20190714math40a1b3c1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 島や 壁には ブロック番号が 振ってあるものだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 そうか☆ じゃあ 早く 並べろだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 待て☆!」

20190714math40a2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 参加者の方も 数種類にグループ分けすることができるぜ☆
外部が見えるルーターが欲しいリモート勢、 電力が大きい勢、 両方勢、 それ以外勢☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 最近は リモートが流行りだから 大きな電源要らないのよ」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 すると 必要としている人を 供給があるところに ちょんちょんちょん と置いていくだけで
答えが出る☆
なんの 考えもいらない……☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 分かったら 早く並べろだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 待て☆!」

G              E                C              A island
+--+--+--+--+  +--+--+--+--+    +--+--+--+--+  +--+--+--+--+
|  |  |  |  |  |  |  |  |  |    |  |  |  |  |  |  |  |  |  |
+--+--+--+--+  +--+--+--+--+    +--+--+--+--+  +--+--+--+--+
|  |  |  |  |  |  |  |  |  |    |  |  |  |  |  |  |  |  |  |
+--+--+--+--+  +--+--+--+--+    +--+--+--+--+  +--+--+--+--+

H              F                D              B
+--+--+--+--+  +--+--+--+--+    +--+--+--+--+  +--+--+--+--+
|  |  |  |  |  |  |  |  |  |    |  |  |  |  |  |  |  |  |  |
+--+--+--+--+  +--+--+--+--+    +--+--+--+--+  +--+--+--+--+
|  |  |  |  |  |  |  |  |  |    |  |  |  |  |  |  |  |  |  |
+--+--+--+--+  +--+--+--+--+    +--+--+--+--+  +--+--+--+--+
A island.
[  1][  2][  3][  4]
[  5][  6][  7][  8]

B island.
[  9][ 10][ 11][ 12]
[ 13][ 14][ 15][ 16]

C island.
[ 17][ 18][ 19][ 20]
[ 21][ 22][ 23][ 24]

D island.
[ 25][ 26][ 27][ 28]
[ 29][ 30][ 31][ 32]

E island.
[ 33][ 34][ 35][ 36]
[ 37][ 38][ 39][ 40]

F island.
[  0][  0][  0][  0]
[  0][  0][  0][  0]

G island.
[  0][  0][  0][  0]
[  0][  0][  0][  0]

H island.
[  0][  0][  0][  0]
[  0][  0][  0][  0]

Info    : Finished.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Python3 を使って 変動する あらゆるチーム数に対応した 最善の席を 算出したい☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 さっさと座るのが最善だぜ☆ 早よ 並べろだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 参加者数が 40とか50という小さな オーダー のものに 人工知能とか要らないのよ。
手で ちゃっちゃと やりなさいよ!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 机の配置を 一般化する☆」

20190714math41a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 たとえば 入り口が 1か所 のタイプや☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ひとふで書きすると 詰まる通路の数とか あるわよねぇ」

20190714math41a1b2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 1周ぐるりタイプとか いろいろ ある☆」

キャンペーンマップ

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 本編と違うステージとかを キャンペーンマップと言うが、練習用に1つ用意しよう☆」

20190714math41a1b3c1.png

KIFUWARABE_80x100x8_01_Futu.gif
「 なんで こんなところに 柱があるのか……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 これは 即売会の配置ねぇ。 大会に広い通路は要らないもの」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 物を売るイベントの方が 配置が重要だぜ☆ 来場者の動線というものがある☆」

20190714math41a1b3c1d1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 これぐらい小さいところは ブロック番号を分けなくていいんだが、練習なんで 分けている☆
趣意としては☆」

Block Space
A 18
B 4
C 14
D 10
E 8
F 6

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 スペース数を散らした☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 ひどい配置だぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 イベント名は CampaignMap1 としょう☆」

A island.
[  1][  2][  3][  4][  5][  6][  7][  8][  9][ 10][ 11][ 12][ 13][ 14][ 15][ 16][ 17][ 18]

B island.
[ 19][ 20][ 21][ 22]

C island.
[ 23][ 24][ 25][ 26][ 27][ 28][ 29][ 30][ 31][ 32][ 33][ 34][ 35][ 36]

D island.
[ 37][ 38][ 39][ 40][ 41]
[ 42][ 43][ 44][ 45][ 46]

E island.
[ 47][ 48][ 49][ 50]
[ 51][ 52][ 53][ 54]

F island.
[ 55][ 56][ 57]
[ 58][ 59][ 60]

KIFUWARABE_80x100x8_01_Futu.gif
「 お父ん、何やってんだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 イベント会場の 電源の配置図とか 載ってないものだな……☆
色んな会場を 調べてみるかだぜ☆」

日本全国横断 主要同人イベント会場・コンベンションセンター・メッセ一覧

東京ビッグサイト 会議設備・備品利用料金
川崎市振興産業会館 4階 企画展示場
大田区産業プラザPIO 大展示場
ベルサール秋葉原 2F HALL全体

KIFUWARABE_80x100x8_01_Futu.gif
「 電源なんか誰も気にしないんじゃないか☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ 電源は後回しで☆」

Genre code

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 バトル大会では シード組か そうでないか、
即売会では ジャンル・コード などが配置に大きく関わってくるぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 何用のプログラムを想定しているんだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 人工知能の展示、バトル、即売会だぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 ごった煮だな……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 バトル大会の人口より 即売会の人口の方が多いでしょう。
即売会の流儀を参考にしましょう」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ ジャンル・コードで☆
これは 買いに来る人が 巡回する目印にする分類番号で、
3時間ぐらいで全部回れるように 関連するジャンルを近づけるように 配慮しろだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 そんなでかいイベントは あんまりない☆」

  • event_placement_ai
    • attribute
    • placement

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 こういうプログラムを作るときは、
北だの南だの、空間の位置関係を取り扱う部分と
電力だのジャンルコードだの、属性の相性を取り扱う部分は
切り分けておくことが 鉄則だぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ロジック的なものと、視覚的なものは ケンカ するからな☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 人間の脳も 左脳と右脳は 脳梁で分けられていると聞くぜ☆
いっしょにすると 足を引っ張り合うんだぜ☆
おそらく、整理された本棚と 作業机の上ぐらい 性格が合わない☆」

class Participant(object):
    """
    参加者データ
    """

    def __init__(self, id, genre_code):
        self._id = id
        self._genre_code = genre_code
        return

    @property
    def id(self):
        return self._id

    @property
    def genre_code(self):
        return self._genre_code

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 これがその 整理された本棚 の方にあたるデータに使うやつだぜ☆」

# Settings of attribute.
participant_list = [
    Participant(1, "Red"),
    Participant(2, "Red"),
    Participant(3, "Blue"),
    Participant(4, "Blue"),
    Participant(5, "Green"),
    Participant(6, "Blue"),
    Participant(7, "Red"),
    Participant(8, "Blue"),
    Participant(9, "Green"),
    Participant(10, "Green"),
]

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 あっ、データ用意するの めんどくせ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 Excel で ちゃちゃっと作って CSV 吐いたら?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Python3 で どんなデータ形式がサポートされているのか 調べてみよ……☆」

Python3の基礎 ファイル(CSV)を読み込む編 Python3 Python CSV

import csv
import os

# Settings of attribute.
participant_list = []
with open("{}\\event-placement-ai\\data\\test-participant.csv".format(os.getcwd()),  newline='') as f:
    dataReader = csv.reader(f)
    for row in dataReader:
        participant_list.append(row)
        # print(row)

for i in range(0, len(participant_list)):
    print(participant_list[i])
['1', 'Red']
['2', 'Red']
['3', 'Blue']
['4', 'Blue']
['5', 'Green']
['6', 'Blue']
# 以下略

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 仕様がない CSVが 標準サポートされてるんだな☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ジャンルごとの参加者数を集計しようぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 pandas とかいうデータ分析用のライブラリがあるみたいだが 利用者数はどれぐらいだろうか☆?」

3分でできるPandasのインストール方法

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Visual studio code の Terminal ペーンに pip コマンドを使って簡単にインストールでけた☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ Pandas の使い方を練習するかだぜ☆」

pandas って何なんだぜ☆(^~^)?

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 練習終わり☆」

id_list: [1, 2, 7, 12, 21, 37, 41, 52, 3, 4, 6, 8, 15, 17, 22, 27, 30, 33, 40, 50, 56, 60, 5, 9, 10, 14, 29, 36, 42, 44, 53, 57, 11, 13, 55, 16, 18, 20, 26, 31, 43, 51, 58, 19, 23, 24, 46, 25, 39, 48, 59, 28, 34, 32, 38, 54, 35, 49, 45, 47]
A island.
[  1][  2][  7][ 12][ 21][ 37][ 41][ 52][  3][  4][  6][  8][ 15][ 17][ 22][ 27][ 30][ 33]
B island.
[ 40][ 50][ 56][ 60]
C island.
[  5][  9][ 10][ 14][ 29][ 36][ 42][ 44][ 53][ 57][ 11][ 13][ 55][ 16]
D island.
[ 18][ 20][ 26][ 31][ 43]
[ 51][ 58][ 19][ 23][ 24]

E island.
[ 46][ 25][ 39][ 48]
[ 59][ 28][ 34][ 32]

F island.
[ 38][ 54][ 35]
[ 49][ 45][ 47]

Info    : Finished.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ただ、ジャンルコード順に 島に並べても 島と島は 配置は 飛んでたりするから
また今度 見直そうぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 視覚的に 確認できないのかしら?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 HTML/CSS と連動できないか試してみようぜ☆?
Python3 で テキストファイル作成ぐらいできるだろ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 練習しようぜ☆?」

続き

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 京都の火災ニュースで 記憶が飛んでしまったが、練習したぜ☆ おさらいしよう☆」

20190715math42a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 HTML/CSS を利用して、ジャンルコードの代わりに色で 多いもの順に四角を表示するところはできた☆
このプログラムには html-generator という名前を付けた☆」

html-generator

KIFUWARABE_80x100x8_01_Futu.gif
「 説明の気が抜けていて 言っていることが よく分からん☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 タテ1列に並んでいても あんまりなので、机の配置のように並べたいのだった☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 平常心とか言ってる人は 平常心じゃないのよ?」

CCCCC..BBBB..AAAAAAA
C..................A
C.FFF..EEEE..DDDDD.A
C.FFF..EEEE..DDDDD.A
C..................A
CCCCC........AAAAAAA

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 次に 机の配置を Rogueのように表記して☆」

X,Y,CHAR
0,0,C
1,0,C
2,0,C
3,0,C
4,0,C
5,0,.
6,0,.
7,0,B
8,0,B
9,0,B
10,0,B
11,0,.
12,0,.
13,0,A
14,0,A
15,0,A
16,0,A
17,0,A
18,0,A
19,0,A
0,1,C
1,1,.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 CSV形式にコンバートする部品も作った☆
名前は ascii-floor-map-to-csv にした☆」

ascii-based-floor-map-to-csv

KIFUWARABE_80x100x8_01_Futu.gif
「 お父んが ふわふわ している☆ 水でも飲めだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 この CSV をもとに、表示位置を生成するように html-generator を改造しようぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 日本語をしゃべっているようで お父んが ぼーっ としている☆!
習慣だけで PCに向かって プログラムを書いているだけだぜ☆!」

日曜日

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 寝込んでいるだけで 進捗がない……☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 進捗なんか なくてもいいのに……☆」

20190721blog47a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ascii-floor-map-to-csv と html-generator を組み合わせて テーブルに色を塗るところまでは でけたぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 参加者IDと、テーブルID を紐づけるだけで この図ができるような
使い勝手にしましょう」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 参加者IDと テーブルIDが紐づいていたら 参加者ID順にテーブルのIDの先頭から座っていくことになってしまう☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Mapping という名前の別テーブルを作って、Participants列と、Table列を用意するかだぜ☆」

Participant,Table
1,1
2,2
3,3
4,4
5,5

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 昨日買ってきた Excel360 だかなんだかいうスプレッドシートで作成して CSV出力☆」

import pandas as pd
from attribute.query_id_sorted_table import query_id_sorted_table

#
# Note.
#
# Root directory: Visual studio code workspace root.
#

# Output.
output_css = "./html-generator/auto-generated/participants.css"

# Floor map: Csv -> Data frame. (Not record set)
fl_df = pd.read_csv("./html-generator/data/floor-map.csv",
                    sep=',', engine='python')
# print(fl_df.values.tolist())
"""
ID,X,Y,BLOCK
27,0,0,C
26,1,0,C
25,2,0,C
"""


# Participants
pa_df = query_id_sorted_table("./html-generator/data/participant.csv")
"""
ID,GENRE_CODE
1,Red
2,Red
3,Blue

print(pa_df.values.tolist())
[[30, 'Blue'], [6, 'Blue'], [56, 'Blue'], [50, 'Blue'], [40, 'Blue'], [33, 'Blue'], [27, 'Blue'], [22, 'Blue'], [17, 'Blue'], [15, 'Blue'], [8, 'Blue'], [4, 'Blue'], [3, 'Blue'], [60, 'Blue'], [5, 'Green'], [10, 'Green'], [14, 'Green'], [9, 'Green'], [29, 'Green'], [36, 'Green'], [42, 'Green'], [44, 'Green'], [53, 'Green'], [57, 'Green'], [16, 'Yellow'], [20, 'Yellow'], [26, 'Yellow'], [31, 'Yellow'], [43, 'Yellow'], [51, 'Yellow'], [58, 'Yellow'], [18, 'Yellow'], [1, 'Red'], [7, 'Red'], [2, 'Red'], [52, 'Red'], [41, 'Red'], [37, 'Red'], [21, 'Red'], [12, 'Red'], [59, 'White'], [48, 'White'], [39, 'White'], [25, 'White'], [54, 'Orange'], [46, 'Black'], [24, 'Black'], [23, 'Black'], [32, 'Orange'], [38, 'Orange'], [35, 'Gray'], [49, 'Gray'], [13, 'Violet'], [34, 'Pink'], [28, 'Pink'], [55, 'Violet'], [19, 'SkyBlue'], [11, 'Purple'], [45, 'YellowGreen'], [47, 'Brown']]
"""

# Mappings
ma_df = pd.read_csv("./html-generator/data/mappings.csv",
                    sep=',', engine='python')
"""
ID,GENRE_CODE
1,Red
2,Red
3,Blue
"""

# Join1
new_df = pa_df.merge(ma_df, left_on='ID', right_on='PARTICIPANT')
# print(new_df.head(50))
"""
    ID GENRE_CODE  PARTICIPANT  TABLE
0   30       Blue           30     30
1    6       Blue            6      6
2   56       Blue           56     56
"""

# Join2
new2_df = new_df.merge(fl_df, left_on='TABLE', right_on='ID')
# print(new2_df.head(50))
"""
    ID_x GENRE_CODE  PARTICIPANT  TABLE  ID_y   X  Y BLOCK
0     30       Blue           30     30    30   0  3     C
1      6       Blue            6      6     6  18  5     A
2     56       Blue           56     56    56   3  2     F
"""


def write():
    try:
        file = open(output_css, 'w', encoding='utf-8')
        file.write(
            """
{}
            """.format(get_boxes())
        )
    except Exception as e:
        print(e)
    finally:
        file.close()


def get_boxes():
    html = []
    for _index, new2_row in new2_df.iterrows():

        # Participant id.
        id = new2_row["PARTICIPANT"]
        # print("     id : {}".format(id))
        # print("type(id): {}".format(type(id)))

        x = new2_row["X"]
        y = new2_row["Y"]

        width = 16
        height = 16

        html.append(
            """
#box{} {{
    position: absolute;
    left    : {: >4}px;
    top     : {: >4}px;
    width   : {: >4}px;
    height  : {: >4}px;
    background-color: {};
}}
            """.format(
                id,
                x * width,
                y * height,
                width,
                height,
                new2_row["GENRE_CODE"])
        )

    return "".join(html)


write()

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 頭が回らないので 洗練させずに だらだら書くが、
ジョインして CSV出力☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 これで Mapping.csv さえ書いてくれれば HTML/CSV 表示するぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 とりあえず 参加者の数と、机の数は 同じものとしてくれだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 テストしましょう。 シャッフルして表示してみてちょうだい」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 participant.csv のID列のリストを作ってシャッフル、
floor-map.csv のID列のリストを作ってシャッフル するかだぜ☆」

participant.csv

ID,GENRE_CODE
1,Red
2,Red
3,Blue

floor-map.csv

ID,X,Y,BLOCK
27,0,0,C
26,1,0,C
25,2,0,C

go_campaign_map1-ver2.py

import random
import pandas as pd

"""
Note.
    Root directory: Visual studio code workspace root.

Participants
------------

ID,GENRE_CODE
1,Red
2,Red
3,Blue
"""
# Output.
output_mappings = "./event-placement-ai/auto-generated/mappings.csv"

# Participants: Csv -> Data frame. (Not record set)
pd_df = pd.read_csv("./event-placement-ai/data/participant.csv",
                    sep=',', engine='python')
pd_list = pd_df["ID"].values.tolist()
random.shuffle(pd_list)
print("pd_list: {}".format(pd_list))

# Floor map: Csv -> Data frame. (Not record set)
fl_df = pd.read_csv("./event-placement-ai/data/floor-map.csv",
                    sep=',', engine='python')
fl_list = fl_df["ID"].values.tolist()
random.shuffle(fl_list)
print("fl_list: {}".format(fl_list))

try:
    file = open(output_mappings, 'w', encoding='utf-8')

    file.write("PARTICIPANT,TABLE\n")
    for i in range(len(pd_list)):
        file.write(
            "{},{}\n".format(pd_list[i], fl_list[i])
        )
except Exception as e:
    print(e)
finally:
    file.close()


print("Info    : Finished.")

mappings.csv

PARTICIPANT,TABLE
57,25
38,26
6,8
13,32
60,7
49,23
32,60
25,37
10,10
37,42
40,29
11,44
26,17
24,39
12,24
46,40
22,41
17,18
7,28
9,36
28,45
19,54
59,35
51,33
56,11
8,12
18,53
4,48
2,46
31,15
27,43
52,2
21,13
53,38
35,57
33,31
43,50
47,47
16,22
42,1
20,5
29,56
54,52
3,51
5,14
44,30
36,34
45,6
58,58
50,4
30,20
23,27
34,19
41,49
55,21
14,3
48,9
1,59
39,55
15,16

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 シャッフルするプログラムをまず作って……☆」

20190721blog47a2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 HTMLジェネレーターにかければ シャッフルされてるぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 あとは 色が隣接しているときに 報酬を与えて、
シャッフルしながら 利益が1番高いものを選べばいいのよ」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 なるほど☆」

entry_list.py

import random
import pandas as pd

"""
Note.
    Root directory: Visual studio code workspace root.
"""


def read_entry_lists():
    """
    From: Participant.csv
    ---------------------

    ID,GENRE_CODE
    1,Red
    2,Red
    3,Blue
    """
    pd_df = pd.read_csv("./event-placement-ai/data/participant.csv",
                        sep=',', engine='python')
    pd_list = pd_df["ID"].values.tolist()

    """
    From: floor-map.csv
    -------------------
    """
    fl_df = pd.read_csv("./event-placement-ai/auto-generated/floor-map.csv",
                        sep=',', engine='python')
    fl_list = fl_df["ID"].values.tolist()
    return pd_list, fl_list
from my_lib.entry_list import read_entry_lists

pd_list, fl_list = read_entry_lists()
````

![KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif](https://crieit.now.sh/upload_images/3da2d4690cf2c3f101c5cbc0e48729f55d2ad80297e17.gif)
「 参加者IDのリストと、テーブルIDのリストは
read_entry_lists() 一発で取れるようにしておこう☆」

shuffuling.py

import random

"""
Note.
Root directory: Visual studio code workspace root.
"""

def go_shuffule(pd_list, fl_list):
random.shuffle(pd_list)
# print("pd_list: {}".format(pd_list))

random.shuffle(fl_list)
# print("fl_list: {}".format(fl_list))

"""
Make: mappings.csv
------------------

PARTICIPANT,TABLE
57,25
38,26
6,8
"""
try:
    output_mappings = "./event-placement-ai/html_generator/auto-generated/mappings.csv"
    file = open(output_mappings, 'w', encoding='utf-8')

    file.write("PARTICIPANT,TABLE\n")
    for i in range(len(pd_list)):
        file.write(
            "{},{}\n".format(pd_list[i], fl_list[i])
        )
except Exception as e:
    print(e)
finally:
    file.close()

![KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif](https://crieit.now.sh/upload_images/3da2d4690cf2c3f101c5cbc0e48729f55d2ad80297e17.gif) 「 リストをシャッフルして mappings.csv ファイルを作成するまでを1連の処理にするぜ☆」

from html_generator.go_css import new_csv
from my_lib.entry_list import read_entry_lists
from my_lib.shuffuling import go_shuffule

pd_list, fl_list = read_entry_lists()
go_shuffule(pd_list, fl_list)
new_csv()
print("Info : Finished.")


![KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif](https://crieit.now.sh/upload_images/3da2d4690cf2c3f101c5cbc0e48729f55d2ad80297e17.gif) 「 プログラムのメイン・ルーチンは こんな感じ☆」 ![OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif](https://crieit.now.sh/upload_images/058791c2dd4c1604ce1bd9ec26d490ae5d2ad86d3991b.gif) 「 毎回 CSVを出力していると重いから、 とりあえず CSV出力無しで 評価を出すのを ループで10回やってみましょう!」 ![KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif](https://crieit.now.sh/upload_images/3da2d4690cf2c3f101c5cbc0e48729f55d2ad80297e17.gif) 「 CSVを作る前に X、Y の位置関係を 2次元のテーブルにしたいよな☆」 position.py

import pandas as pd

"""
Note.
Root directory: Visual studio code workspace root.
"""

def new_position():
"""
Create position.
"""

# Output.
output_position = "./event-placement-ai/auto-generated/position.csv"

"""
Input: floor-map.csv
--------------------

ID,X,Y,BLOCK
27,0,0,C
26,1,0,C
25,2,0,C
"""
fl_df = pd.read_csv("./event-placement-ai/auto-generated/floor-map.csv",
                    sep=',', engine='python')

"""
Input: participants.csv
-----------------------

ID,GENRE_CODE
1,Red
2,Red
3,Blue
"""
pa_df = pd.read_csv(
    "./event-placement-ai/html_generator/input/participant.csv")

"""
Auto-generated: Mappings
------------------------

ID,GENRE_CODE
1,Red
2,Red
3,Blue
"""
ma_df = pd.read_csv("./event-placement-ai/html_generator/auto-generated/mappings.csv",
                    sep=',', engine='python')

"""
New-table: new_df
-----------------

Join.
print(new_df.head(3))

    ID GENRE_CODE  PARTICIPANT  TABLE
0   30       Blue           30     30
1    6       Blue            6      6
2   56       Blue           56     56
"""
new_df = pa_df.merge(ma_df, left_on='ID', right_on='PARTICIPANT')
new_df = new_df.drop("ID", axis=1)

"""
New-table: new2_df
------------------

print(new2_df.head(3))

    GENRE_CODE  PARTICIPANT  TABLE  ID   X  Y BLOCK
0         Blue           30     30  30   0  3     C
1         Blue            6      6   6  18  5     A
2         Blue           56     56  56   3  2     F
"""
new2_df = new_df.merge(fl_df, left_on='TABLE', right_on='ID')
new2_df = new2_df.drop("ID", axis=1)

"""
output
------

GENRE_CODE,PARTICIPANT,TABLE,X,Y,BLOCK
Red,1,31,0,4,C
Red,2,25,2,0,C
Blue,3,8,19,4,A
"""
new2_df.to_csv(output_position, index=False)

new2_df

position.csv

GENRE_CODE,PARTICIPANT,TABLE,X,Y,BLOCK
Red,1,31,0,4,C
Red,2,25,2,0,C
Blue,3,8,19,4,A


![KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif](https://crieit.now.sh/upload_images/3da2d4690cf2c3f101c5cbc0e48729f55d2ad80297e17.gif) 「 これだけの情報が取得できれば十分だろう……☆」 go_css.py

import pandas as pd

"""
Note.
Root directory: Visual studio code workspace root.
"""

def new_csv(pos_df):
"""
Create csv.
"""

# Output.
output_css = "./event-placement-ai/html_generator/auto-generated/table-color.css"

def write():
    try:
        file = open(output_css, 'w', encoding='utf-8')
        file.write(
            """
{}
            """.format(get_boxes())
        )
    except Exception as e:
        print(e)
    finally:
        file.close()

def get_boxes():
    html = []
    for _index, row in pos_df.iterrows():

        # Participant id.
        id = row["PARTICIPANT"]
        # print("     id : {}".format(id))
        # print("type(id): {}".format(type(id)))

        x = row["X"]
        y = row["Y"]

        width = 16
        height = 16

        html.append(
            """
#box{} {{
    position: absolute;
    left    : {: >4}px;
    top     : {: >4}px;
    width   : {: >4}px;
    height  : {: >4}px;
    background-color: {};
}}
            """.format(
                id,
                x * width,
                y * height,
                width,
                height,
                row["GENRE_CODE"])
        )

    return "".join(html)

write()

![KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif](https://crieit.now.sh/upload_images/3da2d4690cf2c3f101c5cbc0e48729f55d2ad80297e17.gif) 「 CSS書き出しは簡単になるから……☆」 go_campaign_map1-ver2.py

from html_generator.go_css import new_csv
from my_lib.entry_list import read_entry_lists
from my_lib.shuffuling import go_shuffule
from my_lib.position import new_position

pd_list, fl_list = read_entry_lists()
go_shuffule(pd_list, fl_list)
pos_df = new_position()
new_csv(pos_df)
print("Info : Finished.")
```

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 メイン・プログラムで 局面(position)を取れるようになった☆
この局面を元に 評価すればいい☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 コンピューター将棋に 似せてしまえば パターンに入るな☆」

20190721blog48a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 しかし出力結果がこんなんでは、
また 手で 打ち直すのがめんどうだな……☆」

20190721blog48a2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 CSVで、ここまで出力して、あとは 任せるかだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 記事を変えよう☆」

<書きかけ>

ツイッターでシェア
みんなに共有、忘れないようにメモ

むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント