「 更新回数に上限があるのかも知らん☆ 再投稿で回避だぜ☆!」
例。
第29回世界コンピュータ将棋選手権
川崎市産業振興会館 4F
「 参加者の方も 数種類にグループ分けすることができるぜ☆
外部が見えるルーターが欲しいリモート勢、 電力が大きい勢、 両方勢、 それ以外勢☆」
「 最近は リモートが流行りだから 大きな電源要らないのよ」
「 すると 必要としている人を 供給があるところに ちょんちょんちょん と置いていくだけで
答えが出る☆
なんの 考えもいらない……☆」
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.
「 Python3 を使って 変動する あらゆるチーム数に対応した 最善の席を 算出したい☆」
「 参加者数が 40とか50という小さな オーダー のものに 人工知能とか要らないのよ。
手で ちゃっちゃと やりなさいよ!」
「 本編と違うステージとかを キャンペーンマップと言うが、練習用に1つ用意しよう☆」
「 これは 即売会の配置ねぇ。 大会に広い通路は要らないもの」
「 物を売るイベントの方が 配置が重要だぜ☆ 来場者の動線というものがある☆」
「 これぐらい小さいところは ブロック番号を分けなくていいんだが、練習なんで 分けている☆
趣意としては☆」
Block | Space |
---|---|
A | 18 |
B | 4 |
C | 14 |
D | 10 |
E | 8 |
F | 6 |
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]
「 イベント会場の 電源の配置図とか 載ってないものだな……☆
色んな会場を 調べてみるかだぜ☆」
日本全国横断 主要同人イベント会場・コンベンションセンター・メッセ一覧
東京ビッグサイト 会議設備・備品利用料金
川崎市振興産業会館 4階 企画展示場
大田区産業プラザPIO 大展示場
ベルサール秋葉原 2F HALL全体
「 バトル大会では シード組か そうでないか、
即売会では ジャンル・コード などが配置に大きく関わってくるぜ☆」
「 バトル大会の人口より 即売会の人口の方が多いでしょう。
即売会の流儀を参考にしましょう」
「 じゃあ ジャンル・コードで☆
これは 買いに来る人が 巡回する目印にする分類番号で、
3時間ぐらいで全部回れるように 関連するジャンルを近づけるように 配慮しろだぜ☆」
「 こういうプログラムを作るときは、
北だの南だの、空間の位置関係を取り扱う部分と
電力だのジャンルコードだの、属性の相性を取り扱う部分は
切り分けておくことが 鉄則だぜ☆」
「 ロジック的なものと、視覚的なものは ケンカ するからな☆」
「 人間の脳も 左脳と右脳は 脳梁で分けられていると聞くぜ☆
いっしょにすると 足を引っ張り合うんだぜ☆
おそらく、整理された本棚と 作業机の上ぐらい 性格が合わない☆」
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
「 これがその 整理された本棚 の方にあたるデータに使うやつだぜ☆」
# 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"),
]
「 Excel で ちゃちゃっと作って CSV 吐いたら?」
「 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']
# 以下略
「 pandas とかいうデータ分析用のライブラリがあるみたいだが 利用者数はどれぐらいだろうか☆?」
「 Visual studio code の Terminal ペーンに pip コマンドを使って簡単にインストールでけた☆」
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.
「 ただ、ジャンルコード順に 島に並べても 島と島は 配置は 飛んでたりするから
また今度 見直そうぜ☆」
「 HTML/CSS と連動できないか試してみようぜ☆?
Python3 で テキストファイル作成ぐらいできるだろ☆?」
「 京都の火災ニュースで 記憶が飛んでしまったが、練習したぜ☆ おさらいしよう☆」
「 HTML/CSS を利用して、ジャンルコードの代わりに色で 多いもの順に四角を表示するところはできた☆
このプログラムには html-generator という名前を付けた☆」
「 説明の気が抜けていて 言っていることが よく分からん☆」
「 タテ1列に並んでいても あんまりなので、机の配置のように並べたいのだった☆」
CCCCC..BBBB..AAAAAAA
C..................A
C.FFF..EEEE..DDDDD.A
C.FFF..EEEE..DDDDD.A
C..................A
CCCCC........AAAAAAA
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,.
「 CSV形式にコンバートする部品も作った☆
名前は ascii-floor-map-to-csv にした☆」
「 この CSV をもとに、表示位置を生成するように html-generator を改造しようぜ☆?」
「 日本語をしゃべっているようで お父んが ぼーっ としている☆!
習慣だけで PCに向かって プログラムを書いているだけだぜ☆!」
「 ascii-floor-map-to-csv
と html-generator
を組み合わせて テーブルに色を塗るところまでは でけたぜ☆」
「 参加者IDと、テーブルID を紐づけるだけで この図ができるような
使い勝手にしましょう」
「 参加者IDと テーブルIDが紐づいていたら 参加者ID順にテーブルのIDの先頭から座っていくことになってしまう☆」
「 Mapping という名前の別テーブルを作って、Participants列と、Table列を用意するかだぜ☆」
Participant,Table
1,1
2,2
3,3
4,4
5,5
「 昨日買ってきた 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()
「 頭が回らないので 洗練させずに だらだら書くが、
ジョインして CSV出力☆」
「 これで Mapping.csv さえ書いてくれれば HTML/CSV 表示するぜ☆」
「 とりあえず 参加者の数と、机の数は 同じものとしてくれだぜ☆」
「 テストしましょう。 シャッフルして表示してみてちょうだい」
「 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
「 HTMLジェネレーターにかければ シャッフルされてるぜ☆」
「 あとは 色が隣接しているときに 報酬を与えて、
シャッフルしながら 利益が1番高いものを選べばいいのよ」
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()
````

「 参加者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()

「 リストをシャッフルして 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.")

「 プログラムのメイン・ルーチンは こんな感じ☆」

「 毎回 CSVを出力していると重いから、
とりあえず CSV出力無しで
評価を出すのを ループで10回やってみましょう!」

「 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

「 これだけの情報が取得できれば十分だろう……☆」
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()

「 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.")
```
「 メイン・プログラムで 局面(position)を取れるようになった☆
この局面を元に 評価すればいい☆」
「 コンピューター将棋に 似せてしまえば パターンに入るな☆」
「 しかし出力結果がこんなんでは、
また 手で 打ち直すのがめんどうだな……☆」
<書きかけ>
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント