AIの仕様

ページ名:AIの仕様

目次

はじめに[]

Freeciv AIは、他のゲームのAIと同等か、それよりも軍事的に優れていると広く認識されています。ただし経験豊富なプレイヤーにとってはまだ簡単すぎます。以前はコードベースの状態が悪かったのですが、かなり良くなりました。これは数か月で動作するAIをまとめた開発者(Syela)が突然姿を消したためです。彼のアイデアは優れていましたが、変数に名前を付けたりコードにコメントすることは苦手であったようです。その後のAI開発者は再び最初から始める勇気がなく(あるいは彼のアイデアを超えられないと思った?)、代わりにあちこちを少し訂正し、あまり壊れないように努力してSyelaの元の設計を理解してからそれを捨て、AIを完成させました。AIに関するすべてのコードがai/に存在するわけではなく、server/全体に点在しています。とくにserver/settlers.cはAIに関するコードだけを含みます。このファイルは自動の開拓者にも使用されているためサーバーから分離できません。server/gotohand.cは段階的に廃止されている以前の経路検索システムの残りです。

現在のAIの開発者と連絡をとる[]

AI開発のメーリングリストはありません。質問があれば開発者メーリングリストに送るか英語版コミュニティフォーラムに来て下さい。Freecivでは開発のアイデアを募集しています。あなたのアイデアをフォーラムで発表してください。

AI開発の長期目標[]

AI開発の長期目標は二つあります。

  • 人間プレイヤーに勝つAIを作ること
  • Freecivで可能な全てのルールセットに対応できるAIを作ること

必要度の計算[]

ビルドの計算はai_choiceと呼ばれる構造体で表されます。 これにはwantと呼ばれる変数があり、choice->typeによってポイントされたアイテムがAIにどれだけ必要かを決定します。 choice->wantの値は以下のようになります。

-199 get_a_boat < 0 エラー == 0 必要なし、何もしない <= 100 通常 > 100 緊急的に必要 > ??? おそらくエラー (1024が上限) > 200 しばしば上限として使われる値で、これを超えると減少する操作が入る

これらは理想的な数値であり、実際のコード内では大幅に異なる場合があります。 特にテクノロジーと外交官はこれらの基準に違反しているようです。

事実上、防衛ユニットだけがこの標準に従っているようです。 特に攻撃ユニットはこれにまったく従わず、頻繁に他のものへの欲求を覆い隠します。

償却[]

a m o r t i z e ( b e n e f i t , d e l a y ) = b e n e f i t × ( M O R T − 1 M O R T ) d e l a y {\displaystyle amortize\left(benefit,delay\right)=benefit\times \left({\frac {MORT-1}{MORT}}\right)^{delay}} {\displaystyle amortize\left(benefit,delay\right)=benefit\times \left({\frac {MORT-1}{MORT}}\right)^{delay}}

5年後から毎年10ドルを受け取るのか、今年から毎年5ドルを受け取るのか、どちらが良いのでしょうか。インフレをどのように考慮しますか? 関数 a m o r t i z e {\displaystyle amortize} は、これらの質問に答えるのに役立つことを目的としています。これは今日のお金の観点から将来の利益を再スケーリングします。

インフレ率が x {\displaystyle x} {\displaystyle x}%で一定とします。このとき五年後の10ドルは今日の 10 × ( 100 100 + x ) 5 {\displaystyle 10\times \left({\frac {100}{100+x}}\right)^{5}} ドルに相当します。 100 100 + x {\displaystyle {\frac {100}{100+x}}} {\displaystyle {\frac {100}{100+x}}}を q {\displaystyle q} とおくと Y {\displaystyle Y} {\displaystyle Y}年後の N {\displaystyle N} ドルは今日の N × q Y {\displaystyle N\times q^{Y}} {\displaystyle N\times q^{Y}}ドルに相当します。 Y {\displaystyle Y} 年後から毎年 N {\displaystyle N} {\displaystyle N}ドルを受け取るとするとその総額は今日の N × q Y 1 − q {\displaystyle {\frac {N\times q^{Y}}{1-q}}} ドルに相当します。(無限級数の和の公式を使いました。)これが償却の原理です。 q < 1 {\displaystyle q<1} {\displaystyle q<1}の積が Y {\displaystyle Y} 乗に変形されました。係数 1 1 − q {\displaystyle {\frac {1}{1-q}}} {\displaystyle {\frac {1}{1-q}}}は N {\displaystyle N} にも Y {\displaystyle Y} {\displaystyle Y}にも依存しません。

定数 M O R T {\displaystyle MORT} とインフレ率 x {\displaystyle x} {\displaystyle x}の関係式は M O R T − 1 M O R T = q = 100 100 + x {\displaystyle {\frac {MORT-1}{MORT}}=q={\frac {100}{100+x}}} .で与えられます。したがって既定の M O R T = 24 {\displaystyle MORT=24} {\displaystyle MORT=24}はインフレ率4.3%に相当します。

a m o r t i z e ( ) {\displaystyle amortize()} 関数の製作者の想定とは少し違う説明でしたが、基本的な考え方は同じです。価値は指数的に下落します。

軍事バージョンの償却に使われる m i l i t a r y A m o r t i z e ( ) {\displaystyle militaryAmortize()} {\displaystyle militaryAmortize()}はまだ説明されていません。

軍事作戦の得失評価[]

この見積もりは、 k i l l D e s i r e {\displaystyle killDesire} 関数といくつかの修正によって実装されます。

W a n t = O p e r a t i o n P r o f i t × A m o r t i z a t i o n F a c t o r {\displaystyle Want=OperationProfit\times AmortizationFactor} {\displaystyle Want=OperationProfit\times AmortizationFactor}

が大まかな計算式です。

  • A m o r t i z a t i o n F a c t o r {\displaystyle AmortizationFactor} これの説明は完全に私の能力を超えています(しかし、それは操作の推定時間の長さの関数です)。
  • O p e r a t i o n P r o f i t = B a t t l e P r o f i t − M a i n t e n a n c e {\displaystyle OperationProfit=BattleProfit-Maintenance} {\displaystyle OperationProfit=BattleProfit-Maintenance}
  • M a i n t e n a n c e = ( S u p p o r t + U n h a p p i n e s s C o m p e n s a t i o n ) × O p e r a t i o n T i m e {\displaystyle Maintenance=(Support+UnhappinessCompensation)\times OperationTime} Unhappinessは軍事ユニットが都市から離れていることで発生し、Supportはターンごとにこのユニットをサポートするために費やされたシールドの数です。
  • B a t t l e P r o f i t = S h i e l d s L o s t B y E n e m y × P r o b a b i l i t y T o W i n − S h i e l d s L o s t B y U s × P r o b a b i l i t y T o L o s e {\displaystyle BattleProfit=ShieldsLostByEnemy\times ProbabilityToWin-ShieldsLostByUs\times ProbabilityToLose} {\displaystyle BattleProfit=ShieldsLostByEnemy\times ProbabilityToWin-ShieldsLostByUs\times ProbabilityToLose} つまり、 B a t t l e P r o f i t {\displaystyle BattleProfit} は「この敵ユニットを攻撃することで、平均してどれだけ良くなるだろうか」という質問に答える確率的な平均です。

軍事ユニットの選択[]

構築する軍事ユニットとそのターゲットの選択を扱うコードは特に厄介です。

軍事ユニットはmilitary_advisor_choose_build関数で要求されます。最初に防御ユニットを検討し、次に攻撃者を選択します(都市が安全な場合)。2つの手段があります。新しい攻撃者を作成するか、すでに(防御を余儀なくされた)攻撃者がいます。 2番目のケースは簡単で、既存の攻撃者がどれだけ優れているかを計算し、優れている場合は防御側を構築します。

新しい攻撃者の作成は少し複雑です。まず、ai_choose_attacker_ *関数は、現在作成できる最善の攻撃者を見つけるために呼び出されます。このプロトタイプの攻撃者は、単純なattack_power*speed関数を使用して選択されます。次にkill_something_with関数内でプロトタイプの攻撃者のターゲットを検索します(find_something_to_killを使う)。ターゲットを見つけたら、process_attacker_want関数を呼び出して最後の修正を行い、ターゲットを取り除くのに最適な攻撃者のタイプを探します。このタイプが攻撃者の最終的な選択になります。process_attacker_want関数には、科学技術の選択に対して副作用があることに注意してください。

次に例を示します。

最初にai_choose_attacker_land関数は、強力で高速な竜騎兵を選択します。次に、find_something_to_kill関数は、町のすぐ隣に立っている敵のライフルマンを竜騎兵の犠牲者として発見します。次に、process_attacker_want関数は、敵が私たちのすぐそばにいるので砲兵を使用して簡単に倒せることを発見します。また、榴弾砲がこの仕事をさらに上手く行うと考えるので、ロボット工学に対する欲求を高めます。

アイデアは以上です。実際はより複雑でおそらく効率も低くなります。

海上輸送[]

Freecivのフェリー(陸上ユニットを輸送する海上ユニット)システムは、おそらく論理よりも統計力学によって適切に記述されます。フェリーと想定乗客(PP)はどちらもランダムに見えるように動き回り、お互いに近づこうとします。平均して、彼らは成功します。この動作には十分な理由があり、デバッグが大変でも小さなバグが全体像に目に見える影響を与えないことを意味します(結果として修正されないままになります)。

毎ターン、フェリーとPPの両方が事前の状況をすべて忘れます(乗客が実際にボートに乗っている場合を除く)。次に、それぞれが最も近いパートナーを探してそれに向かって進みます。これは基本的にランダムな順序ですべてのユニットに対してで実行されます。

ほとんどのユニットは毎ターン目的地を再計算するため、事前の取り決めを無視することが唯一の優れた戦略です。つまりフェリーはPPに依存せず、不要になったときに通知します。これはあまり効果的ではありませんが、PPがより責任を持って動作する場合にのみ変更できます。より責任のある動作については、外交官のコードを参照してください。新しいターゲットを見つける前に、古いターゲットがまだ良好かどうかを確認しようとします。

フェリーに乗客がいる場合はフェリーは計算を行いません。フェリーの行き先を決めるのは乗客です。

システムで使用される主なデータフィールドは次のとおりです。

乗客ユニットのai.ferryの値は次のとおりです。

FERRY_NONE : ユニットはフェリーを求めていません FERRY_WANTED : ユニットはフェリーを求めています >0 : ユニットを積載しているフェリーの番号

フェリーユニットのai.passengerの値は、次のいずれかになります。

FERRY_AVAILABLE : 使用可能なフェリーである >0 : フェリーが積載している乗客ユニットの番号

ボート生産のコードが安定すると、PPごとに平均して何隻のフリーボートがあるかがわかります。 PPよりも多くのボートがある場合、PPだけがボートを探す必要があることは理にかなっています。 ボートが少ない場合はPPを選択する必要があります。 これは、動的(両方の可能性がコード化され、毎ターン適切なものが選択される)と静的(多くの試行の後、1つのみが残る)の両方で実行できます。 開発の進捗程度は異なりますが、現在は並行して存在しています。

外交[]

AIの外交行動は、現在、「外交」サーバー設定によって管理されています。デフォルトのルールでは、AIはNO_CONTACT(未接触)で開始し、最初の接触でNEUTRALに進みます。AIは、NEUTRALとPEACE(和平)状態では相手をあまり信頼していませんが、ALLIANCE(同盟)に到達すると、これは完全に変更され、必要な技術と地図を喜んで引き渡します。 宇宙船の建造が唯一AIを攻撃に駆り立てます。

AIコードのこの部分をハックしたい人向け

pplayers_at_war(p1,p2) returns FALSE if p1==p2 pplayers_non_attack(p1,p2) returns FALSE if p1==p2 pplayers_allied(p1,p2) returns TRUE if p1==p2 pplayer_has_embassy(p1,p2) returns TRUE if p1==p2

つまりプレイヤーが自分と戦争をしているとは考えていません。プレイヤーが攻撃以外の条約を結んでいるとは決して考えないでください。彼自身、そして私たちは常にプレーヤーが自分自身と同盟を結んでいると考えています。

外交の導入には多くの問題があります。 1つは人間は非常に賢く、外交を活用(悪用)する方法を知っているため、通常はAIプレーヤーではなく人間のプレーヤーのみを勝利しますが、AIにとっての外交はほとんどの場合、実行できることに対する制約が追加されるだけです。 もう1つは、modpackに役立つがmodpackの邪魔にならない外交を書くのは非常に難しい場合があるということです。 つまり外交はオプションであるか、ルールセットで設定された誰が誰にどのような外交取引を行うことができるかをきめ細かく制御する必要があります。 後者はまだうまく実装されていません。

難易度[]

現在、難易度には「初心者」「簡単」「普通」「難しい」「チート」「実験的」があります。 「難しい」レベルはホールド禁止ではありませんが、「普通」には多くのハンディキャップがあります。「簡単」では、AIはai_fuzzy関数を介してランダムな愚かなことも行います。 「実験的」レベルはコーディング専用です。H_EXPERIMENTALハンディキャップを使用して新しいコードをゲートし、「実験的」レベルのAIを「難しい」レベルのAIに対してテストできます。 「初心者」では、AIは通常のプレイヤーよりもゆっくりと研究します。[1]も参照。



特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。

シェアボタン: このページをSNSに投稿するのに便利です。


最近更新されたページ

左メニュー

左メニューサンプル左メニューはヘッダーメニューの【編集】&gt;【左メニューを編集する】をクリックすると編集できます。ご自由に編集してください。掲示板雑談・質問・相談掲示板更新履歴最近のコメントカウン...

高山部隊

高山部隊U.alpine troops.png生産コスト50維持コストシールド食料不幸101必要条件戦術旧式化するなし次世代なし体力移動力攻撃力2015火力視界防御力125輸送燃料00地形効果を無視し...

騎馬兵

騎馬兵U.horsemen.png生産コスト20維持コストシールド食料不幸101必要条件騎乗旧式化するなし次世代騎士体力移動力攻撃力1022火力視界防御力121輸送燃料00ユニットのマニュアルページヘ...

騎士

騎士U.knights.png生産コスト40維持コストシールド食料不幸101必要条件騎兵隊旧式化するチャリオット, 騎馬兵次世代竜騎兵体力移動力攻撃力1024火力視界防御力122輸送燃料00特定の防御...

騎兵隊

騎兵隊U.cavalry.png生産コスト60維持コストシールド食料不幸101必要条件戦術旧式化する竜騎兵次世代機甲部隊体力移動力攻撃力2028火力視界防御力123輸送燃料00都市で解散することで生産...

駆逐艦

駆逐艦U.destroyer.png生産コスト60維持コストシールド食料不幸101必要条件電気学旧式化する装甲艦次世代なし体力移動力攻撃力3064火力視界防御力184輸送燃料00都市で解散することでユ...

関連リンク

非公式wikiに関連リンクの記事がありますFreeciv非公式wiki 攻略情報満載。初心者でも熟練者でもどうぞ!公式Twitteren:Related_links 英語版の関連リンクFreeciv基...

開拓者

開拓者U.settlers.png生産コスト40維持コストシールド食料不幸110必要条件なし旧式化するなし次世代なし体力移動力攻撃力2010火力視界防御力121輸送燃料00開拓者はゲームの鍵となるユニ...

長槍兵

長槍兵U.pikemen.png生産コスト20維持コストシールド食料不幸101必要条件封建主義旧式化するファランクス, 戦士次世代マスケット兵体力移動力攻撃力1011火力視界防御力122輸送燃料00ユ...

都市

概要 | 操作 | 地形 | 都市 | ユニット | 戦闘 | 経済 | 外交 | 政治体制 | 科学技術 | 世界の不思議 | 都市建造物 | マニュアルのトップページこのマニュアルはまだver3....

輸送船

輸送船U.transport.png生産コスト50維持コストシールド食料不幸101必要条件産業化旧式化するガレオン船次世代なし体力移動力攻撃力3050火力視界防御力183輸送燃料80陸上ユニットを8体...

貨物運送車

貨物運送車U.freight.png生産コスト50維持コストシールド食料不幸000必要条件株式会社旧式化するキャラバン次世代なし体力移動力攻撃力1020火力視界防御力121輸送燃料00ユニットのマニュ...

装甲艦

装甲艦U.ironclad.png生産コスト60維持コストシールド食料不幸101必要条件蒸気機関旧式化するフリゲート艦次世代駆逐艦体力移動力攻撃力3044火力視界防御力124輸送燃料00都市で解散する...

翻訳

翻訳 |地域化 |国際化 |navbarの編集Freecivを20以上の言語でプレイできることはご存知でしょうか?Freecivの開発チームでは、キーワードと文章を翻訳して他の言語でもプレイできるよう...

編集モード

ver2.2から「編集モード」が追加され、マップ作成がやや容易に行えるようになった。非公式wikiに編集モードの記事がありますできること[]ユニットや都市を新たに配置する、あるいは削除する。地形や特産...

総督府

Original: CVS-1.2 Translator: SAWADA Katsuya 非公式wikiに総督府の記事があります目次1 総督府(Citizen Management Agent, 市民...

経済

概要 | 操作 | 地形 | 都市 | ユニット | 戦闘 | 経済 | 外交 | 政治体制 | 科学技術 | 世界の不思議 | 都市建造物 | マニュアルのトップページこのマニュアルはまだver3....

竜騎兵

竜騎兵U.dragoons.png生産コスト50維持コストシールド食料不幸101必要条件指揮旧式化する騎士次世代騎兵隊体力移動力攻撃力2025火力視界防御力122輸送燃料00都市で解散することで生産コ...