未分類

英単語を翻訳しました。以下がそれぞれの日本語訳です:

1. osm_id - OSM ID
2. osm_way_id - OSM ウェイID
3. name - 名前
4. type - 種類
5. aeroway - 航空施設
6. amenity - 施設 (駐車場、 映画館、美術館、病院など、色々なものが沢山入っているので、ここで纒めるのは不味いかも)
7. admin_level - 管理レベル
8. barrier - 障害物
9. boundary - 境界
10. building - 建物
11. craft - 工芸品/職人
12. geological - 地質
13. historic - 歴史的 (歴史的な公園 観光の対象になるのか?)
14. land_area - 土地面積
15. landuse - 土地利用
16. leisure - レジャー (これはレジャー一般で纒められるかな? しかし種類が多様なので、なんとも)
17. man_made - 人工物
18. military - 軍事
19. natural - 自然  (川などが指定される)
20. office - 事務所 (職場で同義でいいかな? 博多駅周辺には全くない。天神には2箇所ほどある)
21. place - 場所 (あまり意味ない)
22. shop - 店舗 (天神には複数の塊があるが、博多駅周辺には2箇所くらいしかない。どうも博多駅の周辺のサポートが弱い)
23. sport - スポーツ (天神駅周辺にも博多駅周辺にもない。ちょっと遠い所には多い)
24. tourism - 観光(観光名所、と見て良いだろう ホテル)
25. other_tags - その他のタグ

 

$ grep "amenity" hakata_train.osm | sort | uniq  (同じものは2回でてこない)
<tag k="amenity" v="Wisteria_trellis"/>
<tag k="amenity" v="animal_shelter"/>
<tag k="amenity" v="arts_centre"/>
<tag k="amenity" v="atm"/>
<tag k="amenity" v="bal"/>
<tag k="amenity" v="bank"/>
<tag k="amenity" v="bar"/>
<tag k="amenity" v="batting_cage"/>
<tag k="amenity" v="bbq"/>
<tag k="amenity" v="bench"/>
<tag k="amenity" v="bicycle_parking"/>
<tag k="amenity" v="bicycle_rental"/>
<tag k="amenity" v="biergarten"/>
<tag k="amenity" v="boat_rental"/>
<tag k="amenity" v="boat_storage"/>
<tag k="amenity" v="bridge"/>
<tag k="amenity" v="brothel"/>
<tag k="amenity" v="bus_station"/>
<tag k="amenity" v="cafe"/>
<tag k="amenity" v="car_rental"/>
<tag k="amenity" v="car_sharing"/>
<tag k="amenity" v="car_wash"/>
<tag k="amenity" v="charging_station"/>
<tag k="amenity" v="childcare"/>
<tag k="amenity" v="cinema"/>
<tag k="amenity" v="clinic"/>
<tag k="amenity" v="clock"/>
<tag k="amenity" v="college"/>
<tag k="amenity" v="community_centre"/>
<tag k="amenity" v="conference_centre"/>
<tag k="amenity" v="conveniencestore"/>
<tag k="amenity" v="courthouse"/>
<tag k="amenity" v="coworking_space"/>
<tag k="amenity" v="crematorium"/>
<tag k="amenity" v="dentist"/>
<tag k="amenity" v="doctors"/>
<tag k="amenity" v="dojo"/>
<tag k="amenity" v="drinking_water"/>
<tag k="amenity" v="driving_school"/>
<tag k="amenity" v="events_venue"/>
<tag k="amenity" v="exhibition_centre"/>
<tag k="amenity" v="fast_food"/>
<tag k="amenity" v="ferry_terminal"/>
<tag k="amenity" v="fire_station"/>
<tag k="amenity" v="fixme"/>
<tag k="amenity" v="food_court"/>
<tag k="amenity" v="fountain"/>
<tag k="amenity" v="fuel"/>
<tag k="amenity" v="gambling"/>
<tag k="amenity" v="grave_yard"/>
<tag k="amenity" v="hospital"/>
<tag k="amenity" v="ice_cream"/>
<tag k="amenity" v="internet_cafe"/>
<tag k="amenity" v="izakaya"/>
<tag k="amenity" v="karaoke_box"/>
<tag k="amenity" v="kindergarten"/>
<tag k="amenity" v="language_school"/>
<tag k="amenity" v="library"/>
<tag k="amenity" v="love_hotel"/>
<tag k="amenity" v="luggage_locker"/>
<tag k="amenity" v="marketplace"/>
<tag k="amenity" v="motorcycle_parking"/>
<tag k="amenity" v="motorcycle_rental"/>
<tag k="amenity" v="music_school"/>
<tag k="amenity" v="nightclub"/>
<tag k="amenity" v="parcel_locker"/>
<tag k="amenity" v="parking"/>
<tag k="amenity" v="parking_entrance"/>
<tag k="amenity" v="parking_space"/>
<tag k="amenity" v="pharmacy"/>
<tag k="amenity" v="photo_booth"/>
<tag k="amenity" v="place_of_worship"/>
<tag k="amenity" v="planetarium"/>
<tag k="amenity" v="police"/>
<tag k="amenity" v="post_box"/>
<tag k="amenity" v="post_depot"/>
<tag k="amenity" v="post_office"/>
<tag k="amenity" v="prep_school"/>
<tag k="amenity" v="prison"/>
<tag k="amenity" v="pub"/>
<tag k="amenity" v="public_bath"/>
<tag k="amenity" v="public_building"/>
<tag k="amenity" v="recycling"/>
<tag k="amenity" v="restaurant"/>
<tag k="amenity" v="school"/>
<tag k="amenity" v="shelter"/>
<tag k="amenity" v="shower"/>
<tag k="amenity" v="smoking_area"/>
<tag k="amenity" v="social_centre"/>
<tag k="amenity" v="social_facility"/>
<tag k="amenity" v="stage"/>
<tag k="amenity" v="studio"/>
<tag k="amenity" v="taxi"/>
<tag k="amenity" v="telephone"/>
<tag k="amenity" v="theatre"/>
<tag k="amenity" v="toilets"/>
<tag k="amenity" v="townhall"/>
<tag k="amenity" v="training"/>
<tag k="amenity" v="university"/>
<tag k="amenity" v="vending_machine"/>
<tag k="amenity" v="veterinary"/>
<tag k="amenity" v="waste_basket"/>
<tag k="amenity" v="waste_disposal"/>
<tag k="amenity" v="waste_transfer_station"/>
<tag k="amenity" v="water_point"/>
<tag k="amenity" v="wisteria_trellis"/>
<tag k="amenity_1" v="キリスト教会"/>
<tag k="disused:amenity" v="bank"/>
<tag k="disused:amenity" v="cafe"/>
<tag k="disused:amenity" v="fast_food"/>
<tag k="disused:amenity" v="pub"/>
<tag k="disused:amenity" v="public_bath"/>
<tag k="disused:amenity" v="restaurant"/>
<tag k="note" v="Tentative `amenity=clinic`"/>
<tag k="was:amenity" v="hospital"/>

"amenity" IS NOT NULL

======

tomoi@DESKTOP-1QS7OI7 MSYS /g/home/ebata/hakata/hakata_db
$ grep "leisure" hakata_train.osm | sort | uniq
<tag k="leisure" v="adult_gaming_centre"/>
<tag k="leisure" v="amusement_arcade"/>
<tag k="leisure" v="beach_resort"/>
<tag k="leisure" v="bowling_alley"/>
<tag k="leisure" v="common"/>
<tag k="leisure" v="dog_park"/>
<tag k="leisure" v="fishing"/>
<tag k="leisure" v="fitness_centre"/>
<tag k="leisure" v="fitness_station"/>
<tag k="leisure" v="game_arcade"/>
<tag k="leisure" v="garden"/>
<tag k="leisure" v="gateball"/>
<tag k="leisure" v="golf_course"/>
<tag k="leisure" v="ground"/>
<tag k="leisure" v="hackerspace"/>
<tag k="leisure" v="horse_riding"/>
<tag k="leisure" v="ice_rink"/>
<tag k="leisure" v="marina"/>
<tag k="leisure" v="miniature_golf"/>
<tag k="leisure" v="outdoor_seating"/>
<tag k="leisure" v="park"/>
<tag k="leisure" v="picnic_table"/>
<tag k="leisure" v="pitch"/>
<tag k="leisure" v="playground"/>
<tag k="leisure" v="recreation_ground"/>
<tag k="leisure" v="sauna"/>
<tag k="leisure" v="slipway"/>
<tag k="leisure" v="spa"/>
<tag k="leisure" v="sports_centre"/>
<tag k="leisure" v="sports_hall"/>
<tag k="leisure" v="stadium"/>
<tag k="leisure" v="swimming_pool"/>
<tag k="leisure" v="track"/>
<tag k="leisure" v="trampoline_park"/>
<tag k="leisure" v="water_park"/>

"leisure" IS NOT NULL

==============

$ grep "shop" hakata_train.osm | sort | uniq
<tag k="shop" v="Pharmacy"/>
<tag k="shop" v="alcohol"/>
<tag k="shop" v="anime"/>
<tag k="shop" v="appliance"/>
<tag k="shop" v="assistive"/>
<tag k="shop" v="baby_goods"/>
<tag k="shop" v="bag"/>
<tag k="shop" v="bakery"/>
<tag k="shop" v="beauty"/>
<tag k="shop" v="bed"/>
<tag k="shop" v="beverages"/>
<tag k="shop" v="bicycle"/>
<tag k="shop" v="bookmaker"/>
<tag k="shop" v="books"/>
<tag k="shop" v="butcher"/>
<tag k="shop" v="car"/>
<tag k="shop" v="car_parts"/>
<tag k="shop" v="car_repair"/>
<tag k="shop" v="carpet"/>
<tag k="shop" v="chemist"/>
<tag k="shop" v="chocolate"/>
<tag k="shop" v="clothes"/>
<tag k="shop" v="coffee"/>
<tag k="shop" v="collector"/>
<tag k="shop" v="computer"/>
<tag k="shop" v="confectionery"/>
<tag k="shop" v="convenience"/>
<tag k="shop" v="copyshop"/>
<tag k="shop" v="cosmetics"/>
<tag k="shop" v="craft"/>
<tag k="shop" v="dance"/>
<tag k="shop" v="deli"/>
<tag k="shop" v="department_store"/>
<tag k="shop" v="doityourself"/>
<tag k="shop" v="dry_cleaning"/>
<tag k="shop" v="electrical"/>
<tag k="shop" v="electronics"/>
<tag k="shop" v="erotic"/>
<tag k="shop" v="farm"/>
<tag k="shop" v="fashion_accessories"/>
<tag k="shop" v="fishing"/>
<tag k="shop" v="florist"/>
<tag k="shop" v="foods,mentaiko"/>
<tag k="shop" v="funeral_directors"/>
<tag k="shop" v="furniture"/>
<tag k="shop" v="games"/>
<tag k="shop" v="garden_centre"/>
<tag k="shop" v="general"/>
<tag k="shop" v="gift"/>
<tag k="shop" v="golf"/>
<tag k="shop" v="greengrocer"/>
<tag k="shop" v="grocery"/>
<tag k="shop" v="hairdresser"/>
<tag k="shop" v="hardware"/>
<tag k="shop" v="hobby"/>
<tag k="shop" v="houseware"/>
<tag k="shop" v="interior_decoration"/>
<tag k="shop" v="jewelry"/>
<tag k="shop" v="kiosk"/>
<tag k="shop" v="laundry"/>
<tag k="shop" v="locksmith"/>
<tag k="shop" v="lottery"/>
<tag k="shop" v="mall"/>
<tag k="shop" v="mall;department_store"/>
<tag k="shop" v="massage"/>
<tag k="shop" v="mobile_phone"/>
<tag k="shop" v="money_lender"/>
<tag k="shop" v="motorcycle"/>
<tag k="shop" v="motorcycle_parts"/>
<tag k="shop" v="music"/>
<tag k="shop" v="musical_instrument"/>
<tag k="shop" v="newsagent"/>
<tag k="shop" v="optician"/>
<tag k="shop" v="outdoor"/>
<tag k="shop" v="pastry"/>
<tag k="shop" v="pawnbroker"/>
<tag k="shop" v="pet"/>
<tag k="shop" v="pet_grooming"/>
<tag k="shop" v="photo"/>
<tag k="shop" v="pottery"/>
<tag k="shop" v="religion"/>
<tag k="shop" v="reserving"/>
<tag k="shop" v="seafood"/>
<tag k="shop" v="second_hand"/>
<tag k="shop" v="sewing"/>
<tag k="shop" v="shoe_repair"/>
<tag k="shop" v="shoes"/>
<tag k="shop" v="sports"/>
<tag k="shop" v="stationery"/>
<tag k="shop" v="storage_rental"/>
<tag k="shop" v="supermarket"/>
<tag k="shop" v="tailor"/>
<tag k="shop" v="tea"/>
<tag k="shop" v="ticket"/>
<tag k="shop" v="tobacco"/>
<tag k="shop" v="toys"/>
<tag k="shop" v="trade"/>
<tag k="shop" v="travel_agency"/>
<tag k="shop" v="tyres"/>
<tag k="shop" v="variety_store"/>
<tag k="shop" v="video"/>
<tag k="shop" v="video_games"/>
<tag k="shop" v="watches"/>
<tag k="shop" v="water"/>
<tag k="shop" v="wine"/>
<tag k="shop" v="yes"/>

"shop" IS NOT NULL

=====

<tag k="office" v="advertising_agency"/>
<tag k="office" v="architect"/>
<tag k="office" v="association"/>
<tag k="office" v="company"/>
<tag k="office" v="coworking"/>
<tag k="office" v="diplomatic"/>
<tag k="office" v="educational_institution"/>
<tag k="office" v="estate_agent"/>
<tag k="office" v="forestry"/>
<tag k="office" v="government"/>
<tag k="office" v="insurance"/>
<tag k="office" v="it"/>
<tag k="office" v="lawyer"/>
<tag k="office" v="moving_company"/>
<tag k="office" v="newspaper"/>
<tag k="office" v="ngo"/>
<tag k="office" v="political_party"/>
<tag k="office" v="religion"/>
<tag k="office" v="research"/>
<tag k="office" v="telecommunication"/>
<tag k="office" v="travel_agent"/>
<tag k="office" v="yes"/>

"office" IS NOT NULL

=======

<tag k="shop" v="sports"/>
<tag k="sport" v="10pin"/>
<tag k="sport" v="archery"/>
<tag k="sport" v="baseball"/>
<tag k="sport" v="baseball;softball"/>
<tag k="sport" v="basketball"/>
<tag k="sport" v="bowls;ice_skating"/>
<tag k="sport" v="boxing"/>
<tag k="sport" v="canoe"/>
<tag k="sport" v="climbing"/>
<tag k="sport" v="cycling"/>
<tag k="sport" v="darts"/>
<tag k="sport" v="equestrian"/>
<tag k="sport" v="fitness"/>
<tag k="sport" v="gateball"/>
<tag k="sport" v="golf"/>
<tag k="sport" v="gymnastics"/>
<tag k="sport" v="ice_skating"/>
<tag k="sport" v="kick_boxing"/>
<tag k="sport" v="kickboxing"/>
<tag k="sport" v="motocross"/>
<tag k="sport" v="motor"/>
<tag k="sport" v="multi"/>
<tag k="sport" v="rugby_union"/>
<tag k="sport" v="running"/>
<tag k="sport" v="skateboard"/>
<tag k="sport" v="soccer"/>

"sport" IS NOT NULL

=====

<tag k="tourism" v="apartment"/>
<tag k="tourism" v="aquarium"/>
<tag k="tourism" v="artwork"/>
<tag k="tourism" v="attraction"/>
<tag k="tourism" v="camp_site"/>
<tag k="tourism" v="gallery"/>
<tag k="tourism" v="guest_house"/>
<tag k="tourism" v="guided_tour"/>
<tag k="tourism" v="hostel"/>
<tag k="tourism" v="hotel"/>
<tag k="tourism" v="information"/>
<tag k="tourism" v="motel"/>
<tag k="tourism" v="museum"/>
<tag k="tourism" v="theme_park"/>
<tag k="tourism" v="viewpoint"/>
<tag k="tourism" v="zoo"/>

"tourism" IS NOT NULL

 

 

 

"shop" IS NOT NULL

以下のようにすると、<tag k="shop"..... の対象全部が選ばれる

 

未分類

■博多駅は何もない。あそこは遊ぶ場所ではない。イメージとしては新横浜駅

■ショッピング等なら天神。

■食事なら中州

"amenity" = 'restaurant' OR "amenity" = 'fast_food' OR "amenity" = 'cafe' OR "amenity" = 'food_court'

■博多駅から中州・天神の移動は地下鉄。バスは使ったことがない。

■中州・天神の移動は、基本的には歩きではないか、と

■滞在時間は1~5時間まで色々。ただし昼間。夜の移動は、高校生だったから分からん。

■嫁さんの母は、中州・天神でデパートに週数回行っていた

■中州・天神・博多に車でいくかなぁ? あんなに便利なのに? (実際に駐車場から繁華街までの距離が遠い)。地下鉄と西鉄とJRで十分だと思う
駐車場の分布↓

======

■中州・天神・博多の移動のバスは、特定の路線を抑えとけばいいのかな。このエリアをタクシーを使って動く人がいるかどうかは分からん。

 

未分類

基本は、この本の内容の再度の実施。
JOSMで地図を改ざんして道路と鉄道を交えた最⼩コスト経路探索をやってみよう-完全版

自分の為にだけでも、本にして纒めておくものである、と実感しています。
このメモの内容が分からない人は、上記の本を入手して内容を補完して下さい。

目的は、この本の内容と同じ、「地図を改竄して道路と鉄道を交えた最小コスト経路」を作り出すことだけど、今回は、JOSMを使わないでやってみる。

まずは、各駅のnode(もしドンピシャのノードがなければ、もっとも近いノードを抽出する)

station.csv

西戸崎駅,33.650366,130.358161
海ノ中道駅,33.663892,130.361410
雁ノ巣駅,33.683859,130.403325
奈多駅,33.686735,130.412492
和白駅,33.689151,130.429679
香椎駅,33.659523,130.444108

などを作っておき、


// G:\home\ebata\hakata\src\others\main22

import (
	"database/sql"
	"encoding/csv"
	"fmt"
	"log"
	"os"
	"strconv"
	"strings"

	_ "github.com/lib/pq"
)

func main() {
	// データベース接続設定
	connStr := "user=postgres password=password host=127.0.0.1 port=15432 dbname=hakata_db sslmode=disable"
	db, err := sql.Open("postgres", connStr)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// CSVファイルを開く
	file, err := os.Open("stations.csv")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	// CSVリーダーの作成
	reader := csv.NewReader(file)
	records, err := reader.ReadAll()
	if err != nil {
		log.Fatal(err)
	}

	// 出力用CSVファイルの作成
	outFile, err := os.Create("stations_with_osm_id.csv")
	if err != nil {
		log.Fatal(err)
	}
	defer outFile.Close()

	writer := csv.NewWriter(outFile)
	defer writer.Flush()

	// 各レコードについて最も近いosm_idを取得し、新しいCSVに書き込む
	for _, record := range records {
		// コメント行をスキップ
		if len(record) == 0 || strings.HasPrefix(record[0], "#") {
			continue
		}

		// 緯度と経度をパース(空白をトリム)
		latStr := strings.TrimSpace(record[1])
		lonStr := strings.TrimSpace(record[2])

		lat, err := strconv.ParseFloat(latStr, 64)
		if err != nil {
			log.Fatalf("Error parsing latitude: %v", err)
		}

		lon, err := strconv.ParseFloat(lonStr, 64)
		if err != nil {
			log.Fatalf("Error parsing longitude: %v", err)
		}

		// 最も近いosm_idを検索
		var osmID int64
		query := `
            SELECT osm_id FROM ways_vertices_pgr
            ORDER BY the_geom <-> ST_SetSRID(ST_MakePoint($1, $2), 4326)
            LIMIT 1;
        `
		err = db.QueryRow(query, lon, lat).Scan(&osmID)
		if err != nil {
			log.Fatal(err)
		}

		// osm_idをCSVに追加
		newRecord := append(record, strconv.FormatInt(osmID, 10))
		if err := writer.Write(newRecord); err != nil {
			log.Fatal("Error writing record to CSV:", err)
		}
	}

	fmt.Println("CSVファイルに最も近いosm_idを追加しました。")
}

のプログラムで、

stations_with_osm_id.csv

西戸崎駅,33.6794,130.3947,58565
海ノ中道駅,33.6794,130.3816,38065
雁ノ巣駅,33.6747,130.3651,25953
奈多駅,33.6710,130.3533,46806
和白駅,33.6663,130.3514,25944
香椎駅,33.6616,130.4405,29380
香椎神宮駅,33.6615,130.4568,42178

のように、ノード番号を取得します。

で、つぎにhakata.osmに、以下を追加

<!-- Way: Dummy Railway Line -->
  <way id="123456789" version="1" timestamp="2024-08-22T06:13:26Z" changeset="99999999" uid="999999" user="kobore.net">
    <nd ref="1818760266" /> <!-- 古賀駅 -->
    <nd ref="1846875572" /> <!-- ししぶ駅 -->
    <nd ref="1971252636" /> <!-- 福工大前駅 -->
    <nd ref="440118260" />  <!-- 九産大前駅 -->
    <nd ref="1808374554" /> <!-- 香椎駅 -->
    <nd ref="1864205708" /> <!-- 千早駅 -->
    <nd ref="1252519465" /> <!-- 箱崎駅 -->
    <nd ref="1239476659" /> <!-- 吉塚駅 -->
    <nd ref="1882462094" /> <!-- 博多駅 -->
    <nd ref="1814285264" /> <!-- 竹下駅 -->
    <nd ref="6569627454" /> <!-- 笹原駅 -->
    <nd ref="1831604260" /> <!-- 南福岡駅 -->
    <nd ref="815318744" />  <!-- 春日駅 -->
    <nd ref="765561820" />  <!-- 大野城駅 -->
    <nd ref="767176221" />  <!-- 水城駅 -->
    <tag k="railway" v="dummyrail" />
    <tag k="name" v="Dummy Railway Line" />
  </way>
</osm>

で、

<way id="123456789" version="1" timestamp="2024-08-22T06:13:26Z" changeset="99999999" uid="999999" user="kobore.net">

の意味ですが、私はローカルで地図の変更をしているだけで、この情報をアップロードする予定がありません(地図を壊す気はない)。

ローカル環境で地図の変更を行い、OSMのデータをアップロードしない場合、`changeset` や `uid` は特に必要ありませんが、OSMファイルの形式として保持する必要がある場合、以下のように適当に値を設定して問題ないそうです。

ただし、way id="123456789" は、衝突しない値にすることに留意します.

これが設定できているかを、JOSMとQGISの両方で確認します。

ん。JOSMについては確認できました。

でもJOSMに表示できても、GIS-DBには落せないことは、以前に多々ありました。で、その時はQGISにも表示されない。逆に考えればQGISに表示されれば、GIS-DBには落せるかもしれない、とは言えます。

とりあえず、OSMをQGISにドラッグして、全部表示させます。

見にくので、lineだけの表示にします。

表示できました。

さらにを路線拡張。ここまでは予定通り(地図を見ながら、駅順番や位置情報を補正(これが結構なテマ)

GISを作っていると、その場所に対しての知見が増えて、都市開発している気持ちになってきます  ――

『もう、福岡に遷都でよくね?』という感じになります。

 

未分類

国会議員の報酬は、基本的には「歳費」と呼ばれます。日本の国会議員の場合、歳費は以下のように構成されています。

  1. 歳費月額: 衆議院・参議院ともに、月額約129万4,000円(2024年時点)。
  2. 期末手当(ボーナス): 年2回支給され、支給額は約635万円です。これにより、年間の合計は約1,555万円ほどになります。
  3. 文書通信交通滞在費: 月額100万円。この費用は通信や交通、滞在にかかる経費として支給され、領収書の提出義務はありません。
  4. その他の手当: 国会議員はこの他に、委員会出席手当や宿舎の提供などもあります。

これにより、国会議員の年収は約2,800万円から3,000万円程度になると言われています。

補足的に、政務活動費や政党交付金も別途支給されることがありますが、これは活動資金であり、報酬とは異なります

未分類

選挙で党からの公認を受けるといくら貰えるのですか? 公認による金銭的支援の実例を教えて下さい。分からなければ推定で結構です。

公認候補者に対する具体的な金額についての公的な資料は少なく、正確な情報は公開されていないことが多いですが、過去の報道や一般的な推定に基づいて以下のような金額が想定されます。

推定される公認候補者への金銭支援額
1. 国政選挙(衆議院・参議院)における支援
- 大手政党(自民党、立憲民主党など)の場合、国政選挙で公認候補者に対して提供される選挙資金は、数百万円から数千万円に及ぶとされています。特に選挙区ごとに競争が激化する都市部や、重要な選挙区では、政党からの支援額が増加する傾向にあります。

- 推定額: 1,000万~5,000万円程度(選挙区による)

2. 新人候補者への支援:
- 新人候補者の場合、選挙経験が少ないため、政党からの支援額が比較的多くなることが予想されます。新人は資金力が不足していることが多いため、政党がより積極的に資金面でサポートするケースが見られます。

- 推定額: 500万~1,500万円程度

3. 選挙活動に関する個別支出:
- 政党からの支援は、候補者の選挙活動費に充てられることが多く、特に以下のような具体的な費用に使われます。
- ポスター印刷費: 数十万円から100万円以上(選挙区の規模による)
- 街宣車のレンタル・運用費: 100万~200万円程度
- 選挙スタッフの人件費: 数十万円~数百万円(期間やスタッフ数による)

4. 政党助成金の分配:
- 政党助成金の総額は、政党の規模や議席数によって異なりますが、各政党が年間で数十億円を受け取っている場合があり、これが選挙資金の一部として候補者に分配されます。例えば、自民党は約170億円、立憲民主党は約30億円の助成金を受け取っており、その一部が選挙支援に充てられます。

実例
過去の報道では、自民党がある衆議院選挙において、候補者一人あたり数千万円を提供したケースがあるとされています。例えば、重要な選挙区では公認候補者に対して最大で5,000万円以上の支援が行われたとの報道もあります【推定】。また、地方選挙では規模が小さくなるため、支援額も少なくなる可能性があります。

このように、政党から公認候補者に対して提供される金銭的支援は選挙活動における重要な要素であり、政党の財政力や選挙区の重要度によって金額が大きく変動することが推測されます。

それでは「追加公認」とは、『当選後に選挙費用の補填を行うことを条件に入党させる』というバーター条件ということですね

「追加公認」とは、選挙期間中に政党から正式な公認を受けなかった候補者が、選挙後に政党から公認を受けて入党することを指します。このケースでは、選挙期間中は無所属や他の政党に所属していた候補者が、当選後にその政党に加わる形です。

「追加公認」が必ずしも「当選後に選挙費用の補填を行うことを条件に入党させる」というバーター条件と結びついているわけではありませんが、そのような状況が起こり得る可能性はあります。以下の点でバーター取引の一面が見られる場合もあると推測できます。

1. 選挙費用の補填:
- 一部のケースでは、無所属で当選した候補者に対して、政党側が「追加公認」を条件に選挙費用を補填することがあり得ます。この場合、候補者にとっては選挙費用の負担軽減が大きなメリットとなり、政党に加わるインセンティブとなる可能性があります。

2. 政党への議席確保のメリット:
- 当選後に政党が追加公認を行うことで、議席数を増やすことができ、政党にとっては政治的影響力を強化する手段となります。特に、衆議院や参議院において政党の議席数が増えることは、法案通過や委員会での発言権を強化するための重要な要素です。

3. 候補者への見返り:
- 政党が追加公認を行う際、選挙費用の補填以外にも、次回選挙での正式な公認や党の支援、政治活動の支援などが見返りとして提供されることがあります。このような取引は、候補者にとって当選後の政治活動を安定させるための有力な手段となり得ます。

4. 具体例:
- 過去の日本の選挙においても、無所属で当選した候補者が、当選後に与党や野党に追加公認されるケースが見られます。例えば、自民党や他の大政党が無所属で当選した候補者を追加公認し、議席数を増やすための戦略として利用することがあります。

結論:
「追加公認」が選挙費用の補填を条件とするバーター取引の要素を含む場合はあり得ますが、これはあくまで一部のケースに限られます。追加公認の背景には、政党側の議席確保や候補者側の政治活動支援など、様々な要因が複雑に絡んでいると考えられます。

未分類

Wordのフッターセクションのページ番号が同じになってしまいます。修正方法を教えてください

で、ようやく原稿を修正して、いざ投稿しようとしたら、

だ、そうです。

こういうことはよくあることだけど、何度やっても「せつない」

 

 

未分類

Wordでフッターセクションのページ番号がすべて同じになってしまう問題は、セクションごとのリンク設定やページ番号の設定が原因であることが多いです。以下の手順に従って修正してください。

### ページ番号がすべて同じになってしまう場合の修正方法

1. **フッターの編集モードに入る**:
- Wordのウィンドウ下部にあるフッター部分をダブルクリックして、フッター編集モードに入ります。

2. **セクションのリンク解除**:
- もしドキュメントが複数のセクションに分かれている場合、「前と同じヘッダー/フッター」が有効になっているとすべてのセクションで同じページ番号が表示されることがあります。
- フッター編集モードで、「ヘッダーとフッター」タブが表示されていることを確認してください。
- その中にある「前と同じヘッダー/フッター」を解除するには、**[前と同じ]** ボタンがオンになっていればそれをクリックしてオフにします。

3. **ページ番号の設定**:
- 「ヘッダーとフッター」タブで **[ページ番号]** をクリックし、**[ページ番号の書式]** を選択します。
- 「ページ番号の書式」ダイアログが表示されたら、「連続番号」を選択しているかを確認します。
- もし異なるセクションで番号を続けたい場合は、「前のセクションから継続する」を選択してください。

4. **ページ番号の更新**:
- もしページ番号が正しく表示されていない場合は、ページ番号を挿入し直してみてください。
1. フッター内で、現在のページ番号を選択して削除します。
2. 「ヘッダーとフッター」タブで、**[ページ番号]** → **[ページの下]** を選択し、希望する位置にページ番号を再挿入します。

### 注意点
- もし文書が複数のセクションに分かれており、異なるページ番号スタイルや開始番号を設定したい場合は、各セクションで個別に設定する必要があります。

上記の手順で問題が解決しない場合は、Wordのバージョンや具体的な設定状況を教えていただければ、さらに詳しくお手伝いできます。

未分類

2000の構造体のエージェントのコピーを作成するのに、「実体作ってコピーしろ」と言われて、ちょっとキレてChatGPTに八つ当たりしてしまいました。

C言語ならmemcpyで済む話ですが、本当にこんな面倒な処理をしなければならないのですか?
確かに、C言語では `memcpy` を使えば簡単にメモリのコピーができますが、Go言語ではメモリ管理が異なるため、直接 `memcpy` のような方法はありません。

しかし、Goではスライスのディープコピーを簡略化するライブラリやテクニックも存在します。もしGoで複雑なディープコピーが必要でなければ、標準ライブラリを使って簡単にコピーできる場面も多いです。ただし、構造体の中にポインタや参照型が含まれる場合、手動でコピーしないと参照先が共有されてしまう点に注意が必要です。

もしスライスのデータがシンプルで、参照型が含まれていない場合、`copy` 関数を使うことで、比較的簡単にシャローコピーを行えますが、それでも構造体のフィールドが参照型の場合はディープコピーを手動で行う必要があります。

GoではC言語の `memcpy` に相当する直接的な手段はありませんが、効率的なディープコピーが必要な場合、サードパーティのライブラリ(例: `copier`)や `reflect` パッケージを利用することで、コードの煩雑さを軽減することができます。

簡略化された方法を使用したい場合、Goの `reflect` やサードパーティライブラリの活用を検討すると、冗長なコードを少し短くできるかもしれません。

未分類

9月1日の前日の8月31日になると、「余裕のある」大人が、「自殺するかどうか迷っている」子どもたちに、メッセージを発します。

On August 31, the day before September 1, adults with generous hearts send out a message to children who "can't decide whether to kill themselves."

―― 逃げていいんだよ

"You can run away."

と。

この「逃げていいんだよ」メッセージは、仕事で追い込まれて、鬱病になってしまった社会人に対しても良く行われる、無責任で悪質なメッセージです。

The message "you can run away" is also often used for working people who have been pushed to the edge at work and have become depressed. This is an irresponsible and vicious message.

続きはこちら

―― 自殺という方法で「逃げていいんだよ」

取り敢えず、今の私からは、

自殺は一週間だけ延期して、実施日を(今年なら)9月9日(月)として下さい

と、だけ申し上げます。

何を言っているか分からないかもしれませんが、何も考えずに、これだけでいいので、私を信じてみてください。

今なお、この「一週間延期」を繰り返して、図々しくこの年齢まで生きてきた大人がいます ―― 私(江端)です。

未分類

ロジットモデルを使用して、複数の移動手段と移動距離に基づいて選択確率を計算するGo言語のアルゴリズムを作成します。このモデルでは、各候補パスの総コストを計算し、そのコストに基づいて各パスが選択される確率を算出します。
package main

import (
	"fmt"
	"math"
)

// TransportationMethod は移動手段を表します
type TransportationMethod struct {
	Name      string
	Distance  float64
	CostFunc  func(float64) float64
}

// Path は一つの移動ルートを表します(複数の移動手段を組み合わせることができます)
type Path struct {
	Methods []TransportationMethod
}

// TotalCost はPathに含まれる全ての移動手段の総コストを計算します
func (p *Path) TotalCost() float64 {
	totalCost := 0.0
	for _, method := range p.Methods {
		totalCost += method.CostFunc(method.Distance)
	}
	return totalCost
}

// LogitProbability はロジットモデルを使用して、各パスの選択確率を計算します
func LogitProbability(paths []Path) []float64 {
	// 全てのパスの総コストの指数を計算
	expSums := 0.0
	expCosts := make([]float64, len(paths))
	for i, path := range paths {
		expCost := math.Exp(-path.TotalCost())
		expCosts[i] = expCost
		expSums += expCost
	}

	// 各パスの選択確率を計算
	probabilities := make([]float64, len(paths))
	for i, expCost := range expCosts {
		probabilities[i] = expCost / expSums
	}
	return probabilities
}

func main() {
	// 移動手段のコスト関数の定義
	trainCost := func(distance float64) float64 {
		return 6.5*distance + 120
	}
	taxiCost := func(distance float64) float64 {
		if distance <= 1.2 {
			return 500
		}
		return 333*distance + 100
	}
	carCost := func(distance float64) float64 {
		return 18.43*distance + 500
	}
	bikeCost := func(distance float64) float64 {
		return 8.38 * distance
	}
	bicycleCost := func(distance float64) float64 {
		return 7 * distance
	}
	walkCost := func(distance float64) float64 {
		return 11 * distance
	}

	// 各パスの定義(複数の移動手段を組み合わせる)
	paths := []Path{
		{Methods: []TransportationMethod{
			{"Train", 10, trainCost},
			{"Walk", 1, walkCost},
		}},
		{Methods: []TransportationMethod{
			{"Taxi", 5, taxiCost},
		}},
		{Methods: []TransportationMethod{
			{"Car", 15, carCost},
			{"Bicycle", 2, bicycleCost},
		}},
		{Methods: []TransportationMethod{
			{"Bike", 20, bikeCost},
		}},
	}

	// ロジットモデルによる選択確率を計算
	probabilities := LogitProbability(paths)

	// 結果を表示
	for i, prob := range probabilities {
		fmt.Printf("Path %d: %.4f\n", i+1, prob)
	}
}

2. アルゴリズムの解説

  • TransportationMethod: 移動手段を表す構造体で、名前、距離、コスト計算関数を持っています。
  • Path: 一つの移動ルートを表す構造体で、複数の移動手段を組み合わせることができます。
  • TotalCost: Pathに含まれる全ての移動手段のコストを計算します。
  • LogitProbability: ロジットモデルを使用して、各パスの選択確率を計算します。各パスの総コストに基づき、指数関数を用いて確率を計算しています。

3. 実行結果

main 関数で定義された複数の移動パスに対して、それぞれの選択確率を算出し、結果を表示します。

このアルゴリズムを利用することで、様々な移動手段を組み合わせたパスの中から、最も選択されやすいパスをロジットモデルを用いて判断することができます。

あなた:
tomoi@DESKTOP-1QS7OI7 MSYS /g/home/ebata/tomioka3B/src/others $ go run main97.go Path 1: 0.0000 Path 2: 0.0000 Path 3: 0.0000 Path 4: 1.0000
となってしまいました。
パスの確率がもうすこしバラけるように、調整して下さい。

ChatGPT:

ChatGPT

パスの確率が極端になってしまう理由は、ロジットモデルの計算において、コストの違いが非常に大きくなってしまい、指数関数の結果がほぼゼロか一に収束してしまうことにあります。

これを改善するために、コストのスケーリングを行い、各パスのコストがもっと小さな範囲に収まるようにします。一般的には、コストを標準化するか、計算のスケールを調整することで、確率がバラけるようにします。

以下のコードでは、コストをスケールするための定数(scalingFactor)を導入し、その定数で割ることで、コストをスケーリングします。

修正版コード

package main

import (
	"fmt"
	"math"
)

// TransportationMethod は移動手段を表します
type TransportationMethod struct {
	Name      string
	Distance  float64
	CostFunc  func(float64) float64
}

// Path は一つの移動ルートを表します(複数の移動手段を組み合わせることができます)
type Path struct {
	Methods []TransportationMethod
}

// TotalCost はPathに含まれる全ての移動手段の総コストを計算します
func (p *Path) TotalCost() float64 {
	totalCost := 0.0
	for _, method := range p.Methods {
		totalCost += method.CostFunc(method.Distance)
	}
	return totalCost
}

// LogitProbability はロジットモデルを使用して、各パスの選択確率を計算します
func LogitProbability(paths []Path, scalingFactor float64) []float64 {
	// 全てのパスの総コストの指数を計算
	expSums := 0.0
	expCosts := make([]float64, len(paths))
	for i, path := range paths {
		expCost := math.Exp(-path.TotalCost() / scalingFactor)
		expCosts[i] = expCost
		expSums += expCost
	}

	// 各パスの選択確率を計算
	probabilities := make([]float64, len(paths))
	for i, expCost := range expCosts {
		probabilities[i] = expCost / expSums
	}
	return probabilities
}

func main() {
	// 移動手段のコスト関数の定義
	trainCost := func(distance float64) float64 {
		return 6.5*distance + 120
	}
	taxiCost := func(distance float64) float64 {
		if distance <= 1.2 {
			return 500
		}
		return 333*distance + 100
	}
	carCost := func(distance float64) float64 {
		return 18.43*distance + 500
	}
	bikeCost := func(distance float64) float64 {
		return 8.38 * distance
	}
	bicycleCost := func(distance float64) float64 {
		return 7 * distance
	}
	walkCost := func(distance float64) float64 {
		return 11 * distance
	}

	// 各パスの定義(複数の移動手段を組み合わせる)
	paths := []Path{
		{Methods: []TransportationMethod{
			{"Train", 10, trainCost},
			{"Walk", 1, walkCost},
		}},
		{Methods: []TransportationMethod{
			{"Taxi", 5, taxiCost},
		}},
		{Methods: []TransportationMethod{
			{"Car", 15, carCost},
			{"Bicycle", 2, bicycleCost},
		}},
		{Methods: []TransportationMethod{
			{"Bike", 20, bikeCost},
		}},
	}

	// スケーリングファクターの定義
	scalingFactor := 500.0

	// ロジットモデルによる選択確率を計算
	probabilities := LogitProbability(paths, scalingFactor)

	// 結果を表示
	for i, prob := range probabilities {
		fmt.Printf("Path %d: %.4f\n", i+1, prob)
	}
}

修正ポイント

  • スケーリングファクター (scalingFactor) を導入しました。この値を適切に調整することで、各パスのコストの差が緩和され、選択確率がバラけやすくなります。今回は 500.0 を使用しましたが、状況に応じてこの値を調整することが可能です。

実行方法

コードを再度実行していただくと、各パスの確率がバラけるようになるはずです。スケーリングファクターの値は、望ましい確率の分布に応じて調整してみてください。

実行結果

tomoi@DESKTOP-1QS7OI7 MSYS /g/home/ebata/tomioka3B/src/others
$ go run main97.go
Path 1: 0.4156
Path 2: 0.0180
Path 3: 0.1266
Path 4: 0.4399

よし、バラけた。

bicycleCost := func(distance float64) float64 {
return 7 * distance
}
walkCost := func(distance float64) float64 {
return 11 * distance
}
によれば、自転車より歩く方がお金がかかることになりますが、これは妥当でしょうか

ご指摘の通り、設定したコスト関数に基づくと、歩行の方が自転車よりもコストが高くなる結果となっていますが、これは一般的な状況に照らし合わせると妥当ではありません。

通常、自転車は初期購入費用やメンテナンス費用がかかるため、長距離を移動する場合は歩行よりもコストが高くなるのが一般的です。歩行は特に道具を必要としないため、実際には距離に応じたコストは低く抑えられます。

コスト関数の修正提案
自転車と歩行のコスト関数をより現実的にするためには、以下のように修正するのが適切です。

自転車のコスト: 自転車の購入費用やメンテナンス費用を考慮し、歩行よりも高めに設定します。
歩行のコスト: 道具がほとんど必要ないため、距離あたりのコストを低めに設定します。

bicycleCost := func(distance float64) float64 {
    return 5 * distance  // 自転車のコストを調整
}
walkCost := func(distance float64) float64 {
    return 1 * distance  // 歩行のコストを調整
}

自転車のコストは、例えば距離1kmあたり5円程度に設定し、メンテナンスやタイヤ交換などの費用を反映します。
歩行のコストは、距離1kmあたり1円程度に設定し、シューズの消耗やその他のわずかな費用を反映します。
これにより、自転車は歩行よりも一般的に高コストとなり、現実的なモデルになります。

trainCost := func(distance float64) float64 {
return 6.5*distance + 120
}
taxiCost := func(distance float64) float64 {
if distance <= 1.2 {
return 500
}
return 333*distance + 100
}
carCost := func(distance float64) float64 {
return 18.43*distance + 500
}
bikeCost := func(distance float64) float64 {
return 8.38 * distance
}
bicycleCost := func(distance float64) float64 {
return 7 * distance
}
walkCost := func(distance float64) float64 {
return 11 * distance
}
を全体として見直してみて下さい。

1. 鉄道のコスト

鉄道は初乗り料金があり、距離に応じて追加料金が発生します。一般的には比較的安価で、一定の距離を超えるとコストは緩やかに増加します。

trainCost := func(distance float64) float64 {
	return 6.0*distance + 150 // 少し低めの傾斜で調整、初乗り料金を150円に設定
}

2. タクシーのコスト

タクシーは初乗り料金が高く、距離に応じて大幅にコストが増加します。

taxiCost := func(distance float64) float64 {
	if distance <= 1.2 {
		return 500 // 初乗り500円(1.2kmまで)
	}
	return 300*distance + 200 // 距離が長くなるほど、加算額がやや低くなるよう調整
}

3. 自家用車のコスト

自家用車はガソリン代やメンテナンス費用、駐車場代などがかかり、距離に応じてコストが増加します。

carCost := func(distance float64) float64 {
	return 15.0*distance + 300 // 距離あたりのコストを抑えつつ、固定費用を調整
}

4. バイクのコスト

バイクは燃費が良く、比較的低コストで移動できるため、コスト関数は緩やかです。

bikeCost := func(distance float64) float64 {
	return 5.0 * distance // 燃費が良いため、距離あたりのコストを低めに設定
}

5. 自転車のコスト

自転車はメンテナンス費用が主なコストとなり、歩行よりも若干高めのコストになりますが、それでも安価です。

bicycleCost := func(distance float64) float64 {
	return 2.0 * distance // 非常に安価な移動手段として設定
}

6. 歩行のコスト

歩行は非常に低コストで、道具や消耗品の費用がわずかにかかる程度です。

walkCost := func(distance float64) float64 {
	return 1.0 * distance // 極めて低コストに設定
}

全体としての調整ポイント

  • 鉄道のコスト: 初乗り料金を考慮しつつ、距離あたりのコストをやや低めに設定しました。
  • タクシーのコスト: 初乗り後の距離に応じたコスト増加を少し緩やかにしました。
  • 自家用車のコスト: ガソリン代とメンテナンス費用を含めた現実的なコストに調整しました。
  • バイクのコスト: 燃費の良さを反映し、距離あたりのコストを低く設定しました。
  • 自転車のコスト: 非常に安価な移動手段として設定しましたが、メンテナンス費用は加味しました。
  • 歩行のコスト: ほぼコストがかからない設定にし、他の手段と比較しても極めて低コストに設定しました。

この設定により、各移動手段の特性に合ったコストが反映され、現実的な選択確率を求めることができます。

最終的に落ち着いたコード

 

/*
	// G:\home\ebata\tomioka3B\src\others\main97.go

これらの関係式から、入力値を(1)移動手段、(2)移動距離、(3)移動コストとするロジットモデルを使った算出アルゴリズムをGo言語で作成して下さい。具体的には、候補となる複数のパスを入力して、それぞれの選択確率を求めるものです。
ただし、1の移動には複数の移動手段を用いるものもあり、複数の移動手段であっても1の移動として取り扱えるようにして下さい。

ロジットモデルを使用して、複数の移動手段と移動距離に基づいて選択確率を計算するGo言語のアルゴリズムを作成します。このモデルでは、各候補パスの総コストを計算し、そのコストに基づいて各パスが選択される確率を算出します。

2. アルゴリズムの解説
TransportationMethod: 移動手段を表す構造体で、名前、距離、コスト計算関数を持っています。

Path: 一つの移動ルートを表す構造体で、複数の移動手段を組み合わせることができます。

TotalCost: Pathに含まれる全ての移動手段のコストを計算します。

LogitProbability: ロジットモデルを使用して、各パスの選択確率を計算します。各パスの総コストに基づき、指数関数を用いて確率を計算しています。

3. 実行結果
main 関数で定義された複数の移動パスに対して、それぞれの選択確率を算出し、結果を表示します。

このアルゴリズムを利用することで、様々な移動手段を組み合わせたパスの中から、最も選択されやすいパスをロジットモデルを用いて判断することができます。


あなた:
tomoi@DESKTOP-1QS7OI7 MSYS /g/home/ebata/tomioka3B/src/others
$ go run main97.go
Path 1: 0.0000
Path 2: 0.0000
Path 3: 0.0000
Path 4: 1.0000
となってしまいました。パスの確率がもうすこしバラけるように、
	paths := []Path{
		{Methods: []TransportationMethod{
			{"Train", 10, trainCost},
			{"Walk", 1, walkCost},
		}},
		{Methods: []TransportationMethod{
			{"Taxi", 5, taxiCost},
		}},
		{Methods: []TransportationMethod{
			{"Car", 15, carCost},
			{"Bicycle", 2, bicycleCost},
		}},
		{Methods: []TransportationMethod{
			{"Bike", 20, bikeCost},
		}},
	}

を改造して下さい。

修正ポイント
スケーリングファクター (scalingFactor) を導入しました。この値を適切に調整することで、各パスのコストの差が緩和され、選択確率がバラけやすくなります。今回は 500.0 を使用しましたが、状況に応じてこの値を調整することが可能です。
実行方法
コードを再度実行していただくと、各パスの確率がバラけるようになるはずです。スケーリングファクターの値は、望ましい確率の分布に応じて調整してみてください。

現時点での出力結果
tomoi@DESKTOP-1QS7OI7 MSYS /g/home/ebata/tomioka3B/src/others
$ go run main97.go
Path 1: 0.3535
Path 2: 0.0180
Path 3: 0.1871
Path 4: 0.4414

ロジットモデルは距離、経過時間、およびコストの3つで決定すると言われていると聞きますが、現在のプログラムには、距離とコストの値は入っているが、時間の値が入っていないようです。時間の値を入れたプログラムとして修正して下さい。

*/

package main

import (
	"fmt"
	"math"
	"time"

	"golang.org/x/exp/rand"
)

// TransportationMethod は移動手段を表します
type Logit_TransportationMethod struct {
	Name     string
	Distance float64
	CostFunc func(float64) float64
	Time     float64 // 時間(分)を直接入力
}

// Path は一つの移動ルートを表します(複数の移動手段を組み合わせることができます)
type Path struct {
	Methods []Logit_TransportationMethod
}

// TotalCost はPathに含まれる全ての移動手段の総コストを計算します
func (p *Path) Logit_TotalCost() float64 {
	totalCost := 0.0
	for _, method := range p.Methods {
		totalCost += method.CostFunc(method.Distance)
	}
	return totalCost
}

// TotalTime はPathに含まれる全ての移動手段の総時間を計算します
func (p *Path) Logit_TotalTime() float64 {
	totalTime := 0.0
	for _, method := range p.Methods {
		totalTime += method.Time
	}
	return totalTime
}

// Logit_Probability はロジットモデルを使用して、各パスの選択確率を計算します
func Logit_Probability(paths []Path, costScalingFactor, timeScalingFactor float64) []float64 {
	// 全てのパスの総コストと時間の指数を計算
	expSums := 0.0
	expValues := make([]float64, len(paths))
	for i, path := range paths {
		totalCost := path.Logit_TotalCost()
		totalTime := path.Logit_TotalTime()
		expValue := math.Exp(-(totalCost/costScalingFactor + totalTime/timeScalingFactor))
		expValues[i] = expValue
		expSums += expValue
	}

	// 各パスの選択確率を計算
	probabilities := make([]float64, len(paths))
	for i, expValue := range expValues {
		probabilities[i] = expValue / expSums
	}
	return probabilities
}

// Logit_DefineCostFunctions は各移動手段のコスト関数を定義して返します
func Logit_DefineCostFunctions() (func(float64) float64, func(float64) float64, func(float64) float64, func(float64) float64, func(float64) float64, func(float64) float64, func(float64) float64) {
	trainCost := func(distance float64) float64 {
		return 6.0*distance + 150 // 鉄道のコスト
	}
	taxiCost := func(distance float64) float64 {
		if distance <= 1.2 {
			return 500 // 初乗り500円
		}
		return 300*distance + 200 // タクシーのコスト
	}
	carCost := func(distance float64) float64 {
		return 15.0*distance + 300 // 自家用車のコスト
	}
	bikeCost := func(distance float64) float64 {
		return 5.0 * distance // バイクのコスト
	}
	bicycleCost := func(distance float64) float64 {
		return 2.0 * distance // 自転車のコスト
	}
	walkCost := func(distance float64) float64 {
		return 1.0 * distance // 歩行のコスト
	}
	busCost := func(distance float64) float64 {
		if distance <= 2.0 {
			return 210 // 初乗り210円(2kmまで)
		}
		return 60*distance + 90 // 2kmを超えた場合の運賃
	}

	return trainCost, taxiCost, carCost, bikeCost, bicycleCost, walkCost, busCost
}

// InputPaths は事前に定義されたパスを受け取ります
func Logit_InputPaths(paths []Path) []Path {
	return paths
}

// Logit_SelectRandomPath は確率分布に基づいてランダムにパスを選択します
func Logit_SelectRandomPath(probabilities []float64) int {
	// 累積確率を計算
	cumulativeProbabilities := make([]float64, len(probabilities))
	cumulativeSum := 0.0
	for i, prob := range probabilities {
		cumulativeSum += prob
		cumulativeProbabilities[i] = cumulativeSum
	}

	// ランダムな値を生成
	rand.Seed(uint64(time.Now().UnixNano()))
	randValue := rand.Float64()

	// 累積確率に基づいてパスを選択
	for i, cumulativeProb := range cumulativeProbabilities {
		if randValue < cumulativeProb {
			return i
		}
	}

	// 万が一選択されなかった場合、最後のパスを返す
	return len(probabilities) - 1
}

func main() {
	// 各移動手段のコスト関数を取得
	trainCost, taxiCost, carCost, bikeCost, bicycleCost, walkCost, busCost := Logit_DefineCostFunctions()

	// 個別の移動手段を定義してから methods に追加
	methods1 := []Logit_TransportationMethod{}
	methods1 = append(methods1, Logit_TransportationMethod{"Train", 10, trainCost, 30}) // 例: 鉄道10kmで30分
	methods1 = append(methods1, Logit_TransportationMethod{"Walk", 1, walkCost, 12})    // 例: 歩行1kmで12分

	methods2 := []Logit_TransportationMethod{}
	methods2 = append(methods2, Logit_TransportationMethod{"Taxi", 5, taxiCost, 15}) // 例: タクシー5kmで15分

	methods3 := []Logit_TransportationMethod{}
	methods3 = append(methods3, Logit_TransportationMethod{"Car", 15, carCost, 25})       // 例: 自家用車15kmで25分
	methods3 = append(methods3, Logit_TransportationMethod{"Bicycle", 2, bicycleCost, 8}) // 例: 自転車2kmで8分

	methods4 := []Logit_TransportationMethod{}
	methods4 = append(methods4, Logit_TransportationMethod{"Bike", 20, bikeCost, 45}) // 例: バイク20kmで45分

	methods5 := []Logit_TransportationMethod{}
	methods5 = append(methods5, Logit_TransportationMethod{"Bus", 8, busCost, 20})    // 例: バス8kmで20分
	methods5 = append(methods5, Logit_TransportationMethod{"Walk", 0.5, walkCost, 6}) // 例: バス停から目的地まで徒歩0.5kmで6分

	// Path を作成して paths に追加
	paths := []Path{}
	paths = append(paths, Path{Methods: methods1})
	paths = append(paths, Path{Methods: methods2})
	paths = append(paths, Path{Methods: methods3})
	paths = append(paths, Path{Methods: methods4})
	paths = append(paths, Path{Methods: methods5})

	// InputPaths関数に事前定義されたパスを渡す
	paths = Logit_InputPaths(paths)

	// スケーリングファクターの定義
	costScalingFactor := 500.0
	timeScalingFactor := 10.0

	// ロジットモデルによる選択確率を計算
	probabilities := Logit_Probability(paths, costScalingFactor, timeScalingFactor)

	// 結果を表示
	for i, prob := range probabilities {
		fmt.Printf("Path %d: %.4f\n", i+1, prob)
	}

	// 確率に基づいてランダムにパスを選択
	selectedPathIndex := Logit_SelectRandomPath(probabilities)
	fmt.Printf("Selected Path: %d\n", selectedPathIndex+1)

	// 繰り返しパスを定義して再計算するか確認
	for {
		fmt.Println("再度パスを計算しますか? (yes/no)")
		var continueInput string
		fmt.Scan(&continueInput)
		if continueInput != "yes" {
			break
		}

		// 新しいパスを入力する場合
		paths = Logit_InputPaths(paths)
		probabilities = Logit_Probability(paths, costScalingFactor, timeScalingFactor)

		// 再度結果を表示
		for i, prob := range probabilities {
			fmt.Printf("Path %d: %.4f\n", i+1, prob)
		}

		// 確率に基づいてランダムにパスを選択
		selectedPathIndex = Logit_SelectRandomPath(probabilities)
		fmt.Printf("Selected Path: %d\n", selectedPathIndex+1)
	}
}