PDA

Просмотр полной версии : Выбор технологии компом, исследование кода



Lexad
10.09.2008, 14:12
Господа. не лежит ли у кого CvPlayerAI.cpp под рукой? Хоцца посмотреть правило выбора ИИ следующей науки для исследования

kaizer
10.09.2008, 16:37
http://modiki.civfanatics.ru/index.php/CvPlayerAI **

Dynamic
10.09.2008, 16:40
А нельзя было файл приложить?

Lexad
10.09.2008, 17:00
Спасибо. Аднака, долго посидеть придется :)

Lexad
10.09.2008, 18:47
Итак, выбор техи - вещь стохастическая. Каждой техе ИИ приписывает число по следующему алгоритму:
iValue = 1
+ сл.число от 1 до 2000
+ kTeam.getResearchProgress((TechTypes)iI) (не нашел, что это)
+ 100, если добавляет зрение по воде (Оптика) и есть прибрежные города; причем, если bCapitalAlone (см в конце), еще +400
+ 100, если центрирует карту (Календарь)
+ 100, если открывет карту (Спутники); еще +400, если bCapitalAlone
+100, если позволяет торговать картами (Бумага); еще +400, если bCapitalAlone
+ 500*[1 + количество встреченных цив (iHasMetCount)], если позволяет торговать техами и не включена опция запрета на техторговлю (запрет на перепродажу не влияет - если это БтСовский файл, конечно)
+ 200, если позволяет торговлю деньгами (Валюта); еще +400, если уже кого-то встретил
+ 400, если позволяет защитный пакт (ВоенТрад)
+ 200, если позволяет Вечный Союз (Коммунизм, Фашизм)
+ 200, если позволяет вассалитет (Феодализм)
+ 200, если позволяет строить мосты (Конструкции)
+ 400, если позволяет орошение (Госслужба и Биология)
+ 500, если позволяет орошение без пресной воды (только Био)
+ 600*количество прибрежных городов. если позволяет работать на воде (Рыбалка)
+ 2 * iFeatureProductionModifier для техи (50 для Матики, это про рубку леса)
+ 4 * iWorkerSpeedModifier (50 для Парового Двигателя)
+ [максимум(2 + число своих городов; число подключенных иностранных городов) + 1] * переменную, зависящую от финансовых затруднений ИИ - это для тех, дающих +1 торговый путь (Валюта, Корпорация; замодите +3, будет в три раза больше)
+ 200 * iHealth, если до свое население/лимит доминации по населению менее 0,9; +350 * iHealth иначе; iHealth = 3 для Генетики и 0 иначе
- 100 * TechMovementChange из файла CIV4RouteInfos (-10 для Инженерии для дороги), т.е. +1000 для Инженерии
+ 200 для Охлаждения (за +1 по морю)
+ 100 для Драмы за возможность включать ползунок культуры; еще + 1000, если ИИ идет на культурную победу
+ 50 + 100*количество городов потенциальных торговых партнеров, доступных после открытия (для Паруса и Астро) + bCapitalAlone * 950/350 (если есть прибрежные города); для торговли по неводному террайну (моддинг) - просто +1000
+ 1000 для торговли по рекам (Парус в БтС)

... завтра допишу

Уточнить - расчет bool bCapitalAlone = (GC.getGameINLINE().getElapsedGameTurns() > 0) ? AI_isCapitalAreaAlone() : false; т.е. он не добавляется а) на начальном ходе или б) если у ИИ нет соседей на его континенте? Выглядит логично, т.к. применяется к разведтехам - Оптике, Спутникам, пр.

m_kus
11.09.2008, 08:37
Таким образом компьютер не учитывает завимсимость наук, то есть не учит науку для того чтобы стала доступной какая-то другая?
Таким образом компьютер играет "честно", не видя полного дерева наук - он не знает какие науки откроются дальше. А человек, заглядывающий в дерево наук, в цивилопедию или просто знающий последовательность наук - просто читер :)
Наверное стоило бы и ИИ учитывать полное дерево наук, раз уж человека наверняка используют эту информацию...
Или kTeam.getResearchProgress как раз эту информацию даёт компу?

Lexad
11.09.2008, 08:53
<div class='quotetop'>Цитата</div>
Таким образом компьютер не учитывает завимсимость наук, то есть не учит науку для того чтобы стала доступной какая-то другая?[/b]Я пока еще не дописал (и не дочитал), но, судя по игровому опыту, так оно и есть: верный способ затормозить ИИ на пути к Либеру - не менять ему Бумагу, хотя казалось бы...
<div class='quotetop'>Цитата</div>
Или kTeam.getResearchProgress как раз эту информацию даёт компу?[/b]Думаю, это всего лишь отражает уже выученную часть - партнерами по команде и/или самим компом, если он переключился на изучение другой техи из-за войны или по просьбе.

NeverMind
11.09.2008, 10:36
О, интересная тема :yes:

И давно надо было разместить sdk-файл онлайн. Сейчас займусь.

m_kus
11.09.2008, 12:39
<div class='quotetop'>Цитата(NeverMind * 11.9.2008, 12:36) 260108</div>

О, интересная тема :yes:

И давно надо было разместить sdk-файл онлайн. Сейчас займусь.
[/b]
Для версии 3.17? Или для всех последних версий простой, Warlords и BTS? :secret:

Lexad
11.09.2008, 14:10
У кайзера, похоже, не весь код влез - я сегодня на работу взял свой файл. Если опять будет мало дел - добью.

Спасибо, что вынес в отдельную тему.

Lexad
11.09.2008, 19:19
Продолжаю.

Что радует, алгоритм выбора техи сложный, учитывает доступность улучшений и количество рабочих, увеличение отдачи улучшений

Если теха меняет выход с улучшений (Печатный Станок с беревень и городков, Био еды с ферм, и т.д.), то берется количество этих улучшений у ИИ, умножается на 0,5, на величину изменения по соотв. выходу и на ценность данного выхода для ИИ (AI_yieldWeight = 1 + 0,3*AIWeightPercent*коэффициент текущей эры).
- коэффициент текущей эры = макс(эра - 1; 0)/макс(число эр - 2; 1)
- AIWeightPercent = 1/1,1/0,8 для еды/молотков/коммерции и отражает их относительную ценность для железного болвана. Поэтому ИИ часто предпочитает фермы коттеджам; впрочем, у каждого лидера есть любимые улучшения, например у Ганди - коттеджи, что влияет на выбор улучшений, как и потребности ближайшего города.
Это добавляется к iValue технологии.

Продолжение следует

Линник
11.09.2008, 20:57
Чистый прагматизм.

:secret: Требуется доброволец для написания жалобы на Лексада в Имперскую прокуратуру... за планомерное и продолжительное истребление духа романтизма из автоматическаго интеллекта.

Lexad
11.09.2008, 21:16
Не боИсь - тут все слишком случайно все равно; работы на рупь, толку на копейку.

Lexad
12.09.2008, 11:35
Скажите, а что значит "? 100 : 0"? Как в iImprovementValue += ((kImprovement.isActsAsCity()) ? 100 : 0);

Судя по коду, это *100

Monster
12.09.2008, 12:01
<div class='quotetop'>Цитата(Lexad * 12.9.2008, 13:35) 260270</div>

Скажите, а что значит "? 100 : 0"? Как в iImprovementValue += ((kImprovement.isActsAsCity()) ? 100 : 0);

Судя по коду, это *100
[/b]
Это значит:
[code]if kImprovement.isActsAsCity() == true

Lexad
12.09.2008, 12:32
Понятно, спасибо. В принципе, умножение даст тот же результат, т.к. для true в хмлях стоит значение 1, для false - 0.

Lexad
12.09.2008, 17:57
Если теха позволяет строить новые улучшения:
сразу +300
если форт, еще +100
если требует холм (ветряк, шахта), еще +100
если требует пресной воды (ферма), еще +200
если требует речки (водяная мельница), еще +100
если переносит ирригацию (ферма), еще +300
+50 еще за каждый тип террайна, где улучшение можно строить (2 для фермы - трава и степь)
+50 за каждый тип фичи (terrain feature), где улучшение можно строить

+TempValue, расчитывающееся так:
__ + 200 + 100*прирост отдачи приречного тайла + 100*прирост отдачи холма + 150*прирост отдачи орошаемого тайла
__ для части эффекта "прирост еды на не морских тайлах" умножаем на 3/2
__ для части эффекта "рост выхода коммерции" умножаем на 2, если у ИИ проблема с деньгами
__ домножаем полученную величину для каждого типа продукта тайла (еда/молоток/коммерция) на вес AI_yieldWeight, описанный выше).

Если теха открывает новые ресурсы:
+ количество типов ресурсов * 450
+ 45 * AI_bonusVal, если еще и позволяет им торговать (контрпримеры - нефть, уран))
здесь AI_bonusVal зависит от общего количества доступных ресов данного типа (например, краски) и складывается из базовой ценности ресурса и ценности для корпорации.
Базовая ценность каждой следующей единицы ресурса после первой (т.е. для продажи) ниже в 5 раз, чем первой; ценность для корпорации всегда одинакова.


Базовая ценность первой единицы зависит от множества факторов:
- 0, если есть теха, делающая рес устаревшим
иначе
+100 * прирост счастья от реса
+100 * прирост здоровья от реса
для стратресурсов: берем юниты данной цивы (с учетом спецтребований УЮ), +50 за каждый тип юнита, для которого данный рес необходим, +40 за каждый тип юнита, для которого он по выбору (пример - железо для масяни). Для водных юнитов, если можем и строить, значение удваивается, умножается на мин(2*число прибрежных городов; число городов), делится на макс(1, число городов). Если юнит устарел, для него значение = 2 (т.е. почти ноль).

Ресурс и здания (то же самое для Проектов)
Если ресурс необходим для строительства зданий (? - в оригинале цивы таких не знаю) - +30 за каждый тип здания, если один из нужных - +20.
Если ресурс дает бонус к строительству зданий, прибавляется суммарный бонус (в %, т.е. для Пирамид от камня = 100), деленный на 10. Если ресурс дает электоэнергию - еще +60. Если ресурс дает увеличеные производственного бонуса от здания (железо для меткомбината, например) - плюс половину эффекта (в приведенном примере 50/2). Нас интересует не наличие зданий, а возможность их строить нашей цивой в данный момент.
Полученный результат (до сложения по разным зданиям) удваиваем.
Если речь про приморское неЧудо (маяк, пр), то дополнительно эффект на здание умножается на число прибрежных городов и делится на половину числа всех городов игрока.
Последняя поправка эффекта ресурса на здания - эра. Если здание текущей эры, то для него значение слагаемого домножается на 3/2, если более раннее - делится на разницу в номере эры текущей и сделавшей его доступным.
Полученное число делим на 10.

Ценность ресурса для корпорации:
Берем iCityCount = (число городов * 7/6) + 1
Для каждой корпорации считаем iCorpCount = число городов с ней + (число всех городов)/6 + 1; для каждого из потребляемых ей ресов добавляем к ценности ресурса:
__ + 50 * iCityCount / iCorpCount для прибавки в еде или молотках с единицы реса
__ + 30 * iCityCount / iCorpCount для прибавки в коммерциИ, колбах или золоте
__ + 20 * iCityCount / iCorpCount для прибавки в шпионаже
__ + 12 * iCityCount / iCorpCount для прибавки в культуре
Полученная сумма по всем ресурсам и корпорациям делится на 10.

Что-то я не туда закопался. Перерыв.