import%20marimo%0A%0A__generated_with%20%3D%20%220.14.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20os%0A%20%20%20%20import%20pathlib%0A%20%20%20%20from%20typing%20import%20Self%0A%20%20%20%20import%20pydantic%0A%20%20%20%20import%20networkx%20as%20nx%0A%20%20%20%20from%20ortools.sat.python%20import%20cp_model%0A%20%20%20%20return%20Self%2C%20cp_model%2C%20nx%2C%20os%2C%20pathlib%2C%20pydantic%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%20%E3%82%B7%E3%83%95%E3%83%88%E6%9C%80%E9%81%A9%E5%8C%96%E5%95%8F%E9%A1%8C%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20%E5%95%8F%E9%A1%8C%E8%A8%AD%E5%AE%9A%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%E5%90%84%E3%82%B8%E3%83%A7%E3%83%96%E3%81%AF%E4%BA%88%E3%82%81%E5%AE%9F%E8%A1%8C%E6%99%82%E9%96%93%E3%81%8C%E4%B8%8E%E3%81%88%E3%82%89%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B.%20%0A%20%20%20%20%E3%81%9D%E3%81%AE%E4%B8%8A%E3%81%A7%E4%BD%9C%E6%A5%AD%E5%93%A1%E3%82%92%E5%90%84%E3%82%B8%E3%83%A7%E3%83%96%E3%81%AB%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%2C%20%E5%90%8C%E3%81%98%E4%BD%9C%E6%A5%AD%E5%93%A1%E3%81%8C%E5%90%8C%E4%B8%80%E6%99%82%E5%88%BB%E3%81%AB%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%87%A6%E7%90%86%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%23%20%E5%AE%9A%E6%95%B0%0A%0A%20%20%20%20-%20%24J%24%3A%20%E3%82%B8%E3%83%A7%E3%83%96%E3%81%AE%E9%9B%86%E5%90%88%0A%20%20%20%20-%20%24W%24%3A%20%E4%BD%9C%E6%A5%AD%E5%93%A1%E3%81%AE%E9%9B%86%E5%90%88%0A%20%20%20%20-%20%24b_w%24%3A%20%E4%BD%9C%E6%A5%AD%E5%93%A1%20%24w%24%20%E3%81%AE%E5%9B%BA%E5%AE%9A%E8%B2%BB%E7%94%A8%0A%20%20%20%20-%20%24s_j%2C%20f_j%24%3A%20%E3%82%B8%E3%83%A7%E3%83%96%20%24j%24%20%E3%81%AE%E9%96%8B%E5%A7%8B%E6%99%82%E5%88%BB%E3%81%A8%E7%B5%82%E4%BA%86%E6%99%82%E5%88%BB%0A%20%20%20%20-%20%24J_w%24%3A%20%E4%BD%9C%E6%A5%AD%E5%93%A1%20%24w%24%20%E3%81%8C%E9%81%82%E8%A1%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%B8%E3%83%A7%E3%83%96%E3%81%AE%E9%9B%86%E5%90%88%0A%20%20%20%20-%20%24W_j%24%3A%20%E3%82%B8%E3%83%A7%E3%83%96%20%24j%24%20%E3%82%92%E9%81%82%E8%A1%8C%E3%81%A7%E3%81%8D%E3%82%8B%E4%BD%9C%E6%A5%AD%E5%93%A1%E3%81%AE%E9%9B%86%E5%90%88%0A%20%20%20%20-%20%24G%20%3D%20(J%2C%20E)%24%3A%20%E3%82%B8%E3%83%A7%E3%83%96%E3%82%92%E7%82%B9%2C%20%E3%82%B8%E3%83%A7%E3%83%96%E3%81%AE%E4%BD%9C%E6%A5%AD%E6%99%82%E9%96%93%E3%81%AB%E9%87%8D%E3%81%AA%E3%82%8A%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E3%81%8D%E7%82%B9%E3%81%AE%E9%96%93%E3%81%AB%E7%B7%9A%E3%82%92%E5%BC%B5%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%82%B0%E3%83%A9%E3%83%95%0A%20%20%20%20-%20%24C%24%3A%20%E5%8C%BA%E9%96%93%E3%82%B0%E3%83%A9%E3%83%95%20%24G%24%20%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E6%A5%B5%E5%A4%A7%E3%82%AF%E3%83%AA%E3%83%BC%E3%82%AF%E3%81%AE%E9%9B%86%E5%90%88%0A%20%20%20%20-%20%24J_c%24%3A%20%E3%82%AF%E3%83%AA%E3%83%BC%E3%82%AF%20%24c%24%20%E3%81%AB%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B%E3%82%B8%E3%83%A7%E3%83%96%E3%81%AE%E9%9B%86%E5%90%88%0A%0A%20%20%20%20%23%23%23%20%E6%B1%BA%E5%AE%9A%E5%A4%89%E6%95%B0%0A%0A%20%20%20%20-%20%24x_%7Bjw%7D%20%5Cin%20%5C%7B%200%2C%201%20%5C%7D%24%3A%20%E3%82%B8%E3%83%A7%E3%83%96%20%24j%24%20%E3%81%AB%E4%BD%9C%E6%A5%AD%E5%93%A1%20%24w%24%20%E3%82%92%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%82%8B%E6%99%82%20%241%24%2C%20%E3%81%9D%E3%82%8C%E4%BB%A5%E5%A4%96%E3%81%AE%E3%81%A8%E3%81%8D%20%240%24.%20%0A%20%20%20%20-%20%24y_w%20%5Cin%20%5C%7B%200%2C%201%20%5C%7D%24%3A%20%E4%BD%9C%E6%A5%AD%E5%93%A1%20%24w%24%20%E3%81%8C%E4%BD%BF%E3%82%8F%E3%82%8C%E3%82%8B%E3%81%A8%E3%81%8D%20%241%24%2C%20%E3%81%9D%E3%82%8C%E4%BB%A5%E5%A4%96%E3%81%AE%E3%81%A8%E3%81%8D%20%240%24.%20%0A%0A%20%20%20%20%23%23%23%20%E5%88%B6%E7%B4%84%E6%9D%A1%E4%BB%B6%0A%0A%20%20%20%20-%20%24%5Csum_%7Bw%20%5Cin%20W%7D%20x_%7Bjw%7D%20%3D%201%20%5Cquad%20(%5Cforall%20j%20%5Cin%20J)%24%3A%20%E5%90%84%E3%82%B8%E3%83%A7%E3%83%96%E3%81%AF%201%20%E4%BA%BA%E3%81%AE%E4%BD%9C%E6%A5%AD%E5%93%A1%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E5%BF%85%E3%81%9A%E9%81%82%E8%A1%8C%E3%81%95%E3%82%8C%E3%82%8B.%20%0A%20%20%20%20-%20%24%5Csum_%7Bj%20%5Cin%20J_c%20%5Ccap%20J_w%7D%20x_%7Bjw%7D%20%5Cleq%20y_w%20%5Cquad%20(%5Cforall%20w%20%5Cin%20W%2C%20%5Cspace%20%5Cforall%20c%20%5Cin%20C)%24%3A%20%E5%90%84%E4%BD%9C%E6%A5%AD%E5%93%A1%E3%81%AF%E5%90%8C%E6%99%82%E3%81%AB%202%20%E3%81%A4%E4%BB%A5%E4%B8%8A%E3%81%AE%E3%82%B8%E3%83%A7%E3%83%96%E3%82%92%E5%87%A6%E7%90%86%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84.%20%0A%0A%20%20%20%20%23%23%23%20%E7%9B%AE%E7%9A%84%E9%96%A2%E6%95%B0%0A%0A%20%20%20%20-%20%24%5Cmin%20%5Csum_%7Bw%20%5Cin%20W%7D%20b_w%20y_w%24%3A%20%E4%BD%9C%E6%A5%AD%E5%93%A1%E3%81%AE%E5%9B%BA%E5%AE%9A%E8%B2%BB%E7%94%A8%E3%81%AE%E7%B7%8F%E5%92%8C%E3%82%92%E6%9C%80%E5%B0%8F%E5%8C%96%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(os%2C%20pathlib)%3A%0A%20%20%20%20current_dir%20%3D%20pathlib.Path(os.path.dirname(__file__))%0A%20%20%20%20data_dir%20%3D%20current_dir%20%2F%20%22data%22%20%2F%20%22ptask%22%0A%20%20%20%20return%20(data_dir%2C)%0A%0A%0A%40app.cell%0Adef%20_(data_dir)%3A%0A%20%20%20%20fname1%20%3D%20data_dir%20%2F%20%22data_10_51_111_66.dat%22%0A%0A%20%20%20%20with%20open(fname1)%20as%20f%3A%0A%20%20%20%20%20%20%20%20_lines%20%3D%20f.readlines()%0A%0A%20%20%20%20_lines%0A%20%20%20%20return%20(fname1%2C)%0A%0A%0A%40app.cell%0Adef%20_(Self%2C%20pydantic)%3A%0A%20%20%20%20class%20Job(pydantic.BaseModel)%3A%0A%20%20%20%20%20%20%20%20model_config%20%3D%20pydantic.ConfigDict(frozen%3DTrue)%0A%0A%20%20%20%20%20%20%20%20start%3A%20int%0A%20%20%20%20%20%20%20%20finish%3A%20int%0A%0A%20%20%20%20%20%20%20%20def%20intersect_with(self%2C%20other%3A%20Self)%20-%3E%20bool%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20self.start%20%3C%3D%20other.start%20and%20self.finish%20%3E%20other.start%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20True%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20other.start%20%3C%3D%20self.start%20and%20other.finish%20%3E%20self.start%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20True%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20False%0A%20%20%20%20return%20(Job%2C)%0A%0A%0A%40app.cell%0Adef%20_(pydantic)%3A%0A%20%20%20%20class%20Worker(pydantic.BaseModel)%3A%0A%20%20%20%20%20%20%20%20model_config%20%3D%20pydantic.ConfigDict(frozen%3DTrue)%0A%0A%20%20%20%20%20%20%20%20cost%3A%20int%0A%20%20%20%20%20%20%20%20jobs%3A%20list%5Bint%5D%0A%20%20%20%20return%20(Worker%2C)%0A%0A%0A%40app.cell%0Adef%20_(Job%2C%20Self%2C%20Worker%2C%20os%2C%20pydantic)%3A%0A%20%20%20%20class%20Condition(pydantic.BaseModel)%3A%0A%20%20%20%20%20%20%20%20model_config%20%3D%20pydantic.ConfigDict(frozen%3DTrue)%0A%0A%20%20%20%20%20%20%20%20jobs%3A%20list%5BJob%5D%0A%20%20%20%20%20%20%20%20workers%3A%20list%5BWorker%5D%0A%0A%20%20%20%20%20%20%20%20%40staticmethod%0A%20%20%20%20%20%20%20%20def%20from_file(path%3A%20str%20%7C%20os.PathLike)%20-%3E%20Self%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20jobs%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20workers%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20with%20open(path)%20as%20f%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lines%20%3D%20f.readlines()%0A%20%20%20%20%20%20%20%20%20%20%20%20idx%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20num_jobs%20%3D%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20while%20idx%20%3C%20len(lines)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20line%20%3D%20lines%5Bidx%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20line.startswith(%22Jobs%20%3D%20%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20num_jobs%3A%20int%20%3D%20int(line.split()%5B2%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%7Bnum_jobs%3D%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20_%20in%20range(num_jobs)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20idx%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20line%20%3D%20lines%5Bidx%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20start%2C%20finish%20%3D%20line.strip().split()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jobs.append(Job(start%3Dstart%2C%20finish%3Dfinish))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20line.startswith(%22Qualifications%20%3D%20%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20num_workers%3A%20int%20%3D%20int(line.split()%5B2%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%7Bnum_workers%3D%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20_%20in%20range(num_workers)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20idx%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20line%20%3D%20lines%5Bidx%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bw%2C%20jw%20%3D%20line.strip().split(%22%3A%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20workers.append(Worker(cost%3Dbw%2C%20jobs%3Djw.strip().split()))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20idx%20%2B%3D%201%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Condition(jobs%3Djobs%2C%20workers%3Dworkers)%0A%20%20%20%20return%20(Condition%2C)%0A%0A%0A%40app.cell%0Adef%20_(Condition%2C%20fname1)%3A%0A%20%20%20%20cond1%20%3D%20Condition.from_file(fname1)%0A%20%20%20%20return%20(cond1%2C)%0A%0A%0A%40app.cell%0Adef%20_(Condition%2C%20cp_model%2C%20nx)%3A%0A%20%20%20%20class%20Model%3A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20cond%3A%20Condition)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E5%AE%9A%E7%BE%A9%0A%20%20%20%20%20%20%20%20%20%20%20%20g%20%3D%20nx.Graph()%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20id_job1%2C%20job1%20in%20enumerate(cond.jobs)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20id_job2%2C%20job2%20in%20enumerate(cond.jobs)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20id_job2%20%3C%3D%20id_job1%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20job1.intersect_with(job2)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20g.add_edge(id_job1%2C%20id_job2)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E3%82%AF%E3%83%AA%E3%83%BC%E3%82%AF%E3%81%AE%E5%88%97%E6%8C%99%0A%20%20%20%20%20%20%20%20%20%20%20%20cliques%20%3D%20%5Bset(c)%20for%20c%20in%20nx.find_cliques(g)%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20model%20%3D%20cp_model.CpModel()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20%5B%5Bmodel.new_bool_var(%22%22)%20for%20_%20in%20cond.workers%5D%20for%20_%20in%20cond.jobs%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20y%20%3D%20%5Bmodel.new_bool_var(%22%22)%20for%20_%20in%20cond.workers%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20x%20%E3%81%A8%20y%20%E3%81%AE%E9%96%A2%E4%BF%82%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20idw%2C%20worker%20in%20enumerate(cond.workers)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20model.add_max_equality(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y%5Bidw%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Bx%5Bidj%5D%5Bidw%5D%20for%20idj%2C%20_%20in%20enumerate(cond.jobs)%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20worker%20%E3%81%94%E3%81%A8%E3%81%AB%E6%8B%85%E5%BD%93%E3%81%A7%E3%81%8D%E3%82%8B%20job%20%E3%81%AF%E3%81%8D%E3%81%BE%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20idj%2C%20job%20in%20enumerate(cond.jobs)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20idw%2C%20worker%20in%20enumerate(cond.workers)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20idj%20not%20in%20worker.jobs%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20model.add(x%5Bidj%5D%5Bidw%5D%20%3D%3D%200)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%90%84%20job%20%E3%81%AF%201%20%E4%BA%BA%E3%81%AE%20worker%20%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E5%87%A6%E7%90%86%E3%81%95%E3%82%8C%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20idj%2C%20_%20in%20enumerate(cond.jobs)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20model.add_exactly_one(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Bx%5Bidj%5D%5Bidw%5D%20for%20idw%2C%20_%20in%20enumerate(cond.workers)%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%90%8C%E4%B8%80%E3%82%AF%E3%83%AA%E3%83%BC%E3%82%AF%E3%81%AB%E5%B1%9E%E3%81%99%E3%82%8B%20job%20%E3%81%AF%E5%90%8C%E3%81%98%20worker%20%E3%81%A7%E5%87%A6%E7%90%86%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20clique%20in%20cliques%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20idw%2C%20worker%20in%20enumerate(cond.workers)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20model.add_at_most_one(%5Bx%5Bidj%5D%5Bidw%5D%20for%20idj%20in%20clique%5D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20model.minimize(%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%20%20%20%20sum(%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%20%20%20%20%20%20%20%20y%5Bidw%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%20%20%20%20%20%20%20%20for%20idw%2C%20_%20in%20enumerate(cond.workers)%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%A7%A3%E8%AA%AC%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%A7%E3%81%AF%20worker%20%E6%95%B0%E3%82%92%E6%9C%80%E5%B0%8F%E5%8C%96%E3%81%97%E3%81%A6%E3%81%84%E3%81%9F%E3%81%8C%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20worker%20%E3%81%AE%E3%82%B3%E3%82%B9%E3%83%88%E8%BE%BC%E3%81%A7%E6%9C%80%E5%B0%8F%E5%8C%96%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%84.%0A%20%20%20%20%20%20%20%20%20%20%20%20model.minimize(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sum(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y%5Bidw%5D%20*%20worker.cost%20for%20idw%2C%20worker%20in%20enumerate(cond.workers)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.model%20%3D%20model%0A%20%20%20%20%20%20%20%20%20%20%20%20self.x%20%3D%20x%0A%20%20%20%20%20%20%20%20%20%20%20%20self.y%20%3D%20y%0A%20%20%20%20%20%20%20%20%20%20%20%20self.cliques%20%3D%20cliques%0A%0A%20%20%20%20%20%20%20%20def%20solve(self%2C%20timeout%3A%20int%20%3D%2010)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.solver%20%3D%20cp_model.CpSolver()%0A%20%20%20%20%20%20%20%20%20%20%20%20self.solver.parameters.log_search_progress%20%3D%20True%0A%20%20%20%20%20%20%20%20%20%20%20%20self.solver.parameters.max_time_in_seconds%20%3D%20timeout%0A%20%20%20%20%20%20%20%20%20%20%20%20self.status%20%3D%20self.solver.solve(self.model)%0A%20%20%20%20return%20(Model%2C)%0A%0A%0A%40app.cell%0Adef%20_(Model%2C%20cond1%2C%20mo)%3A%0A%20%20%20%20model1%20%3D%20Model(cond1)%0A%20%20%20%20model1.solve()%0A%0A%20%20%20%20mo.md(f%22Optimal%20Value%20%3D%20%7Bmodel1.solver.objective_value%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Condition%2C%20data_dir)%3A%0A%20%20%20%20fname2%20%3D%20data_dir%20%2F%20%22data_40_138_360_33.dat%22%0A%20%20%20%20cond2%20%3D%20Condition.from_file(fname2)%0A%20%20%20%20return%20(cond2%2C)%0A%0A%0A%40app.cell%0Adef%20_(Model%2C%20cond2%2C%20mo)%3A%0A%20%20%20%20model2%20%3D%20Model(cond2)%0A%20%20%20%20model2.solve(timeout%3D60)%0A%0A%20%20%20%20mo.md(f%22Optimal%20Value%20%3D%20%7Bmodel2.solver.objective_value%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
fea307a9fbb388d9cef336d219cf40c1462637e94479be117966f40279e56b18