添付ソースコード

package jp.nora.economics.labor;
import java.util.ArrayList;
import java.util.Iterator;
public class SlaveMaster {
	public class Slave {
		long wallet;
		Slave(){
			init();
		}
		String name(){
			return getClass().getSimpleName();
		}
		void init(){
			wallet = 10000;
		}
		boolean spend(){
			wallet -= 3000;
			return wallet < 0;
		}
		long bid(int day){
			return 5000;
		}
		void getPayment(int day){
			wallet += bid(day);
		}
		void recoverPayment(int day){
			wallet -= bid(day);
		}
		long getWallet(){
			return wallet;
		}
	}
	public class Slave2 extends Slave {
		long bid(int day){
			return 3000;
		}
	}
	public class King extends Slave {
       long bid(int day){
          if ( day <= 4 && check(day)  ){
             return 1;
          } else if ( day <= 4 ) {
             return 500;
          } else {
             return 3000;
        }
       }
              boolean check(int day){
                 long diff = 12500-2500*day;
                 return wallet < diff; 	
              }
	}
	public class Nora extends Slave {
		ArrayList<Integer> c;
		void init(){
			super.init();
			c = new ArrayList<Integer>();
		}
		long bid(int day){
			while (c.size()<=day){
				int v = (int)(Math.random()*5000)+1;
				c.add(new Integer(v));
			}
			return c.get(day-1);
		}
	}
	ArrayList<Slave> slaves;
	void init(){
		slaves = new ArrayList<Slave>();
		slaves.add(new Slave()); // and so on. many instances
		slaves.add(new Slave2());
		slaves.add(new King());
		slaves.add(new Nora());
	}
	void print(int day){
		System.out.println("-----");
		for(Slave s:slaves){
			System.out.print(s.name());
			System.out.print(" ");
			System.out.print(s.bid(day));
			System.out.print(" ");
			System.out.println(s.getWallet());
		}
	}
	void selection(int day){
		Slave max = null;
		for (Slave s:slaves){
			if ( max == null )
				max = s;
			if ( max.bid(day) < s.bid(day)){
				max = s;
			}
			s.getPayment(day);
		}
		max.recoverPayment(day);
	}
	boolean spendAll(){
		boolean flag = false;
		for(Slave s:slaves){
			flag |= s.spend();
		}
		return flag;
	}
	void dead(){
		Iterator<Slave> i = slaves.iterator();
		while ( i.hasNext()){
			Slave s = i.next();
			if ( s.getWallet() < 0 ) {
				System.out.println(s.name()+":dead");
				i.remove();
			}
		}
	}
	public static void main(String args[]){
		SlaveMaster  sm = new SlaveMaster();
		sm.init();
		sm.run();
	}
	public void run(){
		while (slaves.size()> 1){
			oneTrial();
			reset();
		}
	}
	void reset(){
		for(Slave s:slaves){
			s.init();
		}
	}
	public void oneTrial(){
		int day = 1;
		while ( true){
			print(day);
			selection(day);
			if ( spendAll()){
				dead(); 
				return;
			}
			day++;
		}
	}
}

アルゴリズム合成

以上の結論を踏まえると多数のプレイヤーがいるときは、のんきものを装い、1:1になったら牙をむき出すようなアルゴリズムが強いと思います。
ただ、コードを書き直すのが面倒くさいので、ファーザースタディということにして、皆さんにインプリをお任せしましょうw。

のんきものの性質

ただ、0−5000の一様分布処理なので、1日あたり500円ずつ損をしていく感じ。である以上寿命は20日以内。割と結構厳しい。
ただ、Slave2よりは、アルゴリズムとして強い。
1000-5000なら、Slave2と同等だが、乱数のばらつきでやはりSlave2よりは短命だと思う。しかし、この程度の分布だと、1:1最強を駆逐する力は弱そうではある。

のんびり生きましょう

ということで、結論はいかがでしたでしょうか。
あんまり効率効率意って、本当の効率下げてるとつぶれちゃいますね。
おおらかなほうが生き残れる環境もあるってことですね。
ではでは。

簡単な解決法 運を天にまかせる

ということで、ラフな解決アルゴリズムは、1−5000をランダムに入札し、仕事にあぶれたらお休みするような、そういうのんきなアルゴリズムが実は天敵になる。
この場合、1:1最強アルゴリズム系列が同時に2以上存在するなら、そいつらは、1:1のときまで生き残ってはいれず、より前に淘汰することになる。
1:1最強アルゴリズムがひとつしか入ってなくても、例えば10人ののんきものが生息していれば、結構勝負になる可能性が高い。
ただ、結果がランダムにふれるため実験結果もゆれることになる。

ArrayList c;
void init(){
    super.init();
    c = new ArrayList<long>();
}
int bid(int day){
    while ( c.size()<=day )
        c.setAt(day-1,(int)(java.Math.rand()*5000)+1);
    }
    return c.getAt(day-1);
}

dayによる定数化が必要なので、こういうキャッシュ化処理を行って、定数メモを返すインプリにしてみた。

1:nで強いアルゴリズムについて考察

1:1で強いアルゴリズムは提示した。
問題はこれには弱点があるということで、4日の間一回でも失敗すると、自爆テロを起こすので自滅しやすいのが性質だからだ。
とはいえ定数系応答のプログラムで、N:Nで戦う状況だとこれに勝つアルゴリズムを求めるのは非常に難しい。