From: <ve...@us...> - 2012-10-15 18:30:01
|
Revision: 5301 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5301&view=rev Author: vezzra Date: 2012-10-15 18:29:55 +0000 (Mon, 15 Oct 2012) Log Message: ----------- Commented out part of a debug print statement in AI script that threw an exception Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2012-10-15 13:20:15 UTC (rev 5300) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2012-10-15 18:29:55 UTC (rev 5301) @@ -58,7 +58,7 @@ print "Possible building types to build:" for buildingTypeID in possibleBuildingTypeIDs: buildingType = fo.getBuildingType(buildingTypeID) - print " " + str(buildingType.name) + " cost:" + str(buildingType.productionCost) + " time:" + str(buildingType.productionTime) + print " " + str(buildingType.name) + # " cost:" + str(buildingType.productionCost) + " time:" + str(buildingType.productionTime) possibleBuildingTypes = [ fo.getBuildingType(buildingTypeID).name for buildingTypeID in possibleBuildingTypeIDs ] |
From: <ve...@us...> - 2012-10-15 18:43:02
|
Revision: 5302 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5302&view=rev Author: vezzra Date: 2012-10-15 18:42:56 +0000 (Mon, 15 Oct 2012) Log Message: ----------- Fixed typo in previous commit Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2012-10-15 18:29:55 UTC (rev 5301) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2012-10-15 18:42:56 UTC (rev 5302) @@ -58,7 +58,7 @@ print "Possible building types to build:" for buildingTypeID in possibleBuildingTypeIDs: buildingType = fo.getBuildingType(buildingTypeID) - print " " + str(buildingType.name) + # " cost:" + str(buildingType.productionCost) + " time:" + str(buildingType.productionTime) + print " " + str(buildingType.name) # + " cost:" + str(buildingType.productionCost) + " time:" + str(buildingType.productionTime) possibleBuildingTypes = [ fo.getBuildingType(buildingTypeID).name for buildingTypeID in possibleBuildingTypeIDs ] |
From: <ewi...@us...> - 2013-01-01 06:44:52
|
Revision: 5599 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5599&view=rev Author: ewillgohs Date: 2013-01-01 06:44:45 +0000 (Tue, 01 Jan 2013) Log Message: ----------- adjustment for concentration camp adjustment Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-01-01 04:17:12 UTC (rev 5598) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-01-01 06:44:45 UTC (rev 5599) @@ -413,7 +413,7 @@ print "%8s | %20s | type:%20s | tags:%20s | specials: %20s | owner:%d "%(bldg, thisObj.name, "_".join(thisObj.buildingTypeName.split("_")[-2:])[:20], tags, specials, thisObj.owner ) capitalBldgs = [universe.getObject(bldg).buildingTypeName for bldg in homeworld.buildingIDs] - + possibleBuildingTypeIDs = [bldTID for bldTID in empire.availableBuildingTypes if fo.getBuildingType(bldTID).canBeProduced(empire.empireID, homeworld.id)] if possibleBuildingTypeIDs: print "Possible building types to build:" @@ -681,17 +681,28 @@ queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] bldType = fo.getBuildingType(bldName) for pid in AIstate.popCtrIDs: - if pid not in queuedBldLocs and bldType.canBeProduced(empire.empireID, pid):#TODO: verify that canBeProduced() checks for prexistence of a barring building - planet=universe.getPlanet(pid) + planet=universe.getPlanet(pid) + if not planet: + continue + tPop = planet.currentMeterValue(fo.meterType.targetPopulation) + if (tPop >= 36): cPop = planet.currentMeterValue(fo.meterType.population) - tPop = planet.currentMeterValue(fo.meterType.targetPopulation) - if (tPop >= 32) and (cPop >=0.9*tPop): - if planet.focus in [ AIFocusType.FOCUS_INDUSTRY, AIFocusType.FOCUS_MINING ]: - fo.issueChangeFocusOrder(pid, AIFocusType.FOCUS_RESEARCH) - res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) - if res: queuedBldLocs.append(pid) - print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) + if (cPop >=0.9*tPop): + if pid not in queuedBldLocs and bldType.canBeProduced(empire.empireID, pid):#TODO: verify that canBeProduced() checks for prexistence of a barring building + if planet.focus in [ AIFocusType.FOCUS_INDUSTRY, AIFocusType.FOCUS_MINING ]: + fo.issueChangeFocusOrder(pid, AIFocusType.FOCUS_RESEARCH) + res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) + if res: + queuedBldLocs.append(pid) + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) + elif (cPop < 20 ): + for bldg in planet.buildingIDs: + if universe.getObject(bldg).buildingTypeName == bldName: + res=fo.issueScrapOrder( bldg) + print "Tried scrapping %s at planet %s, got result %d"%(bldName, planet.Name, res) + totalPPSpent = fo.getEmpire().productionQueue.totalSpent print " Total Production Points Spent: " + str(totalPPSpent) |
From: <dil...@us...> - 2013-01-11 03:24:01
|
Revision: 5630 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5630&view=rev Author: dilvish-fo Date: 2013-01-11 03:23:50 +0000 (Fri, 11 Jan 2013) Log Message: ----------- fixed AI construction of some AI buildings including Neutronium Forges & Extractors Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-01-11 01:46:12 UTC (rev 5629) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-01-11 03:23:50 UTC (rev 5630) @@ -177,14 +177,19 @@ desc = "military ship" model = "fighter" srb = "SR_WEAPON_%1d" + is1= "FU_BASIC_TANK" + is2 = "SH_DEFLECTOR" + ar1 = "AR_LEAD_PLATE" + ar2= "AR_ZORTRIUM_PLATE" + ar3= "AR_NEUTRONIUM_PLATE" nb, hull = designNameBases[1]+"-%1d", "SH_BASIC_MEDIUM" newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, ""], "", model) for iw in range(1, 9) ] - + + newMarkDesigns += [ ((nb%iw)+'N', desc, hull, [ srb%iw, ar3, ""], "", model) for iw in range(1, 8) ] + nb, hull = designNameBases[2]+"-1-%1d", "SH_ORGANIC" - is1= "FU_BASIC_TANK" newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1], "", model) for iw in range(2, 9) ] nb, hull = designNameBases[2]+"-2-%1d", "SH_STATIC_MULTICELLULAR" - is2 = "SH_DEFLECTOR" newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1, is2], "", model) for iw in range(7, 9) ] if foAI.foAIstate.aggression ==0: @@ -201,18 +206,15 @@ newMarkDesigns += [ (nb%iw, desc, hull, 4*[srb%iw] + [ is2, is2], "", model) for iw in range(6, maxEM+1) ] nb = designNameBases[3]+"3-%1d" - ar1 = "AR_LEAD_PLATE" #newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar1] + [ is1, is1], "", model) for iw in [5, 6, 7, 8, 10, 11, 12 ] ] nb = designNameBases[3]+"-4-%1d" #newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar1] + [ is1, is2], "", model) for iw in [7, 8, 10, 11, 12 ] ] nb = designNameBases[4]+"-5-%1d" - ar2= "AR_ZORTRIUM_PLATE" newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar2] + 2*[ is2], "", model) for iw in range(7, maxEM+1) ] nb = designNameBases[4]+"-6-%1d" - ar3= "AR_NEUTRONIUM_PLATE" if foAI.foAIstate.aggression ==0: newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw] +[ar3, ar3]+ 2*[ is2], "", model) for iw in range(8, maxEM+1) ] else: @@ -361,7 +363,7 @@ if needsAdding != []: print "--------------" - print "Current Colony Designs: %s"%newColonyDesigns + print "Current Colony Designs: %s"%colonyShipNames print "-----------" print "Colony design names apparently needing to be added: %s"%namesToAdd print "-------" @@ -507,13 +509,21 @@ print "Error: exception triggered and caught: ", traceback.format_exc() if ("BLD_IMPERIAL_PALACE" in possibleBuildingTypes) and ("BLD_IMPERIAL_PALACE" not in (capitalBldgs+queuedBldgNames)): - res=fo.issueEnqueueBuildingProductionOrder("BLD_INDUSTRY_CENTER", empire.capitalID) + res=fo.issueEnqueueBuildingProductionOrder("BLD_IMPERIAL_PALACE", empire.capitalID) print "Enqueueing BLD_IMPERIAL_PALACE, with result %d"%res if res: res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front print "Requeueing BLD_IMPERIAL_PALACE to front of build queue, with result %d"%res + if ("BLD_NEUTRONIUM_SYNTH" in possibleBuildingTypes) and ("BLD_NEUTRONIUM_SYNTH" not in (capitalBldgs+queuedBldgNames)): + res=fo.issueEnqueueBuildingProductionOrder("BLD_NEUTRONIUM_SYNTH", empire.capitalID) + print "Enqueueing BLD_NEUTRONIUM_SYNTH, with result %d"%res + if res: + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Requeueing BLD_NEUTRONIUM_SYNTH to front of build queue, with result %d"%res + + #TODO: add totalPP checks below, so don't overload queue queuedShipyardLocs = [element.locationID for element in productionQueue if (element.name=="BLD_SHIPYARD_BASE") ] @@ -576,7 +586,7 @@ alreadyGotOne=99 for pid in list(AIstate.popCtrIDs) + list(AIstate.outpostIDs): planet=universe.getPlanet(pid) - if planet and bldName in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]: + if planet and bldName in [bld.buildingTypeName for bld in map( universe.getObject, planet.buildingIDs)]: system = universe.getSystem(planet.systemID) if system and system.starType < alreadyGotOne: alreadyGotOne = system.starType @@ -613,7 +623,7 @@ distanceMap[sysID] = len(universe.leastJumpsPath(homeworld.systemID, sysID, empire.empireID)) except: pass - useSys = ([-1] + sorted( [ (dist, sysID) for sysID, dist in distanceMap.items() ] ))[:2][-1][-1] # kinda messy, but ensures a value + useSys = ([(-1, -1)] + sorted( [ (dist, sysID) for sysID, dist in distanceMap.items() ] ))[:2][-1][-1] # kinda messy, but ensures a value if useSys!= -1: try: useLoc = AIstate.colonizedSystems[useSys][0] @@ -633,19 +643,20 @@ alreadyGotOne=False for pid in list(AIstate.popCtrIDs) + list(AIstate.outpostIDs): planet=universe.getPlanet(pid) - if planet and bldName in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]: + if planet and bldName in [bld.buildingTypeName for bld in map( universe.getObject, planet.buildingIDs)]: alreadyGotOne = True queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] if (len( AIstate.empireStars.get(fo.starType.blackHole, [])) > 0) and len (queuedBldLocs)==0 and not alreadyGotOne: # if not homeworld: useSys= AIstate.empireStars.get(fo.starType.blackHole, [])[0] else: + distanceMap={} for sysID in AIstate.empireStars.get(fo.starType.blackHole, []): try: distanceMap[sysID] = len(universe.leastJumpsPath(homeworld.systemID, sysID, empire.empireID)) except: pass - useSys = ([-1] + sorted( [ (dist, sysID) for sysID, dist in distanceMap.items() ] ))[:2][-1][-1] # kinda messy, but ensures a value + useSys = ([(-1, -1)] + sorted( [ (dist, sysID) for sysID, dist in distanceMap.items() ] ))[:2][-1][-1] # kinda messy, but ensures a value if useSys!= -1: try: useLoc = AIstate.colonizedSystems[useSys][0] @@ -664,7 +675,7 @@ alreadyGotOne=False for pid in list(AIstate.popCtrIDs) + list(AIstate.outpostIDs): planet=universe.getPlanet(pid) - if planet and bldName in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]: + if planet and bldName in [bld.buildingTypeName for bld in map( universe.getObject, planet.buildingIDs)]: alreadyGotOne = True queuedLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] if len (queuedLocs)==0 and homeworld and not alreadyGotOne: # @@ -683,7 +694,7 @@ alreadyGotOne=False for pid in list(AIstate.popCtrIDs) + list(AIstate.outpostIDs): planet=universe.getPlanet(pid) - if planet and bldName in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]: + if planet and bldName in [bld.buildingTypeName for bld in map( universe.getObject, planet.buildingIDs)]: alreadyGotOne = True queuedLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] if len (queuedLocs)==0 and homeworld and not alreadyGotOne: # @@ -698,25 +709,27 @@ bldName = "BLD_NEUTRONIUM_EXTRACTOR" alreadyGotExtractor=False - for pid in list(AIstate.popCtrIDs) + list(AIstate.outpostIDs): - planet=universe.getPlanet(pid) - if ( planet and ( planet.systemID in AIstate.empireStars.get(fo.starType.neutron, []) ) and ( - (bldName in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]) or - ("BLD_NEUTRONIUM_SYNTH" in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]) - )): - alreadyGotExtractor = True if empire.buildingTypeAvailable(bldName) and ( [element.locationID for element in productionQueue if (element.name==bldName) ]==[]): - bldType = fo.getBuildingType(bldName) + #bldType = fo.getBuildingType(bldName) + for pid in list(AIstate.popCtrIDs) + list(AIstate.outpostIDs): + planet=universe.getPlanet(pid) + if ( planet and (( planet.systemID in AIstate.empireStars.get(fo.starType.neutron, []) and + (bldName in [bld.buildingTypeName for bld in map( universe.getObject, planet.buildingIDs)]) ) or + ("BLD_NEUTRONIUM_SYNTH" in [bld.buildingTypeName for bld in map( universe.getObject, planet.buildingIDs)]) + )): + alreadyGotExtractor = True if not alreadyGotExtractor: if not homeworld: useSys= AIstate.empireStars.get(fo.starType.neutron, [])[0] else: + distanceMap={} for sysID in AIstate.empireStars.get(fo.starType.neutron, []): try: distanceMap[sysID] = len(universe.leastJumpsPath(homeworld.systemID, sysID, empire.empireID)) except: pass - useSys = ([-1] + sorted( [ (dist, sysID) for sysID, dist in distanceMap.items() ] ))[:2][-1][-1] # kinda messy, but ensures a value + print ([-1] + sorted( [ (dist, sysID) for sysID, dist in distanceMap.items() ] )) + useSys = ([(-1, -1)] + sorted( [ (dist, sysID) for sysID, dist in distanceMap.items() ] ))[:2][-1][-1] # kinda messy, but ensures a value if useSys!= -1: try: useLoc = AIstate.colonizedSystems[useSys][0] @@ -730,27 +743,32 @@ pass bldName = "BLD_NEUTRONIUM_FORGE" - if empire.buildingTypeAvailable(bldName) and alreadyGotExtractor: - queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] - bldType = fo.getBuildingType(bldName) - if len(queuedBldLocs) < 2 : #don't build too many at once - if homeworld: - tryLocs= [capitolID] + list(AIstate.popCtrIDs) - else: - tryLocs= AIstate.popCtrIDs - for pid in tryLocs: - if pid not in queuedBldLocs: - planet=universe.getPlanet(pid) - if bldType.canBeProduced(empire.empireID, pid):#TODO: verify that canBeProduced() checks for prexistence of a barring building - if bldName not in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]: - if "BLD_SHIPYARD_BASE" in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]: - res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) - print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) - if res: - if productionQueue.size > 5: - res=fo.issueRequeueProductionOrder(productionQueue.size -1, 3) # move to front - print "Requeueing %s to front of build queue, with result %d"%(bldName, res) - break #only initiate max of one new build per turn + if empire.buildingTypeAvailable(bldName): + print "considering building a ", bldName + if not alreadyGotExtractor: + print "Apparently have no Neutronium_Extractors nor Sythesizers" + else: + queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] + bldType = fo.getBuildingType(bldName) + if len(queuedBldLocs) < 2 : #don't build too many at once + if homeworld: + tryLocs= [capitolID] + list(AIstate.popCtrIDs) + else: + tryLocs= AIstate.popCtrIDs + print "Possible locs for %s are: "%bldName, PlanetUtilsAI.planetNameIDs(tryLocs) + for pid in tryLocs: + if pid not in queuedBldLocs: + planet=universe.getPlanet(pid) + if bldType.canBeProduced(empire.empireID, pid):#TODO: verify that canBeProduced() checks for prexistence of a barring building + if bldName not in [bld.buildingTypeName for bld in map( universe.getObject, planet.buildingIDs)]: + if "BLD_SHIPYARD_BASE" in [bld.buildingTypeName for bld in map( universe.getObject, planet.buildingIDs)]: + res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) + print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) + if res: + if productionQueue.size > 5: + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 3) # move to front + print "Requeueing %s to front of build queue, with result %d"%(bldName, res) + break #only initiate max of one new build per turn bldName = "BLD_CONC_CAMP" if foAI.foAIstate.aggression>2 and empire.buildingTypeAvailable(bldName): |
From: <dil...@us...> - 2013-02-19 05:58:27
|
Revision: 5768 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5768&view=rev Author: dilvish-fo Date: 2013-02-19 05:58:20 +0000 (Tue, 19 Feb 2013) Log Message: ----------- fix to AI so that Eaxaw can build more of their nice ships right away. Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-02-17 09:10:05 UTC (rev 5767) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-02-19 05:58:20 UTC (rev 5768) @@ -299,7 +299,7 @@ ar2= "AR_ZORTRIUM_PLATE" ar3= "AR_NEUTRONIUM_PLATE" nb, hull = designNameBases[1]+"-%1d", "SH_BASIC_MEDIUM" - newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, ""], "", model) for iw in range(1, 6) ] + newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, ""], "", model) for iw in range(1, 8) ] #newMarkDesigns += [ ((nb%iw)+'N', desc, hull, [ srb%iw, ar3, ""], "", model) for iw in range(1, 8) ] |
From: <dil...@us...> - 2013-04-18 04:51:26
|
Revision: 5985 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5985&view=rev Author: dilvish-fo Date: 2013-04-18 04:51:18 +0000 (Thu, 18 Apr 2013) Log Message: ----------- adjustment to AI Troop Ship construction planning Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-04-17 00:13:21 UTC (rev 5984) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-04-18 04:51:18 UTC (rev 5985) @@ -978,11 +978,14 @@ if queuedOutpostShips: print "\nFound colony ships in build queue: %s"%queuedOutpostShips + allMilitaryFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(EnumsAI.AIFleetMissionType.FLEET_MISSION_MILITARY ) + nMilitaryTot = sum( [ foAI.foAIstate.fleetStatus.get(fid, {}).get('nships', 0) for fid in allMilitaryFleetIDs ] ) allTroopFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(EnumsAI.AIFleetMissionType.FLEET_MISSION_INVASION ) nTroopTot = sum( [ foAI.foAIstate.fleetStatus.get(fid, {}).get('nships', 0) for fid in allTroopFleetIDs ] ) availTroopFleetIDs = list( FleetUtilsAI.extractFleetIDsWithoutMissionTypes(allTroopFleetIDs)) nAvailTroopTot = sum( [ foAI.foAIstate.fleetStatus.get(fid, {}).get('nships', 0) for fid in availTroopFleetIDs ] ) - print "Trooper Status: %d total, with %d unassigned. %d queued"%(nTroopTot, nAvailTroopTot, queuedTroopShips) + print "Trooper Status turn %d: %d total, with %d unassigned. %d queued, compared to %d total Military Attack Ships"%(currentTurn, nTroopTot, + nAvailTroopTot, queuedTroopShips, nMilitaryTot) if ( capitolID!=None and currentTurn>=40 and foAI.foAIstate.systemStatus.get(capitolSysID, {}).get('fleetThreat', 0)==0 and foAI.foAIstate.systemStatus.get(capitolSysID, {}).get('neighborThreat', 0)==0): bestShip, bestDesign, buildChoices = getBestShipInfo( EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_INVASION) @@ -990,7 +993,7 @@ loc = random.choice(buildChoices) prodTime = bestDesign.productionTime(empire.empireID, loc) prodCost=bestDesign.productionCost(empire.empireID, loc) - troopersNeededForcing = max(0, int( 0.99+ (currentTurn/20 - nAvailTroopTot)/max(2, prodTime-1)) ) + troopersNeededForcing = max(0, int( min(0.99+ (currentTurn/20 - nAvailTroopTot)/max(2, prodTime-1), nMilitaryTot/3 -nTroopTot))) numShips=troopersNeededForcing perTurnCost = (float(prodCost) / prodTime) if troopersNeededForcing>0 and totalPP > 3*perTurnCost*queuedTroopShips: |
From: <dil...@us...> - 2013-05-05 01:07:26
|
Revision: 5999 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5999&view=rev Author: dilvish-fo Date: 2013-05-05 01:07:18 +0000 (Sun, 05 May 2013) Log Message: ----------- another little AI bugfix Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-05-05 00:56:17 UTC (rev 5998) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-05-05 01:07:18 UTC (rev 5999) @@ -181,7 +181,7 @@ srb4 = "SR_WEAPON_4_%1d" clk = "ST_CLOAK_%1d" if1 = "FU_BASIC_TANK" - is1, is2, is3, is4, is5 = "SH_DEFENSE_GRID", "SH_DEFLECTOR", "SH_PLASMA", "SH_MULTISPEC", "SH_BLACKSHIELD" + is1, is2, is3, is4, is5 = "SH_DEFENSE_GRID", "SH_DEFLECTOR", "SH_PLASMA", "SH_MULTISPEC", "SH_BLACK" isList=["", is1, is2, is3, is4, is5] ar1, ar2, ar3, ar4, ar5 = "AR_STD_PLATE", "AR_ZORTRIUM_PLATE", "AR_DIAMOND_PLATE", "AR_XENTRONIUM_PLATE", "AR_NEUTRONIUM_PLATE" |
From: <dil...@us...> - 2013-05-05 23:12:35
|
Revision: 6005 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=6005&view=rev Author: dilvish-fo Date: 2013-05-05 23:12:29 +0000 (Sun, 05 May 2013) Log Message: ----------- adjustment to some AI ship designs Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-05-05 22:25:30 UTC (rev 6004) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-05-05 23:12:29 UTC (rev 6005) @@ -132,9 +132,9 @@ arL=[ar1, ar2, ar3] for ari in [1, 2]: #naming below only works because skipping Lead armor nb, hull = designNameBases[ari+1]+"%1d-%1d", "SH_STATIC_MULTICELLULAR" - newTroopDesigns += [ (nb%(ari, iw), desc, hull, [srb%iw, arL[ari]]+ 3*[tp], "", model) for iw in [2, 3, 4] ] + #newTroopDesigns += [ (nb%(ari, iw), desc, hull, [srb%iw, arL[ari]]+ 3*[tp], "", model) for iw in [2, 3, 4] ] nb, hull = designNameBases[ari+1]+"%1d-%1d", "SH_ENDOMORPHIC" - newTroopDesigns += [ (nb%(ari, iw+3), desc, hull, [srb%iw, arL[ari]]+ 3*[tp], "", model) for iw in [2, 3, 4] ] + #newTroopDesigns += [ (nb%(ari, iw+3), desc, hull, [srb%iw, arL[ari]]+ 3*[tp], "", model) for iw in [2, 3, 4] ] addDesigns(shipType, newTroopDesigns, shipProdPriority) def addScoutDesigns(): @@ -198,19 +198,19 @@ nb, hull = designNameBases[2]+"-1-%1d", "SH_ORGANIC" newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1], "", model) for iw in [3, 4] ] - newMarkDesigns += [ (nb%(iw+4), desc, hull, [ srb2%iw, srb2%iw, srb2%iw, is1], "", model) for iw in [2, 3, 4] ] + newMarkDesigns += [ (nb%(iw+4), desc, hull, [ ar1, srb2%iw, srb2%iw, if1], "", model) for iw in [2, 3, 4] ] nb, hull = designNameBases[2]+"-2-%1d", "SH_ORGANIC" - newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is2], "", model) for iw in [3, 4] ] - newMarkDesigns += [ (nb%(iw+4), desc, hull, [ srb2%iw, srb2%iw, srb2%iw, is2], "", model) for iw in [2, 3, 4] ] + newMarkDesigns += [ (nb%iw, desc, hull, [ ar1, srb%iw, srb%iw, is2], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(iw+4), desc, hull, [ ar1, srb2%iw, srb2%iw, is2], "", model) for iw in [2, 3, 4] ] nb, hull = designNameBases[2]+"-3-%1d", "SH_STATIC_MULTICELLULAR" - newMarkDesigns += [ (nb%(iw+4), desc, hull, [ srb2%iw, srb2%iw, srb2%iw, is2, if1], "", model) for iw in [2, 3, 4] ] + newMarkDesigns += [ (nb%(iw+4), desc, hull, [ ar1, srb2%iw, srb2%iw, is2, if1], "", model) for iw in [2, 3, 4] ] nb, hull = designNameBases[3]+"-1-%1x", "SH_ENDOMORPHIC" - newMarkDesigns += [ (nb%(iw+4), desc, hull, 4*[srb2%iw] + [ is2, if1], "", model) for iw in [ 4 ] ] - newMarkDesigns += [ (nb%(iw+8), desc, hull, 4*[srb3%iw] + [ is2, if1], "", model) for iw in [ 2 ] ] + newMarkDesigns += [ (nb%(iw+4), desc, hull, 3*[srb2%iw] + [ar1, is2, if1], "", model) for iw in [ 4 ] ] + newMarkDesigns += [ (nb%(iw+8), desc, hull, 3*[srb3%iw] + [ ar1, is2, if1], "", model) for iw in [ 2 ] ] nb = designNameBases[3]+"-1b-%1x" - newMarkDesigns += [ (nb%(iw+4), desc, hull, 4*[srb2%iw] + [ is4, if1], "", model) for iw in [ 4 ] ] - newMarkDesigns += [ (nb%(iw+8), desc, hull, 4*[srb3%iw] + [ is4, if1], "", model) for iw in [ 2 ] ] + newMarkDesigns += [ (nb%(iw+4), desc, hull, 3*[srb2%iw] + [ ar1, is4, if1], "", model) for iw in [ 4 ] ] + newMarkDesigns += [ (nb%(iw+8), desc, hull, 3*[srb3%iw] + [ ar1, is4, if1], "", model) for iw in [ 2 ] ] nb = designNameBases[3]+"-2-%1x" newMarkDesigns += [ (nb%(iw+4), desc, hull, 3*[srb2%iw]+[ar2] + [ is2, if1], "", model) for iw in [4] ] |
From: <dil...@us...> - 2013-05-05 23:14:50
|
Revision: 6006 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=6006&view=rev Author: dilvish-fo Date: 2013-05-05 23:14:43 +0000 (Sun, 05 May 2013) Log Message: ----------- adjustment to some AI ship designs Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-05-05 23:12:29 UTC (rev 6005) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-05-05 23:14:43 UTC (rev 6006) @@ -197,7 +197,7 @@ newMarkDesigns += [ (nb%(iw+4), desc, hull, [ srb2%iw, srb2%iw, ""], "", model) for iw in [2, 3, 4] ] nb, hull = designNameBases[2]+"-1-%1d", "SH_ORGANIC" - newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%iw, desc, hull, [ ar1, srb%iw, srb%iw, if1], "", model) for iw in [3, 4] ] newMarkDesigns += [ (nb%(iw+4), desc, hull, [ ar1, srb2%iw, srb2%iw, if1], "", model) for iw in [2, 3, 4] ] nb, hull = designNameBases[2]+"-2-%1d", "SH_ORGANIC" newMarkDesigns += [ (nb%iw, desc, hull, [ ar1, srb%iw, srb%iw, is2], "", model) for iw in [3, 4] ] |
From: <dil...@us...> - 2013-06-29 19:50:45
|
Revision: 6211 http://sourceforge.net/p/freeorion/code/6211 Author: dilvish-fo Date: 2013-06-29 19:50:42 +0000 (Sat, 29 Jun 2013) Log Message: ----------- slight change to AIs use of concentration camps, so that a Xeno species will be better able to use them to counterbalance the Xeno maluses Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-06-29 19:48:21 UTC (rev 6210) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-06-29 19:50:42 UTC (rev 6211) @@ -1052,12 +1052,12 @@ tInd=planet.currentMeterValue(fo.meterType.targetIndustry) cInd=planet.currentMeterValue(fo.meterType.industry) cPop = planet.currentMeterValue(fo.meterType.population) - if (cPop <= 36) or (cPop < 0.8*tPop) or ( (planet.speciesName not in ColonisationAI.empireColonizers) and cPop < 50 ): #check even if not aggressive, etc, just in case acquired planet with a ConcCamp on it + if (cPop <= 32) or (cPop < 0.8*tPop) or ( (planet.speciesName not in ColonisationAI.empireColonizers) and cPop < 50 ): #check even if not aggressive, etc, just in case acquired planet with a ConcCamp on it for bldg in planet.buildingIDs: if universe.getObject(bldg).buildingTypeName == bldName: res=fo.issueScrapOrder( bldg) print "Tried scrapping %s at planet %s, got result %d"%(bldName, planet.name, res) - elif foAI.foAIstate.aggression>fo.aggression.typical and empire.buildingTypeAvailable(bldName) and (tPop >= 42) : + elif foAI.foAIstate.aggression>fo.aggression.typical and empire.buildingTypeAvailable(bldName) and (tPop >= 36) : if (planet.focus== EnumsAI.AIFocusType.FOCUS_GROWTH) or ("COMPUTRONIUM_SPECIAL" in planet.specials): #continue pass # now that focus setting takes these into account, probably works ok to have conc camp |
From: <dil...@us...> - 2013-11-06 22:26:22
|
Revision: 6502 http://sourceforge.net/p/freeorion/code/6502 Author: dilvish-fo Date: 2013-11-06 22:26:11 +0000 (Wed, 06 Nov 2013) Log Message: ----------- some AI production adjustments, mostly re troopships Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-11-06 03:02:05 UTC (rev 6501) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-11-06 22:26:11 UTC (rev 6502) @@ -523,8 +523,12 @@ if (currentTurn==1) and (productionQueue.totalSpent < totalPP): bestDesignID, bestDesign, buildChoices = getBestShipInfo(EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_EXPLORATION) + if len(AIstate.opponentPlanetIDs) == 0: + init_scouts = 4 + else: + init_scouts = 0 if bestDesignID: - for scout_count in range(5): + for scout_count in range(init_scouts): retval = fo.issueEnqueueShipProductionOrder(bestDesignID, buildChoices[0]) fo.updateProductionQueue() @@ -1360,6 +1364,7 @@ #TODO: blocked items might not need dequeuing, but rather for supply lines to be un-blockaded dequeueList=[] fo.updateProductionQueue() + can_prioritize_troops = False for queue_index in range( len(productionQueue)): element=productionQueue[queue_index] blockStr = "%d x "%element.blocksize #["a single ", "in blocks of %d "%element.blocksize][element.blocksize>1] @@ -1372,15 +1377,19 @@ else: print "element %s is projected to never be completed as currently stands, but will remain on queue "%element.name elif element.buildType == EnumsAI.AIEmpireProductionTypes.BT_SHIP: - if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_COLONISATION: + this_role = foAI.foAIstate.getShipRole(element.designID) + if this_role == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_COLONISATION: thisSpec=universe.getPlanet(element.locationID).speciesName queuedColonyShips[thisSpec] = queuedColonyShips.get(thisSpec, 0) + element.remaining*element.blocksize - if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_OUTPOST: + elif this_role == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_OUTPOST: queuedOutpostShips+= element.remaining*element.blocksize - if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_OUTPOST: + elif this_role == EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_OUTPOST: queuedOutpostShips+= element.remaining*element.blocksize - if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_MILITARY_INVASION: + elif this_role == EnumsAI.AIShipRoleType.SHIP_ROLE_MILITARY_INVASION: queuedTroopShips+= element.remaining*element.blocksize + elif (this_role == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_EXPLORATION) and (queue_index <= 1): + if len(AIstate.opponentPlanetIDs) > 0: + can_prioritize_troops = True if queuedColonyShips: print "\nFound colony ships in build queue: %s"%queuedColonyShips if queuedOutpostShips: @@ -1397,14 +1406,14 @@ nAvailTroopTot = sum( [ foAI.foAIstate.fleetStatus.get(fid, {}).get('nships', 0) for fid in availTroopFleetIDs ] ) print "Trooper Status turn %d: %d total, with %d unassigned. %d queued, compared to %d total Military Attack Ships"%(currentTurn, nTroopTot, nAvailTroopTot, queuedTroopShips, nMilitaryTot) - if ( capitolID!=None and currentTurn>=40 and foAI.foAIstate.systemStatus.get(capitolSysID, {}).get('fleetThreat', 0)==0 and + if ( capitolID!=None and ((currentTurn>=40) or (can_prioritize_troops)) and foAI.foAIstate.systemStatus.get(capitolSysID, {}).get('fleetThreat', 0)==0 and foAI.foAIstate.systemStatus.get(capitolSysID, {}).get('neighborThreat', 0)==0): bestDesignID, bestDesign, buildChoices = getBestShipInfo( EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_INVASION) if buildChoices!=None and len(buildChoices)>0: loc = random.choice(buildChoices) prodTime = bestDesign.productionTime(empire.empireID, loc) prodCost=bestDesign.productionCost(empire.empireID, loc) - troopersNeededForcing = max(0, int( min(0.99+ (currentTurn/20 - nAvailTroopTot)/max(2, prodTime-1), nMilitaryTot/3 -nTroopTot))) + troopersNeededForcing = max(0, int( min(0.99+ (currentTurn/20.0 - nAvailTroopTot)/max(2, prodTime-1), nMilitaryTot/3 -nTroopTot))) numShips=troopersNeededForcing perTurnCost = (float(prodCost) / prodTime) if troopersNeededForcing>0 and totalPP > 3*perTurnCost*queuedTroopShips: @@ -1603,6 +1612,7 @@ perTurnCost *= 2 retval = fo.issueEnqueueShipProductionOrder(bestDesignID, loc) if retval !=0: + prioritized = False print "adding %d new ship(s) at location %s to production queue: %s; per turn production cost %.1f"%(numShips, PlanetUtilsAI.planetNameIDs([loc]), bestDesign.name(True), perTurnCost) print "" if numShips>1: @@ -1624,7 +1634,10 @@ cost, time = empire.productionCostAndTime( elem ) leadingBlockPP += elem.blocksize *cost/time if leadingBlockPP > 0.5* totalPP or (militaryEmergency and thisPriority==EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_MILITARY ): + prioritized = True res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + if (not prioritized) and (priority == EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_INVASION): + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front print "" fo.updateProductionQueue() |
From: <dil...@us...> - 2013-12-22 21:27:55
|
Revision: 6579 http://sourceforge.net/p/freeorion/code/6579 Author: dilvish-fo Date: 2013-12-22 21:27:50 +0000 (Sun, 22 Dec 2013) Log Message: ----------- adjusted AI so that conc camps will not be built at AI capitol Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-12-22 18:42:24 UTC (rev 6578) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-12-22 21:27:50 UTC (rev 6579) @@ -1244,9 +1244,9 @@ print "Tried scrapping %s at planet %s, got result %d"%(bldName, planet.name, res) elif foAI.foAIstate.aggression>fo.aggression.typical and canBuildCamp and (tPop >= 36): checkedCamp=True - if (planet.focus== EnumsAI.AIFocusType.FOCUS_GROWTH) or ("COMPUTRONIUM_SPECIAL" in planet.specials): - #continue - pass # now that focus setting takes these into account, probably works ok to have conc camp + if (planet.focus== EnumsAI.AIFocusType.FOCUS_GROWTH) or ("COMPUTRONIUM_SPECIAL" in planet.specials) or (pid == capitolID): + continue + #pass # now that focus setting takes these into account, probably works ok to have conc camp, but let's not push it queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] if (cPop <0.95*tPop):# if verboseCamp: @@ -1271,6 +1271,9 @@ if res: queuedBldLocs.append(pid) res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + else: + #TODO: enable location condition reporting a la mapwnd BuildDesignatorWnd + print "Error enqueing Conc Camp despite bldType.canBeProduced(empire.empireID, pid) reporting ", canBuildCamp if verboseCamp: print "conc camp status at %s : checkedCamp: %s, builtCamp: %s"%( planet.name, canBuildCamp, builtCamp) |
From: <dil...@us...> - 2013-12-27 21:33:28
|
Revision: 6587 http://sourceforge.net/p/freeorion/code/6587 Author: dilvish-fo Date: 2013-12-27 21:33:21 +0000 (Fri, 27 Dec 2013) Log Message: ----------- added some caching of ship production costs for efficiency Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-12-27 20:38:28 UTC (rev 6586) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-12-27 21:33:21 UTC (rev 6587) @@ -15,6 +15,7 @@ import MilitaryAI bestMilRatingsHistory={} +design_cost_cache = { 0: { (-1, -1):0 } } #outer dict indexed by cur_turn (currently only one turn kept); inner dict indexed by (design_id, pid) shipTypeMap = { EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_EXPLORATION: EnumsAI.AIShipDesignTypes.explorationShip, EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_OUTPOST: EnumsAI.AIShipDesignTypes.outpostShip, EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_ORBITAL_OUTPOST: EnumsAI.AIShipDesignTypes.outpostBase, @@ -34,6 +35,20 @@ def dictFromMap(this_map): return dict( [ (el.key(), el.data() ) for el in this_map ] ) + +def get_design_cost(cur_turn, design, pid): + if cur_turn in design_cost_cache: + cost_cache = design_cost_cache[cur_turn] + else: + design_cost_cache.clear() + cost_cache = {} + design_cost_cache[cur_turn] = cost_cache + loc_invariant = True #TODO: check actual loc invariance of design cost + if loc_invariant: + loc = -1 + else: + loc = pid + return float( cost_cache.setdefault( (design.id, loc), design.productionCost(fo.empireID(), pid) ) )# float() so as to not return actual reference #get key routines declared for import by others before completing present imports, to avoid circularity problems def curBestMilShipRating(): @@ -98,6 +113,7 @@ empire = fo.getEmpire() empireID = empire.empireID capitolID = PlanetUtilsAI.getCapital() + cur_turn = fo.currentTurn() if loc is None: planetIDs = ColonisationAI.empireShipyards elif isinstance(loc, list): @@ -132,7 +148,7 @@ shipDesign = fo.getShipDesign(shipDesignID) if not shipDesign.productionLocationForEmpire(empireID, pid): continue - cost = shipDesign.productionCost(empireID, pid) + cost = get_design_cost(cur_turn, shipDesign, pid) nattacks = sum( designStats.get('attacks', {1:1}).keys() ) costRating = (designStats['attack'] * (designStats['structure'] + nattacks*designStats['shields']))/(max( 0.1, cost)) # TODO: improve shield treatment here if costRating < 0.1* bestCostRating: |
From: <dil...@us...> - 2014-01-12 18:09:44
|
Revision: 6632 http://sourceforge.net/p/freeorion/code/6632 Author: dilvish-fo Date: 2014-01-12 18:09:39 +0000 (Sun, 12 Jan 2014) Log Message: ----------- corrects some AI overproduction of shipyards Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2014-01-11 23:40:59 UTC (rev 6631) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2014-01-12 18:09:39 UTC (rev 6632) @@ -798,7 +798,7 @@ topPilotSystems={} for pid, rating in ColonisationAI.pilotRatings.items() : - if rating < ColonisationAI.curMidPilotRating: + if rating <= ColonisationAI.curMidPilotRating: continue topPilotSystems.setdefault( universe.getPlanet(pid).systemID, [] ).append( (pid, rating) ) if (pid in queuedShipyardLocs ) or not bldType.canBeProduced(empire.empireID, pid) : @@ -808,10 +808,10 @@ if res: queuedShipyardLocs.append(pid) res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front - print "Requeueing Acirema BLD_SHIPYARD_BASE to front of build queue, with result %d"%(res) + print "Requeueing BLD_SHIPYARD_BASE to front of build queue, with result %d"%(res) popCtrs = list(AIstate.popCtrIDs) - enrgyShipyardLocs=[] + enrgyShipyardLocs={} for bldName in [ "BLD_SHIPYARD_ENRG_COMP" ]: if empire.buildingTypeAvailable(bldName) and (bldgExpense<bldgRatio*totalPP) and ( totalPP >200 or currentTurn > 150 ): queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] @@ -821,8 +821,11 @@ break if colonySystems.get(pid, -1) not in ( AIstate.empireStars.get(fo.starType.blackHole, []) + AIstate.empireStars.get(fo.starType.blue, []) ): continue - enrgyShipyardLocs.append(pid) - if pid not in queuedBldLocs and bldType.canBeProduced(empire.empireID, pid):#TODO: verify that canBeProduced() checks for prexistence of a barring building + this_planet = universe.getPlanet(pid) + if not (this_planet and this_planet.speciesName in ColonisationAI.empireShipBuilders): #TODO: also check that not already one for this spec in this sys + continue + enrgyShipyardLocs.setdefault(this_planet.systemID, []).append(pid) + if pid not in queuedBldLocs and bldType.canBeProduced(empire.empireID, pid): res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) if res: @@ -836,7 +839,7 @@ bldName = "BLD_SHIPYARD_BASE" if empire.buildingTypeAvailable(bldName) and (bldgExpense<bldgRatio*totalPP) and ( totalPP >50 or currentTurn > 80 ): bldType = fo.getBuildingType(bldName) - for pid in enrgyShipyardLocs: + for sys_id, pid in enrgyShipyardLocs.items(): #Todo ensure only one or 2 per sys if pid not in queuedShipyardLocs and bldType.canBeProduced(empire.empireID, pid):#TODO: verify that canBeProduced() checks for prexistence of a barring building res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) @@ -846,6 +849,7 @@ bldgExpense += cost/time # productionQueue[productionQueue.size -1].blocksize * res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front print "Requeueing %s to front of build queue, with result %d"%(bldName, res) + break #only start one per turn for bldName in [ "BLD_SHIPYARD_ORG_ORB_INC" , "BLD_SHIPYARD_ORG_XENO_FAC" ]: if empire.buildingTypeAvailable(bldName) and (bldgExpense<bldgRatio*totalPP) and ( totalPP >40 or currentTurn > 40 ): @@ -1356,11 +1360,17 @@ if empire.buildingTypeAvailable(bldName): bldType = fo.getBuildingType(bldName) queued_locs = [element.locationID for element in productionQueue if (element.name==bldName) ] + queued_sys = [] + for pid in queued_locs: + dd_planet = universe.getPlanet(pid) + if dd_planet: + queued_sys.append(dd_planet.systemID) drydock_locs={} - drydock_locs.update([(sys_id, True) for sys_id in queued_locs + list(ColonisationAI.empire_dry_docks)]) - max_dock_builds = int(0.5 + empire.productionPoints/80) + drydock_locs.update([(sys_id, True) for sys_id in queued_sys + list(ColonisationAI.empire_dry_docks)]) + max_dock_builds = int(0.5 + empire.productionPoints/80.0) for sys_id, pids in ColonisationAI.empireSpeciesSystems.items(): #TODO: sort/prioritize in some fashion if len(queued_locs)>= max_dock_builds: + print "Drydock enqueing halted with %d of max %d"%( len(queued_locs) , max_dock_builds ) break if sys_id in drydock_locs: continue @@ -1375,6 +1385,8 @@ print "Requeueing %s to front of build queue, with result %d"%(bldName, res) queued_locs.append( planet.systemID ) break + else: + print "Error failed enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, planet.name, res) bldName = "BLD_EVACUATION" bldType = fo.getBuildingType(bldName) |
From: <dil...@us...> - 2015-02-18 05:58:31
|
Revision: 7959 http://sourceforge.net/p/freeorion/code/7959 Author: dilvish-fo Date: 2015-02-18 05:58:23 +0000 (Wed, 18 Feb 2015) Log Message: ----------- corrected python interface example use Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2015-02-18 05:46:42 UTC (rev 7958) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2015-02-18 05:58:23 UTC (rev 7959) @@ -350,7 +350,7 @@ #testhull = fo.getHullType("SH_BASIC_MEDIUM") #print "testhull: %s, structure: %.1f ; stealth: %.1f ; slots: %s" % (testhull.name, testhull.structure, testhull.stealth, [slot.name for slot in testhull.slots]) #testpart = fo.getPartType(srb2%4) - #print "testpart: %s, class: %s ; capacity: %.1f ; slottypes: %s" % (testpart.partClass.name, testpart.name, testpart.capacity, [slot.name for slot in testpart.mountableSlotTypes]) + #print "testpart: %s, class: %s ; capacity: %.1f ; slottypes: %s" % (testpart.name, testpart.partClass.name, testpart.capacity, [slot.name for slot in testpart.mountableSlotTypes]) if foAI.foAIstate.aggression in [fo.aggression.beginner, fo.aggression.turtle]: maxEM= 8 |
From: <dil...@us...> - 2015-03-13 15:42:11
|
Revision: 8031 http://sourceforge.net/p/freeorion/code/8031 Author: dilvish-fo Date: 2015-03-13 15:42:04 +0000 (Fri, 13 Mar 2015) Log Message: ----------- Added explanatory comments regarding the getBestShipRatings() rating & selection approach Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2015-03-13 13:51:43 UTC (rev 8030) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2015-03-13 15:42:04 UTC (rev 8031) @@ -190,6 +190,18 @@ if not locDetail: return [] locDetail.sort(reverse=True) + + # Since we haven't yet implemented a way to target military ship construction at/near particular locations + # where they are most in need, we want to distribute the construction across the Resource Group, preferentially choosing + # the best rated design/loc combo, but if there are multiple design/loc combos with the same or similar ratings then + # we want some chance of choosing those alternate designs/locations. + + # The approach to this taken below is to treat the ratings akin to an energy to be used in a statistic mechanics type + # partition function. 'tally' will compute the normalization constant. + # so first go through and calculate the tally as well as convert each individual contribution to + # the running total up to that point, to facilitate later sampling. Then those running totals are + # renormalized by the final tally, so that a later random number selector in the range [0,1) can be + # used to select the chosen design/loc tally = 0 idx = 0 for detail in locDetail: |
From: <dil...@us...> - 2015-03-13 15:49:34
|
Revision: 8032 http://sourceforge.net/p/freeorion/code/8032 Author: dilvish-fo Date: 2015-03-13 15:49:31 +0000 (Fri, 13 Mar 2015) Log Message: ----------- slight augmentation of the commentary added in r8031 Revision Links: -------------- http://sourceforge.net/p/freeorion/code/8031 Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2015-03-13 15:42:04 UTC (rev 8031) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2015-03-13 15:49:31 UTC (rev 8032) @@ -192,7 +192,8 @@ locDetail.sort(reverse=True) # Since we haven't yet implemented a way to target military ship construction at/near particular locations - # where they are most in need, we want to distribute the construction across the Resource Group, preferentially choosing + # where they are most in need, and also because our rating system is presumably useful-but-not-perfect, we want to + # distribute the construction across the Resource Group and across similarly rated designs, preferentially choosing # the best rated design/loc combo, but if there are multiple design/loc combos with the same or similar ratings then # we want some chance of choosing those alternate designs/locations. |