研究について

オークションを使う理由が分かりました!非常に単純ですが...
サプライヤーの商品を作るコストはサプライヤー固有の情報となります。そのためここで、サプライヤーと小売業者間で情報の非対称性が存在します。
小売業者は最も安いサプライヤーを見つけるために、逆オークションを用いているようです。
そのため、サプライヤー複数ということですね。

研究について

相変わらず、
"First- and second-price sealed-bid auctions applied to push and pull supply contracts"
を読んでます。
11月15日までには完全に理解したいと思っています。

昨日の段階で、そもそもpush/pull contract ってなんやねんという疑問がありました。

簡単に言うと、サプライヤー(工場)と小売業者がいたときに、
push contract ではサプライヤーが小売業者にある商品の卸売価格を提示し、小売業者がその価格を受け入れるなら商品の量を決定するという契約。そのため、小売業者は在庫リスクが存在します。
pull contract はpush contract の逆で、小売業者がサプライヤーに対してある商品の卸売価格を提示します。サプライヤーがその価格を受け入れるなら供給量を決定します。そのため、サプライヤーが在庫リスクを負担することになります。

要するに、サプライヤーと小売のどっちが力を持っているかということですね。
実社会だと、サプライヤーが力を持っている会社はDELLとかが挙げられますね。
小売が力を持っているのは、ユニクロとかセブンアンドアイのPBなどです。

この論文はそのpush contract か pull contract のどちらが良いかという評価をサプライヤーと小売業者の情報の非対称性やオークションの種類(まだなぜオークションが出てくるのかわかりません...)という状況の違いによってしています。

しかし、サプライヤーと小売業者のどっちが力を持っているかなんて最初から決まっているし、相手が力を持っていたほうがよいという結果になったとしても、果たして相手に最初の意思決定を許すのか甚だ疑問である...笑

Kindle

今日ついにkindle paperwhiteを買いました!明日届く予定です!円安のせいかちょっと高かったです。
実本で読む感じが好きだったのですが、バイトの都合で遠くに行くことが多いので厚い本を読むことは敬遠してました。
電子書籍だったらそんなことも気にしなくていいので、明日から楽しみです!
衝動買いに気をつけたいと思います。
IPhoneのアプリでもみたいなぁと思っていて、アカウントで別の端末から見れるようになっているのかな...?

研究について

研究について書きたいと思います。
僕はアウトプットしないと忘れちゃうため、これは完全に備忘録です。ごめんなさい。

研究テーマ決定に向けて、興味あるかつ関連しそうな
"First- and second-price sealed-bid auctions applied to push and pull supply contracts"
のIntroductionとConclusionだけ読んでみました。

そもそもこの論文はサプライチェーンにおいて、いくつかの状況を仮定し、その状況における評価・分析を行っています。
その状況というものがミソで、今後の僕自身の研究テーマになりそうなのですが...

そもそも現状として、ここ十年で商品やサービスにおいてアウトソーシングがトレンドになっているみたい。
フォルクスワーゲンとかも75.4億ユーロという規模をアウトソーシングしてみたいで、そのコストを下げるために、逆オークションっていって
欲しい製品や部品を作ってくれる複数の工場にいくらで作るか入札してもらってる。
その時に、入札する工場も入札してもらう会社もそれぞれにしかもっていない固有の情報があったり、企業の性格や実際のオークションの種類等様々な差異がある。
そういった状況下でサプライチェーン全体として、売手(工場)として、買手(企業)としてどんな状況がよいか、どんな戦略にすればよいか論じている論文です。
詳しいことは明日以降です。この論文はちゃんと読もうと思います...(最近、アブスト、イントロ、コンクルージョンだけ読んで他を読まないことは頻発しているので...)

フルスクリーン

ウィンドウをフルスクリーンにする方法です.
非常に簡単なので, スプライトのグループ化の別の方法もまとめて説明します.
ウィンドウのフルスクリーン化はキーイベントによって操作します.

import pygame
from pygame.locals import *
import sys

SCR_RECT = Rect(0, 0, 1000, 700)

class MySprite(pygame.sprite.Sprite):
    def __init__(self, filename, x, y, vx, vy):
        # デフォルトグループをセット
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.image = pygame.image.load(filename).convert()
        colorkey = self.image.get_at((0,0))  # 左上の色を透明色に
        self.image.set_colorkey(colorkey, RLEACCEL)
        width = self.image.get_width()
        height = self.image.get_height()
        self.rect = Rect(x, y, width, height)
        self.vx = vx
        self.vy = vy

    def update(self):
        self.rect.move_ip(self.vx, self.vy)
        # 壁にぶつかったら跳ね返る
        if self.rect.left < 0 or self.rect.right > SCR_RECT.width:
            self.vx = -self.vx
        if self.rect.top < 0 or self.rect.bottom > SCR_RECT.height:
            self.vy = -self.vy
        # 画面からはみ出ないようにする
        self.rect = self.rect.clamp(SCR_RECT)

def main():
    pygame.init()
    screen = pygame.display.set_mode(SCR_RECT.size)
    pygame.display.set_caption("フルスクリーンモード")
    # スプライトグループを作成してスプライトクラスに割り当て
    group = pygame.sprite.RenderUpdates()
    MySprite.containers = group
    # スプライトを作成
    python1 = MySprite("kappa3.png", 0, 0, 2, 2)
    python2 = MySprite("kappa3.png", 10, 10, 5, 5)
    python3 = MySprite("kappa3.png", 320, 240, -2, 3)
    clock = pygame.time.Clock()
    fullscreen_flag = False
    while True:
        clock.tick(60)  # 60fps
        backImg = pygame.image.load("hakusuiko.jpg").convert()
        screen.blit(backImg, (0,0))
        # スプライトグループを更新
        group.update()
        # スプライトグループを描画
        group.draw(screen)
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    sys.exit()
                elif event.key == K_F2:
                # F2キーでフルスクリーンモードへの切り替え
                    fullscreen_flag = not fullscreen_flag
                    if fullscreen_flag:
                        screen = pygame.display.set_mode(SCR_RECT.size, FULLSCREEN, 32)
                    else:
                        screen = pygame.display.set_mode(SCR_RECT.size, 0, 32)

if __name__ == "__main__":
    main()

MySpriteクラスとmain()関数のスプライトのグループ化が多少異なります.

前回はpython1,python2,python3という画像を定義したあと,

group = pygame.sprite.RenderUpdates()
    group.add(python1)
    group.add(python2)
    group.add(python3)

これによってグループ化を行っていました.
今回は, まずSpriteの引数にグループリストを追加させるためにpygame.sprite.Sprite.__init__()にself.containersという引数も設定します. 第二引数なのでclass内になくても大丈夫です.

group = pygame.sprite.RenderUpdates()
    MySprite.containers = group

これによってグループ化を行っています.
これはあらかじめスプライトのデフォルトグループを指定し, スプライトの作成と同時にグループに追加するスクリプトです.

次にフルスクリーンの設定をします.
まずmain関数にfullscreen_flagという変数にFalseを代入しておきます.
そこからキーイベントによる設定です.

event.key == K_F2:

これは, キーイベントにおいてF2がおされたならという意味です.

fullscreen_flag = not fullscreen_flag

これはTrueとFalseの変更です.
初めてこのスクリプトを実行したなら, fullscreen_flagはFalseですがこの文でTrueとなります.

if fullscreen_flag:
                    screen = pygame.display.set_mode(SCR_RECT.size, FULLSCREEN, 32)
                else:
                    screen = pygame.display.set_mode(SCR_RECT.size, 0, 32)

この文でのfullscreen_flagがTrueのときフルスクリーンになります.
フルスクリーンになっているときはfullscreen_flagはTrueなので, F2を押すとFalseになり初期化されウィンドウモードとなります.
pygame.display.set_mode()の第三引数は32bitの色とを指定しています.

スプライト2

前回のスプライトのプログラムは, 画像をそれぞれ更新, 描写をしなくてはいけないのでグループとしてまとめます.

import pygame
from pygame.locals import *
import sys

SCR_RECT = Rect(0, 0, 1000, 700)

class MySprite(pygame.sprite.Sprite):
    def __init__(self, filename, x, y, vx, vy):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(filename).convert()
        colorkey = self.image.get_at((0,0))  # 左上の色を透明色に
        self.image.set_colorkey(colorkey, RLEACCEL)
        width = self.image.get_width()
        height = self.image.get_height()
        self.rect = Rect(x, y, width, height)
        self.vx = vx
        self.vy = vy

    def update(self):
        self.rect.move_ip(self.vx, self.vy)
        # 壁にぶつかったら跳ね返る
        if self.rect.left < 0 or self.rect.right > SCR_RECT.width:
            self.vx = -self.vx
        if self.rect.top < 0 or self.rect.bottom > SCR_RECT.height:
            self.vy = -self.vy
        # 画面からはみ出ないようにする
        self.rect = self.rect.clamp(SCR_RECT)

def main():
    pygame.init()
    screen = pygame.display.set_mode(SCR_RECT.size)
    pygame.display.set_caption("スプライトグループの使い方")

    # スプライトを作成
    python1 = MySprite("kappa3.png", 0, 0, 3, 6)
    python2 = MySprite("kappa3.png", 10, 10, 5, 5)
    python3 = MySprite("kappa3.png", 320, 240, -2, 3)

    # スプライトグループを作成してスプライトを追加
    group = pygame.sprite.RenderUpdates()
    group.add(python1)
    group.add(python2)
    group.add(python3)

    clock = pygame.time.Clock()

    while True:
        clock.tick(60)  # 60fps
        backImg = pygame.image.load("hakusuiko.jpg").convert()
        screen.blit(backImg, (0,0))
        # スプライトグループを更新
        group.update()
        # スプライトグループを描画
        group.draw(screen)
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == QUIT:
                sys.exit()

if __name__ == "__main__":
    main()

グループ化によってMySprteのdraw()関数を省略することができます.
スプライトのグループ化は用途によっていくつかの種類があります.
pygame.sprite.Groupは衝突判定に使われます.今回は行わないので使いません.
pygame.sprite.RenderUpdatesはスプライトの更新と描写を行います.
今回はこれを使用します.